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 を組み合わせたサンプルコードは見付けられませんでした。

 

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

  • ji1101さん、こんにちは。NoMaYと申します。

    私は マスタモード かつ (FITではなく)コード生成機能 でしか RSPI+DTC/DMA を触ったことがないですが、SPDRレジスタのアクセス幅設定が、RSPI側での設定とDTC/DMA側での設定で、違う設定になっていて誤動作している可能性はないかな?と気になりました。或いは、DTC/DMA側の設定が、32ビット幅でもなく、16ビット幅でもなく、8ビット幅アクセスの設定になっていたり、とかです。

    と、ここまで書いて気になって、FITのRSPIモジュールのドキュメントのR_RSPI_Open()の説明を見るとSPDRレジスタのアクセス幅を設定するパラメータがありませんね。R_RSPI_WriteRead()の説明を見るとspcmd_command_wordのRSPI_SPCMD_BIT_LENGTH_XXから自動設定されるのかな?とも一度は思いましたが、SPDRレジスタのアクセス幅は、もっと根っこの方の設定のような気がして、ドキュメントを検索してみました。

    そうしたら、以下の記載が見付かりました。このアクセス幅が原因だったりしないでしょうか?

    RX ファミリRSPI モジュールFirmware Integration Technology
    www.renesas.com/jp/ja/search/keyword-search.html#genre=document&q=r01an1827
    r01an1827jj0200-rx.pdf
    表 1-1 RSPI API関数一覧

    注1:RSPI制御の高速化のために、SPDRレジスタを32ビットアクセスします。

    画面コピー

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

    その後、どうでしょうか?オーバーランエラーは解消出来るようになったでしょうか?それとも、解消出来なくて、SPDRレジスタのアクセス幅は原因ではなかった、という状況でしょうか?

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

    返信を頂いて、あーあれか、と気になっていたのですが、体調不良で確認出来ず、申し訳ありませんでした。

    先ほど、確認致しました。
    具体的には、 DTC の FIT の設定で、
      data_size = DTC_DATA_SIZE_WORD; // 16bit ずつ転送
    を、
      data_size = DTC_DATA_SIZE_LWORD; // 32bit ずつ転送
    にしたところ、確かに DTC が起動し、転送されることを確認しました。

    転送元の配列に細工しないと 16bit ずつ歯抜けで転送されてしまいますが、これで RSPI + DTC を FIT で実現することができそうです。

    ありがとうございました。
  • 申し訳ありません、もう少し確認したところ、まだ以下の問題があり、送受信が実現できておりませんでした。

    先ず、 NoMaY さんご指摘の通り、アクセス幅を合わせないといけないというのは正しいです。アクセス幅を合わせる事で、送信側 DTC が起動し、 16 bit (1 word) ずつの送信がオシロで確認出来ました。

    しかし、受信側の DTC が起動しておりません。
    さらに、最初の 1 word 送受信をした段階で、 RSPI 受信完了の割り込み(RSPI FIT の rspi_spri0_isr)が呼ばれてしまいます。
    送信側の同様の関数(rspi_spri0_isr)は、当該(rspi_spri0_isr)を空関数にし、受信側の DTC を無効にし、エラー検知を無効にして確認したところ、指定回数の DTC 転送後に初めて呼ばれます。(送信データもオシロで確認し、正しいです。)なお、エラーはオーバランエラーです。

    (RSPI FIT モジュールで DTC 転送に指定した場合、)
    DTC FIT モジュール側の設定で、
      response_interrupt = DTC_INTERRUPT_AFTER_ALL_COMPLETE;
    としているので、指定回数の転送後に isr 到達が正しい動作だと思います。

    このような用途(RSPI, 16bit の送受信)では、 DTC を送受信同時に用いることができないのでしょうか?
  • 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ボード単体でも確認出来そうな気がして来ましたので、こちらでもやってみようかと思ったからです。

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

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

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

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

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

    その後、どうでしょうか?ルネサスさんのサポートからサンプルコードは届いたでしょうか?実は、別スレッド『DTCを用いたRSPI通信時の割り込みについて』に(FITではなく)コード生成機能でマスタモード+ループバックモード+RSPI+送信DTC or 受信DTCを試したプログラムを投稿したことがあるのですが、試しに、そのプログラムから送受信ともDTCのプログラムを作成してみました。スレーブモードではなくマスタモードであるという点はありますが、マイコンとしては(つまりFITではないが少なくともコード生成機能では)期待した通りに動作しました。

    以下の画面コピーの通り、送受信とも、DTCEは1→0になっていますし、転送カウンタも3→0になっており、かつ、ループバックで送受信したデータも期待通りになっていました。参考程度ですが(FITではなくコード生成機能なので参考にもならないかも、とも思いますが)、以下にプロジェクトのファイル一式 (RX65N TBボード、CS+プロジェクト(rcpeファイル同梱))を添付しました。

    issue_20190725.zip

  • NoMaY さん、お世話になっております。
    長らく気にかけて頂き、恐縮です。

    本日午後、ルネサスサポートさんからの返信はございましたが、サンプルコードは用意がありません、とのことでした。
    未検証のコード改造案を提示されましたが、既に検証して失敗していたものと等価で、あまり参考にはなりませんでした。

    サポートさんからの返信を待っている間に DTC FIT モジュールではなく、 DMAC FIT モジュールを利用したところ、アッサリと送受信できてしまいまして、本来の目的自体は達せられた状況です。
    つまり、 RSPI から(送受信とも)転送の起動要因は出ているわけで、なぜ DTC だと受信側の転送が為されないのかはよく分かりませんでした。

    モヤモヤとした感じが残ってはおりますけれども、 SPDR のアクセス幅不整合を教えて頂き、 DMAC の利用ではありますが、目的を達することができました。

    ありがとうございました。