« モーター到着 | トップページ | DS18B20 »

2014年1月11日 (土)

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は今後こうなっていくのかな。

しかし、まさかなあ...という感じ。

| |

« モーター到着 | トップページ | DS18B20 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: STM32F3のSPI:

« モーター到着 | トップページ | DS18B20 »