Elec

STM32 HALのSPIはSSを都度制御しないの?

← ポチっていただけると嬉しいです

STM32マイコンでSPIデバイスを制御しようと画策しています。

SPI接続はシンプルに4線(SS/SCLK/MOSI/MISO)で、STMマイコンがマスター。

STM32CubeIDEを入れてピン設定をして始めました。
超久々のマイコンいじりです。

で、HALライブラリです。ググりながら、例えばSPIの送信だとこんな感じでいけるはず。

uint8_t spi_tx_data[] = { 0x40, 0x33, 0x5f, 0x00 };
uint8_t spi_update[] = { 0x0e};

HAL_SPI_Transmit( &hspi1, spi_tx_data , sizeof(spi_tx_data) , 10);
HAL_SPI_Transmit( &hspi1, spi_update , sizeof(spi_update) , 10);

でも何も動かない。

仕方ないんで波形見てみたらSSが落ちっぱなし。
このデバイスは設定した後最後にupdateコマンドを入れないと反映されないデバイス。
そのためにはいったんSSを上げてやる必要がある。

それが2度のSPIアクセスの間には上がってないみたい。なんでーーー

HAL_SPI_TransmitってSSの上げ下げを勝手にやってくれるものかと思ってたんですが、どうやら違うみたい。
いつSSが落ちてるのかまでは調べなかったけど、動いているようには見えなかった。。。
でもまぁどうりでググってもみなSSをGPOに設定しているんでそういう使い方ってことか?

なので、SSピンをGPOに設定して自分で上げ下げ。

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Transmit( &hspi1, spi_tx_data , sizeof(spi_tx_data) , 10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Transmit( &hspi1, spi_update , sizeof(spi_update) , 10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

と、することで無事動作。

って書くと短いですが、実際は結構かかりました。

 

ってことは、SPIのSSピンとして設定する意味はどこにあるんだ?

って疑問です。

コメント

タイトルとURLをコピーしました