SPI_EVENT_TRANSFER_COMPLETEと受信データ

はじめまして、y.komatsuと申します。

RA6E1でSCI_SPI_SLAVEを動作させようとしています。

受信バッファ(1byte)を設定したのち、SPI_EVENT_TRANSFER_COMPLETEをコールバックで捕捉し、

受信バッファ1byte)のデータをFIFOに保存しているのですが、データが入っていない(0x00)です。

ためしにSPI_MASTERで転送してみたのですが、同様にSPI_EVENT_TRANSFER_COMPLETE時点で

受信バッファにデータは入っていませんでした。

こういうものなのでしょうか?

if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event)

{

spi_busy = 0;

fifo_write(&fifo_rx, recv_data, 1);

R_SCI_SPI_WriteRead(&g_spi9_ctrl, send_data, recv_data, 1, SPI_BIT_WIDTH_8_BITS);

}

Parents
  • 動作モードはちゃんとスレーブになっていますか?
    https://renesas.github.io/fsp/group___s_c_i___s_p_i.html#ga061962640303cb50a61285212571a85a

    RAマイコンではSPIを使ったことがないですが、この資料を見ると動作モードはデフォルトでMasterになっているようです。

  • Shoji Yamamotoさん

    返信ありがとうございます。

    コンフィギュレータで設定しています。

  • ちゃんと動くらしいです。マニュアルを信用すればですが。

    ・スレーブモード時のSS 機能
    SCR.CKE[1:0]ビットを10b または11b にして、SPMR.MSS ビットを1 にすると、スレーブモードになります。SSn 端子入力がHigh のとき、MISOn 出力端子の状態はハイインピーダンスになり、SCKn 端子からのクロック入力は無視されます。SSn 端子入力がLow のとき、SCKn 端子からのクロック入力が有効になり、送信または受信動作が可能になります。送信または受信動作中にSSn 端子入力がLow からHigh に変化した場合、MISOn 出力端子の状態をハイインピーダンスにします。なお、内部的な送信または受信処理は、SCKn 端子から入力されるクロックレートで継続し、1 キャラクタ分の送受信が完了すると、動作が停止して、割り込み(SCIn_TXI、SCIn_RXI、SCIn_TEI のいずれか)が発生します。

  • RAがスレーブ動作で、MISO信号は出ているんでしょうか?

    だとすれば、SS信号はOK、ペリフェラルは反応していると考えてよくて、

    そこからわかることはデータバッファへの転送に失敗している(DTC?)

    な気がします。

  • ありがとうございます。MISO信号のおかげでミスがわかりました。はじめに外部クロック非同期SCI-UARTで動かそうとしていたので回路図にSCK9/TXD9/RXD9がありそこにSS9を追加してSCI-SPI Slaveで動かそうとしていました。TXD9/RXD9だとSCI-SPI Masterの場合で、SlaveだとTXD/RXDの方向が切り替わることを失念していたというよりは送信PINは送信PINのままだと思い込んでいました(uart_txd9_mosi9/uart_rxd9_miso9)。

    MISO信号といわれてようやくそこに気づきました。現状、SCI-SPI Slave動作で受信できています。DTCのユーザー側の記述は不要のようです。

  • ああ、逆にしてましたか。これはあるあるですね。


    RAではDTCコードがちゃんと生成されるのは良いですね。

    RXマイコンのスマートコンフィギュータは名前負けな感じ(あくまで私の個人的な感想)

  • あるあるですが、自分では気づかないものですね。

    RA6E1-FPGA間が UART x2 SPI x1からUART x1 SPI x2になりましたが、SPIのほうが速度でるので問題なしです。

    はじめてRA使っていますが、まだ使いこなせていないです。コンフィギュレータの出来がいいのは助かります。

  • 仕事の大半がEtherCATスレーブ開発絡みなため、ルネサスを使う場合はRX72Mがメインです。他社と比べるとインフィニオンのXMC4800の方はGCCが使えてMacOSでも自前のeclipse環境でライブラリのソースコード生成以外は開発がすんなりなのでRX72Mもそうなればなと。用途に合わせて選定していますが、XMC4800の方が開発環境の自由度はあるかなと思います。

    まだRAシリーズは使っていないですが、机の上にはRAマイコンボードがあるので時間を見てRAやりたいと思っています。RAなら統合開発環境レベルでLinuxもいけるのがいいですね。

  • RA6E1マイコンが安く手に入ったので使ってみたのですが、まだいろいろありそう。

    SPI受信が間に合っていないような…。データが歯抜けになっているような…。

    EtherCATとかいいですね。今はHDLCをやっているのでそういう新しい系もやってみたいです。

  • XMC4800を使った開発ではFPGAとSPIでお話しするようにしています。SPIを2CHを並行してデータの交換をしています。その開発はCPUがSPIマスタです。CRCチェックとは入れてます?

  • CRCはデータに付与されています。

    UARTとSPI両方で送るとSPIだけデータが足りてないですね。UARTは115200bpsなので余裕があるのかな。現状1byteずつ受信しているので間に合ってないのか 原因を探さないと。

  • 何もせずにCRCが付加されて、1バイト毎ということはCRC-1(パリティ)?
    SPIはチップセレクタの前と後ろにUART以上に待ち時間が発生するので一回の転送は複数バイト、それこそ32バイトとか64バイトにしてCRC16とかを最後に載せた方がいいと思います。私はそうやっています。6MHzのSCLK設定です。

Reply
  • 何もせずにCRCが付加されて、1バイト毎ということはCRC-1(パリティ)?
    SPIはチップセレクタの前と後ろにUART以上に待ち時間が発生するので一回の転送は複数バイト、それこそ32バイトとか64バイトにしてCRC16とかを最後に載せた方がいいと思います。私はそうやっています。6MHzのSCLK設定です。

Children
  • CRC16です。FPGAで受信したデータ(このデータにCRC16がある)を即時SPIで転送しています。転送長は不定です(任意のデータが来る)。RA6E1では受信バッファ1byteで動作させているのでそれが問題かなと。

    FPGAで全部受信して長さ確定させて一括送信すればいいのかもしれませんが悩みどころです。

  • 1バイトなのが原因でしょうね。ただ、現状を理解せずにNバイトにしてNを大きくしても抜けるものは抜けます。ここからは未確認で私の推測ですが、開発ツールが用意している送受信ライブラリコードの仕様として指定したバイト数の送受信が完了して割り込みハンドラにいる間のデータは無視されると思います(DTCを使っているのでそうなるはず)。1バイトの場合、送りつける側の装置にバイト間隔の待ち時間を設けて、その時間が割り込みハンドラ処理時間より大きくなる条件が必要です。それ以外でやるなら、スクラッチで直接ペリフェラルを操作するような自作ライブラリを作成して受信割り込みのたびに受信動作を止めないでFIFOバッファにデータをPUSHする作りを実現することになります(SPIのビットレートが速いとFIFO処理が間に合わなさそう・・・)。その際、データ抜けを避けるためにはFIFO操作をする割り込みハンドラは再優先度の割り込みレベルを設定する必要があります。

    そんなことをするよりもSPI一回の送受信のサイズは固定サイズで、ヘッダ情報としてそのデータの有効な部分が何バイトあるかを一緒に送りつければ、任意サイズデータの送受信になるのではと思います。その時にもSPI通信後に一定のタイムアウトを設けなければもちろんですがマイコン側の割り込みハンドラ処理中に送信が始まるようなデータ抜けの問題になります。1バイト単位で送るのにCRC16のデータの方が大きいのも無駄だと思います。

  • とりあえず FPGAで32バイトおくって30us待ちという感じで動くようにしました。

    受信割り込みを改造したほうが効率的な気がする。