【備忘録】STM32FマイコンボードのSPIのハードウェアNSSの使い方
チップセレクト(CS)を自動で制御したい
STM32F103FC8T6でSPI通信をしようとすると多くのウェブサイトでは任意のGPIO端子をチップセレクト(CS)として使う設定にしているが、STM32のSPIにはNSSという、CSとして使うためのピンが割り当てられている。
GPIOをCSとして使うと、演算時間の都合なのかGPIO制御とSPI通信の間にSPIクロックの数十~数百倍周期の遅延が生じることがあるので、もしNSSピンを使えばその問題が改善するのではないかと思い使い方を調べ、動かしたかが分かったので備忘録を残す。
SPIの有効化、そしてプルアップ抵抗が必要
CubeMXでNSSピンをHardware outに設定しただけだとSPI通信をしていてもいなくてもNSSピンはLowに張り付いている。しかし、レファランスマニュアルを見る限り設定方法は間違っていない。にもかかわらずピンがLowに張り付いている理由は二つだ。
NSSはSPI通信の有効無効に追従する
SPI無効でもハイの出力にはならず、プルアップが必要
以上の情報から、試しにNSSをプルアップしてからSPIの有効化無効化を繰り返してみたところ、NSSピンが動くことが確認できた。
__HAL_SPI_DISABLE(&hspi2); // SPI1を使う場合は&hspi1
HAL_Delay(1000);
__HAL_SPI_ENABLE(&hspi2);
HAL_Delay(1000);
データの送受信がなくてもSPIが有効になっている限りNSSピンはLowになるので、自動CSとして使うにはSPIの有効無効をデータ送受信の前後に挟まなければならず、GPIO制御と遅延時間は変わらない。その上プルアップ抵抗まで必要になるので何一つメリットがない。ほかの人たちがそうしているように、NSSピンはdisableにしてpush-pull出力のGPIOとして使った方が無難そうだ。