STM32F3のSPI
しばらく前にハマったところ。
STM32F373でSPI。
割といままでと変わりないなあ、と油断していたら、8ビット長以下の通信を設定すると、なにやら訳のわからないデータを吐き出す。
9ビット長以上のデータだと問題ない。
うーん?
------
色々試したのは、STの用意しているSPIサンプルコードではなく、自分で書いたコードだったのだが。
どうにも行き詰ったので、公式のサンプルコードを参照してみる
と、F3だけは、なんだかSPIアクセスのライブラリが2種類ある。
なんじゃこりゃ。
データが8ビット以下とそれ以上で、別の関数が定義されている。
さっそく中身をあらためる。
なんと、データレジスタへのアクセス幅が替えてあるよ....
8ビット以下の場合は、データレジスタを8ビット幅でアクセスし、9ビット以上の場合は16ビット幅でアクセスしないと、うまく動かないようだ。
------
ヘッダーファイルには、ペリフェラルのデータレジスタは、unsigned shortで、定義されている。
8ビットデータ時に、この定義でそのまま使うと、なんだか変なデータ列が出て行ってしまう。
データのビット長はちゃんと指定していても、だ。
データレジスタのポインタを、unsigned char*にキャストした上でデータを書き込むと、うまく8ビットのデータが送受信されるようだ。
反則くさいやり方だが、公式ライブラリがそうやってるんだから、公式なやり方なんだろう。
データシートには、記載が無い......とは言い切れないような、微妙な記載があるにはあるような...
でもこれ、わかってないとちょっと気が付かないよ。
ヘッダーファイルに、16ビットで定義されていたら、それに従うよなあ。
そういや、昔のルネサスのH8とかのヘッダーファイルは、すべてのアクセス可能なサイズで定義されていたなあ。
structの中に、アクセス可能な全部の型で、union定義されていた。
------
F1,F2,F4のSPIペリフェラルは、それぞれはちょっとずつ仕様が違うけど、8ビットデータの送信のために、データレジスタに8ビットアクセスしないといけないのは、このF3だけだ。
また、F3内では、F373だけでなく、F372もF303も同じ動きをする。
F3の方が、F4よりも新しいシリーズってことなのかもしれない。
STM32のSPIは今後こうなっていくのかな。
しかし、まさかなあ...という感じ。
| 固定リンク | 0
コメント