RX651 で RSPI + DTC による全二重クロック同期式通信

お世話になっております。

 

マイコン:RX651

環境:CS+

 

FIT モジュールを用いて、 RSPI + DTC で、次のような通信を実装しようとしています。

・ 全二重、クロック同期式、スレーブ動作

・ 16bit ずつ

 

以下は上手くできました。

・ SCI + DTC (ただし SCI なので 8bit ずつ)

・ RSPI (16bit ずつソフトウェア転送)

しかし、 RSPI と DTC (or DMAC) を組み合わせた場合、 DTC が起動せず、直ちにオーバランエラーが発生します。

(コードは、 FIT の RSPI, DTC アプリケーションノートを参考にしました。)

RSPI のアプリケーションノートに依れば可能らしいのですが、 DTC (or DMAC) と RSPI を組み合わせたサンプルコードは見付けられませんでした。

 

お知恵を拝借できれば幸いです。

Parents
  • ji1101さん、こんにちは。NoMaYです。

    RDP V1.19のDTCモジュールのソース(r_dtc_rx.c)を見てみましたが、特にRSPIを特別扱いしている箇所はありませんでしたので、RXマイコンのDTCの仕組み的にRSPIの送信が出来て受信が出来ないことは無い筈です。レジスタ的には、送信側割り込みのDTCEビットが1なら送信側がDTC転送されますし、受信側割り込みのDTCEビットも1なら受信側もDTC転送される筈です。

    そこで、考えてみたのですが、R_RSPI_WriteRead()もしくはR_RSPI_Read()の呼び出しの直前に受信側割り込みのDTCEビットが1になっているか確認してみてはどうでしょうか?(RDP V1.19のRSPIモジュールのソース(r_rspi_rx.c)を見てみましたが、これらの関数内でDTCEビットを操作している箇所は無さそうでした。)

    そして、受信側割り込みのDTCEビットが0のままであれば、受信側のDTC設定時に設定関数からエラーが返されていないか確認したり、逆にDTCEビットが1であれば、受信側のDTC設定自体に誤りが無いか(といってもDTC_INTERRUPT_AFTER_ALL_COMPLETE設定済みなら転送カウントを1に設定してしまっていることしか思い浮かびませんが)確認したり、してみてはどうでしょうか?

    [追記]

    それから、該当箇所(RSPI設定,DTCのRSPI送信設定,DTCのRSPI受信設定)のソースを見せて頂くことは可能でしょうか?(もし現象再現プロジェクトを作成済みの場合はFITのドキュメントを除いた残り(添付ファイルサイズ制限回避の為)のファイル一式をzipファイルに固めて添付して頂くか、そうでなければコンパイルエラーが出ないように切り貼りされたCソース(FITのヘッダファイルは当方で用意します)をzipファイル(インデントが消失するのを防ぐ為)に固めて添付して頂ければと思います。見せて頂くことが可能なら、ですが。) たぶん、マスタモードかつループバックモードでも再現するのではないかと思われ、私の手元のRX65N TBボード単体でも確認出来そうな気がして来ましたので、こちらでもやってみようかと思ったからです。

Reply
  • ji1101さん、こんにちは。NoMaYです。

    RDP V1.19のDTCモジュールのソース(r_dtc_rx.c)を見てみましたが、特にRSPIを特別扱いしている箇所はありませんでしたので、RXマイコンのDTCの仕組み的にRSPIの送信が出来て受信が出来ないことは無い筈です。レジスタ的には、送信側割り込みのDTCEビットが1なら送信側がDTC転送されますし、受信側割り込みのDTCEビットも1なら受信側もDTC転送される筈です。

    そこで、考えてみたのですが、R_RSPI_WriteRead()もしくはR_RSPI_Read()の呼び出しの直前に受信側割り込みのDTCEビットが1になっているか確認してみてはどうでしょうか?(RDP V1.19のRSPIモジュールのソース(r_rspi_rx.c)を見てみましたが、これらの関数内でDTCEビットを操作している箇所は無さそうでした。)

    そして、受信側割り込みのDTCEビットが0のままであれば、受信側のDTC設定時に設定関数からエラーが返されていないか確認したり、逆にDTCEビットが1であれば、受信側のDTC設定自体に誤りが無いか(といってもDTC_INTERRUPT_AFTER_ALL_COMPLETE設定済みなら転送カウントを1に設定してしまっていることしか思い浮かびませんが)確認したり、してみてはどうでしょうか?

    [追記]

    それから、該当箇所(RSPI設定,DTCのRSPI送信設定,DTCのRSPI受信設定)のソースを見せて頂くことは可能でしょうか?(もし現象再現プロジェクトを作成済みの場合はFITのドキュメントを除いた残り(添付ファイルサイズ制限回避の為)のファイル一式をzipファイルに固めて添付して頂くか、そうでなければコンパイルエラーが出ないように切り貼りされたCソース(FITのヘッダファイルは当方で用意します)をzipファイル(インデントが消失するのを防ぐ為)に固めて添付して頂ければと思います。見せて頂くことが可能なら、ですが。) たぶん、マスタモードかつループバックモードでも再現するのではないかと思われ、私の手元のRX65N TBボード単体でも確認出来そうな気がして来ましたので、こちらでもやってみようかと思ったからです。

Children
  • NoMaY さん、お世話になっております。

    申し訳ございません、ソースコードの添付はできません。

    >R_RSPI_WriteRead()もしくはR_RSPI_Read()の呼び出しの直前に受信側割り込みのDTCEビットが1になっているか
    なっておりました。

    また、 FIT の RSPI, DTC の各関数について確認致しましたが、何れも DTC_SUCCESS or RSPI_SUCCESS を応答しており、正常判定です。
    (尤も、アクセス幅が異なっていて通信できなかった頃から、各関数は全て SUCCESS を返してきております。)
    転送回数も、変数ではなく、直接数字を設定して確認しております。

    ルネサスのサポートに RSPI + DTC + FIT で、 16bit のクロック同期式全二重通信を行っているサンプルコードがないか問い合わせているところです。