RX64MのCAN通信

マイコンプログラムは初心者レベルです。

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()が発生しないように。。

 

while(1)

{

 if (send_flg)

 {

  R_CAN_TxSet(ch, mbox, dataframe, DATA_FRAME);

  send_flg = 0;
 }

 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
  }
 }

 

}

 

 

 

Parents
  • ★補足します
    受信処理中は割り込み禁止にした場合でも、改善されました。
    ただ、頻繁にR_BSP_InterruptsDisable();、R_BSP_InterruptsEnable();を繰返す事はあまりよくないのでしょうか?
    それとも全く問題ない、当たり前の事でしょうか?

     R_BSP_InterruptsDisable();

     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
      }
     }

     R_BSP_InterruptsEnable();
Reply
  • ★補足します
    受信処理中は割り込み禁止にした場合でも、改善されました。
    ただ、頻繁にR_BSP_InterruptsDisable();、R_BSP_InterruptsEnable();を繰返す事はあまりよくないのでしょうか?
    それとも全く問題ない、当たり前の事でしょうか?

     R_BSP_InterruptsDisable();

     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
      }
     }

     R_BSP_InterruptsEnable();
Children
No Data