STM32F3でのSPI通信

3年綱です。

以前、STM32F3マイコンでSPI通信しようとした時に詰まったので、対処方法を書いておきます。

 

STM32F3でSDカードを使うために、SPI通信を試みたところ、全く通信できませんでした。

他のマイコン(STM32F1やSTM32F4)で動作しているプログラムから移植したもので、原因が全くわかりませんでした。

調べたところ、SPI通信の受信完了を示す「RXNE(RX Not Empty)」フラグが立たず、通信が完了していませんでした。このフラグを無視し、タイミング決め打ちで通信してみると、通信できました。

 

リファレンスマニュアルを読みながら原因を調べていくと、SPIのFIFOイベントの発生条件を決める「CR2_FRXTH」レジスタが、16bit通信で動作するように設定されていました。SDは8bit通信なので、FIFOイベントが発生せず、通信完了できなかったようです。

SPIの初期化時に、通信方式を選ぶのですが、そこではこのレジスタは変化しないようです。別の関数を使うか、レジスタを直接弄る必要があります。

「CR2_FRXTH」レジスタが0だと16bit、1だと8bitになります。

初期化直後に、

SPIMMC->CR2 |= SPI_CR2_FRXTH;

又は

SPI_RxFIFOThresholdConfig(SPIx, SPI_RxFIFOThreshold_QF);

と記述することで、8bitに設定できます。