DMACAを利用したSCI 非同期通信で、2回目の受信ができません

お世話になっております。B.Ishiiと申します。

FITモジュールのDMACAを利用したSCI 非同期通信で、2回目の受信ができず、悩んでいます。
恐らく、私の使い方が間違っているのだと思うのですが、ご助言いただけるとありがたいです。

状況といたしまして、
・1回目の受信はできます
・送信側はDMACAを使ってうまく動作しています
・DMACAを利用しない設定では受信できます(下記のソースコードとは別のもので確認しました)

ソースコードは、以下のような感じです。
(とりあえず動作を見たいため、エラーハンドリングはしていません)

 char cpRecvData[sizeof("ABCDE")] = {0}; // "ABCDE"が送信されることは分かっている

while (1)
{
sci_err_t stSciErr = R_SCI_Receive(stSciHdl, (uint8_t *)cpRecvData, sizeof(cpRecvData));

if (stSciErr == SCI_SUCCESS)
{
break;
}

vTaskDelay(pdMS_TO_TICKS(1));
}

while (1)
{
dmaca_stat_t dmac_status;

dmaca_return_t ret =
R_DMACA_Control(DMACA_CH1, DMACA_CMD_STATUS_GET, &dmac_status);
if (ret == DMACA_SUCCESS && dmac_status.dtif_stat == true)
{
break;
}

vTaskDelay(pdMS_TO_TICKS(1));
}

デバッガで調べたところ、2回目の受信で、R_SCI_Receive()ループは抜けるのですが、R_DMACA_Control()ループは、dmac_status.dtif_stat == trueにならず、抜けられません。
cpRecvDataへの"ABCDE"格納もされていません。

■環境
・RX72N
・FreeRTOS(with IoT Libraries)
 Ver. afr-v202012.00-rx-1.0.1
・r_dmaca_rx
 Ver. 2.90
・r_sci_rx
 Ver. 4.40

Parents
  • この書き込みは私の開発にとってタイムリーなので注視させていただきます。

    RS485通信をするのにSCIを使っています。RS485トランシーバーのREピンはアサートしている(GNDに落としている)ので受信信号に自分の送信データが常時受信されるようにしてあります。現在、DEをネゲートするタイミングは受信割り込みで受信数を数えてやっているもののネゲートするタイミングが割り込みハンドラ起動の遅延でギリギリ間に合わない時があるからDTCを使って受信割り込み発生後DTCを使ってDEピンを操作するためにPODRレジスタを書き換えられないか?というアイデアを保留している状態です。

  • 他の割り込みが多くなるとタイミング違反のためにエラーが発生するのでアイデアを実現しました。RXI駆動でDTCをチェイン動作させて1つ目の転送でPODRを操作してDEを途中でネゲート、2つ目の転送でRDRを受信バッファにコピーし、指定の回数実行で割り込みハンドラに飛んで受信後の処理をすることで規定されたタイミングに収まるようになりました、。

Reply
  • 他の割り込みが多くなるとタイミング違反のためにエラーが発生するのでアイデアを実現しました。RXI駆動でDTCをチェイン動作させて1つ目の転送でPODRを操作してDEを途中でネゲート、2つ目の転送でRDRを受信バッファにコピーし、指定の回数実行で割り込みハンドラに飛んで受信後の処理をすることで規定されたタイミングに収まるようになりました、。

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

    DTC便利ですよね。こういう機能はSTM32/LPC/Kinetis/SAM/MSP432等のCortex-Mマイコンにもあるのでしょうか?(それとも、多重割り込みとDMAがあれば、こんな機能はそもそも要らない?)

  • 今回の要件では送信完了後、DEを下げるタイミングの都合DTCが必須だと思って取り組みました(データシートには0.5usと、割り込み駆動ではわずかに遅れる時が忙しさによって発生します)。ただ、一緒に動作するステッピングドライバ IC向けのパルス出力がなぜかDTCを使っている場合、パルス出力に使用するGTPW0タイマ(GTPW0のコンペアマッチ割り込みにて1msタスクでパルス列バッファを作成して、割り込みのたびに新しいパルス周波数をセットする)が2パルス目を以降パルスを出さなくなるという症状で半日格闘した末、DTC使用を諦めるという結果に・・・内部で1msタスク(EtherCATの処理)と0.1msタスク(BLDC用の速度サーボ処理)が走っているがこちらは影響がないみたい。もう、納品まで時間がないので1ms周期からSCIを使う通信を割り込み駆動でキックして、0.1msタスクで成功するまでリトライをすることで次の1msタスクで新しいデータを取得するという実装としました。DTCを使った場合、RS485+BLDCは大丈夫でしたが、RS485+BLDC+STEPPERやRS485+STEPPERだとSTEPPERがちゃんと動かない。なおBLDCは120度通電でホール ICの信号でICUの両エッジ割り込みが発生して三相の出力変更、ホール ICのパターンをベースにした速度計算、Duty変更をしています。

    おそらくDTCの使い方、間違いがあったんだろうと思いますが、いかんせん時間がない。あとDTC動作に0x800という結構馬鹿にならないヒープ領域を使う必要がるし・・・もう3日欲しい。

    他のマイコンでDTCみたいなものはわかりません。DMACみたいな1つの転送後、割り込みみたいなものが殆どだと思います。チェイン動作ってのは特殊だなと思います。私の今での用途だとタッチパネルの画像データを一括で描画RAMから送り出すのにDMAしたくらいで今回みたいにGPIOの出力変更+受信データの引き抜きみたいなことは初めてでした。