sci_SPIについて

stlと申します。

簡易SPIの機能を使用しています。

通信の送信は、whileループで20ms毎に実行しています。LEDドライバと通信をしているのですが、下記のようにプログラムを書くとLEDがちらついたり動作が安定しませんでした。条件文のif(!spi_writing2)を削除すると動作が安定するようになりました。通信が終わるまで待ったほうが良いと思い条件文を書いていたのですが、条件文なしだとLEDドライバが上手く動作するのは、なぜでしょうか?

if(!spi_writing2)

{

spi_writing2 = true;
err = R_SCI_SPI_Write(&g_spi1_ctrl, send_data2, SEND_DATA_MAX2, SPI_BIT_WIDTH_8_BITS);

}

void sci_spi_callback2(spi_callback_args_t *p_args)
{

if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)
{
spi_writing2 = false;
}
}

Parents
  • わわいです

    基本的にSPI通信の終了を判定する必要はありません

    20msごとに起動を掛けるってだけでいいのでは。

    # まあそりゃ通信が20ms以上かかるってならそこらへん考慮する必要も出てきますが

  • わわいさん

    SPIの通信が完了しなかった場合のことは、考慮しなくても良いものなのでしょうか?

  • SPI通信(マスタ側)は原理上ですがUARTとかと違って、異常通信終了の判定などないのです(ただしものによってはパリティ判定付きとかあるのでそこは注意)。ただし、受信がある場合でAPIが非同期の場合(APIが通信終了を待たずに戻ってきて、完了時に割り込みが発生するタイプ)は、終了を待たないと受信バッファにデータが届かないので終了判定は場合によってしなくて良いという話。もちろん、受信データをもらってすぐに処理する必要がないなら、やはり、終了判定はいらないです。通信が確定時間後に終了するためですね。私的にはAPIの終了ステータス判定はちゃんとしたほうがいいと思う。

    「通信時間<通信周期」の関係なら20msごとに関数開始するときに必ず、前段の通信が終了しているので判定不要。もっと言えば、20ms経過後に完了してないのは「どうするの?」いわゆる通信エラーのタイムアウト処理ですね。入れないと永遠に止まった装置ですよ。 SPI通信でも応答メッセージがある場合は、それを解析して妥当か判断して妥当じゃない場合はエラーにしますね。特に通信が半二重のときや「問い合わせ→応答」形式の場合はタイムアウトの概念を入れとかないと。

  • SPI通信の場合は、基本的には終了判定は必要ないのですね。

    勉強になりました。

Reply Children
No Data