マイコンプログラムは初心者レベルです。
RX64MでCAN通信をしていますが、不可解な現象があり悩んでいます。
一応、下記の対応で改善はされたのですが、改善された理由がいまいち明確でないので、詳しい方のご意見をお伺いしたく投稿しました。
※e2studioでFITドライバを使用しています。(GCCコンパイラ、RX-CCどちらも同じ現象)
<プログラムの概要>
①メインループで受信メッセージBOXを監視して、データがあれば読み込み
while(1)
{
status = R_CAN_RxPoll(ch, mbox); if (status == R_CAN_OK) { //受信データあり status = R_CAN_RxRead(ch, mbox, frame_p); if (status == R_CAN_OK) { //受信データ読み出しOK } }
}
②CMTタイマー割込み(2ms)の関数内で、送信
R_CAN_TxSet(ch, mbox, dataframe, DATA_FRAME);
<現象>
①で受信データがないにも関わらず、「//受信データあり」になってしまう。
※不定期のタイミング(数ミリ秒~数秒)で受信ありになる場合がある。
※受信データは、この処理以前に受信していた最後のデータになっている。
<対応>
R_CAN_RxPoll()実行中に、②の割り込みが発生してしまい、受信有りのレジスタがおかしくなった(?)と考え、割込みでは送信フラグをONするだけにし、
メインループで送信フラグONのときに送信するようにした。→R_CAN_RxPoll()中にR_CAN_TxSet()が発生しないように。。
if (send_flg)
send_flg = 0; }
love0510さん、こんにちは。NoMaYです。CANのことは分からないのですが、どういう訳か気になって、ソースコードとAPIドキュメントを読んでみました。そして、気になったのが、あたかも近藤科学のサーボモータの単線UART通信のように(あるいはRS485(だったかな)の単線UART通信のように)、CAN APIは以下の手順で使われることを想定されて設計されているのではないかなぁ、という点です。(1) 送信モードに切り替える → 送信する(2) 受信モードに切り替える → 受信する(2') 受信モードに切り替える → ポーリングする → 受信するこのイメージがCAN APIと1対1対応では無さそうなので説明し難いのですが、うまくいかないというケースでは上の手順に適合していないのが原因なのではないでしょうか?逆に、うまくいくケースでは上の手順に適合していたからだったのではないでしょうか?例えば、割り込みがどうのこうのではなく、メインループで以下のシーケンスでCAN APIを呼び出した場合でもうまくいかないのではないでしょうか?受信ポーリング → 受信データあり → 送信 → 受信データ読み出し → NGそんな気がしたのです、、、