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ピンとして設定する意味はどこにあるんだ?
って疑問です。
コメント