2020年4月30日木曜日

STM32のmbed環境でSPIに使えるピンは?

STM32のペリフェラルピンはやや特殊で、SPIやI2Cみたいな特殊機能は特定の数種類のピンにのみリマップできます。さらにわかりにくいことに、SPIユニットが内部に1~4まであり、それぞれ繋がっているバスが違ったりします…

データシートを熟読しながらcubeMXでリソースを割り当てる覚悟があれば問題ないんですが、手っ取り早くSPIを使いたいときにどのピンを使っていいのかよくわからなくて困ります。

で、調べたところ、mbedのSPIライブラリで対応しているピンならどれでも、いちいち対応するユニット番号を覚えてなくてもSPIとして使うことができます。単に

SPI device(D4, D5, D3);

みたいに書くだけで、MOSIがD4, MISOがD5, ClockがD3として動きます。対応してないピンを指定するとエラーをUSBシリアルポートに吐いて止まります。じゃあどのピンなら対応しているのかというと、nucleoを買うと付いてくるピンアウト表(こんなの↓)を見て、SPI3_MISOとか書いてあるところなら対応しています。
とはいえSPIxのxのところはそのピンに割り当てるときにライブラリ内部で使われるSPIユニット番号を挿しているので、宣言時に与える3本のピンが全て同じユニット番号に属している範囲でしか割り当ては許されません。(SPI1_MISOとSPI2_MOSIを同じライブラリ宣言に突っ込んで使うようなことはできません)

あと、この図を見ていてわからないのはピン番号の記述方法でして、SPI2_MISOといった名前はカラフルな表にそう書かれていますが、mbedライブラリで宣言はされていません。(なんせ選択肢が複数ピンあるので宣言しようもない)
宣言されているのはD2,D3 (nucleoピン番号)とかPA_3, PA_4 (GPIO番号)なので、これらを使ってピンを指定します。


さらにわかりにくいことに、SPI_MISOとかSPI_MOSIというピンは宣言されています。それって何番ピンのことなのよ!と思いますが、それは各CPUのPinNames.hに記述されていいまして、STM32F446REならここを参照するとそれぞれPA_6, PA_7であると書かれています。
まあSPI1ユニットのデフォルト割り当てピンなので妥当ではありますが… 事情をよく知らない状態で参考にしたコードがこの記法のピン指定を使っていると、他のピンにリマップする方法がさっぱりわかりませんよね。


さらに!nucleo基板の落とし穴というのがあって、いくつかのピンは既に割り当てがあるので注意が必要です。マニュアルに書いてはありますが、ありがたいことにF446REについて日本語情報でまとめてくれている方がいます。
たとえばSPI1の割り当てなんて、LEDにかぶるわSWDにかぶるわで…まあ機能はするので気にしなくても最初は困らないんですが…

0 件のコメント:

コメントを投稿