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に設定できます。