はじめまして、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);
}
動作モードはちゃんとスレーブになっていますか?https://renesas.github.io/fsp/group___s_c_i___s_p_i.html#ga061962640303cb50a61285212571a85a
RAマイコンではSPIを使ったことがないですが、この資料を見ると動作モードはデフォルトでMasterになっているようです。
Shoji Yamamotoさん
返信ありがとうございます。
コンフィギュレータで設定しています。
DTCサポートとなっていますが、DTCの設定でSPIのイベントに連動して駆動する部分は記述済みでしょうか?RAでは未確認ですがRXマイコンでDTCを使う場合、結構な量のコードを書かないとダメなのとDTCの作業エリア確保でmallocのメモリ確保が必要なのでヒープサイズがそれなりに大きくする必要がありました。DTCサポートなしで単なる割り込み駆動によるバッファのソフトウェア書き写し動作で成功するような気がします。
Disableにしてみたのですが、下記がエラーとして出ました。DTCはないとだめなようです。
g_spi9 SPI (r_sci_spi): DTC support must be enabled to use DTC
たしかにDTCが問題かもしれません。
SCI_SPIのmasterのサンプルでは特にDTC何も設定していないように見えたのですが、何かあるのかもしれません。
DTCはペリフェラルとしてはよくできているのですが、設定が複雑でRX用のスマートコンフィギュータでは自分で転送設定を書かなければなりません(ライブラリだけ生成)。FSP版でもそれほどよくなっていると思えないのでそこに注意した方がいいと思いました。終了後割込みに入っているのでDTCの転送がすっぽ抜けているだけと思います。一度、生成コードをよく眺めてDTCの設定をしているコードがあるか見た方がいいです(と言ってもDTC未経験だと「どれ?」ってなる)。
>(と言ってもDTC未経験だと「どれ?」ってなる)
まさしく、いまこれです。DTCを解決させるか 別のペリフェラルを使用するかどちらが速くできるか考えています。
速度が20MHzくらい欲しい感じでしょうか?SPIの他だとクロック同期式モードのSCIを使うくらいでしょうね。SCIも試されて受信できないって書いてある件もDTC絡みだろうと・・・
SCIはDTCなしFIFO有効で使ってました。
FGPA ->115200bps 内部クロックだと受信できる
FGPA ->1Mbps 外部クロック(SCK:16MHz)だと受信できない(データが0x00)
クロック同期式モードはドライバがどれかわからず断念してSCI-SPIにいきました。
SCI SPI SLAVEからSPI MASTERに変更して、TX RXをFPGAで折り返したところ、送信データが受信できました。この場合DTCのコードが自動生成されている?という認識でいいのでしょうか
何とも言えません。RAのSPIは使ったことないので感覚的なコメントですが、マイコン全般的な話としてマスタは主体的に通信タイミングを決めれられるのに対してスレーブ動作だと非同期で処理が開始されるのでマスタはDTCなしでもライブラリがちゃんと動きそうな・・・
ところで先日載せていた開発ツールの設定画面ですとSPIはSCIのSPIモードのようですが、SCIのSPIモードってチップセレクト信号の制御ができなかった記憶がします。マスタならチップセレクト信号はソフト的にGPIOで駆動できるけど、スレーブだとうまく動かなさそうな・・・
ちゃんと動くらしいです。マニュアルを信用すればですが。
・スレーブモード時の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?)
な気がします。