CAN通信におけるエラーの原因と解決策について

初めまして、NNNです。初投稿で至らぬ点等あるかと存じますが、ご容赦ください。

初歩的な内容で大変恐縮ですが、CAN通信の試験をしていて、うまくいかない原因を探っています。
私としてはACKエラーが出ていると考えていますが、その原因と解決策についてご教授いただけませんか。

使用基板:Renesas SynergyのスターターキットSK-S7G2
参考にしているサンプル
 ① CAN_HAL_MG_AP.zip
   r11an0065eu0101-synergy-can-hal-mod-guide.pdf
 ② GUIX_Basic_SK_S7G2.zip
 ※GUIXも使用したいため、①のコードを②へ移し使用しています。

【現状】
①SK-S7G2へ同じプログラムを書き込み通信試験を行いました。
 →オシロスコープにて3つのID全て波形が出ることと、
  受信側基板のLEDが光ることを確認しました。
②SK-S7G2とリチウムバッテリーとの通信試験を行いました。
 →IDが1で、ACKスロットがリセッシブになっている波形が、再送され続けております。

【バッテリーのプロトコル】
・CAN2.0インタフェース
・11bitアドレス
・ボーレート:250kbps
・3つのCANIDを送信することが必要
 ① CANID 0x0001
   Data 0~8byte (無視される)
 ② CANID 0x0002
   Data 最大256byte ※今回送りたいデータは8byte
 ③ CANID 0x0003
   Data 0~8byte (無視される)

【SynergyConfigurationの設定】
 BRP:14
 TS1:10 Time Quanta
 TS2:5 Time Quanta
 SJW:4 Time Quanta
 Clock Source:PCLKB (Clocksタブにて、PCLKB Div/4 → PCLKB 60MHz)
 Standard or Ectended ID Mode:Standard ID Mode
 Mailbox 0 Tyoe:Transmit Mailbox
 Mailbox 1 Tyoe:Transmit Mailbox
 Mailbox 2 Tyoe:Transmit Mailbox
 Mailbox Frame Type: (全て)Data Mailbox
 Mailbox 0-3 Group Mask: 0x1FFFFFFF
 Priority 4

【ソースの主な変更点】can_tx_rx.c
if (sw4pin == IOPORT_LEVEL_LOW)  //If switch S4 is pressed the execute transmission
        {
            can_liBattery_start(); //Call to CAN transmit function
            tx_thread_sleep(10);
            can_liBattery_data();
            tx_thread_sleep(10);
            can_liBattery_end();
            tx_thread_sleep(10);
        }

void can_liBattery_start()
{
    tx_data[0]= 0x00;
    tx_data[1]= 0x00;
    ・・・
    tx_data[7]= 0x00;
    tx_id = 0x0001;
    can_tx(tx_id, tx_data,1);
}

void can_liBattery_data()
{
    tx_data[0]= 0xEA;
    ・・・
    tx_data[7]= 0xF5;
    tx_id = 0x0002;
    can_tx(tx_id, tx_data,8);
}

void can_liBattery_end()
{
    tx_data[0]= 0x00;
    ・・・
    tx_data[7]= 0x00;
    tx_id = 0x0003;
    can_tx(tx_id, tx_data,1);
}

長文になりましたが、何卒お力をお貸しいただけますよう、よろしくお願いいたします。

Parents
  • kijo様

    ご返信いただきありがとうございます。
    ・SK-S7G2を2台用いて通信を行ったところ、
     ID1~3の全てについて正しくデータが受信できていることを確認しております。
     (書き忘れてしまいましたが、受信したフレームのIDとデータについては
     LCDへの表示でも確認しております。)
    ・送信側がACKエラーで再送を繰り返していると考えております。

    2. ターミネータについて、(バッテリとの試験を行っている基板のみですが)
     R119に120Ωを実装して、試験を行っております。

    また、試験を続けている際にモードの設定を特に変更していないことに気がつきましたので、
    ①内部ループバック(CAN_MODE_LOOPBACK_INTERNAL)に設定し、
     SK-S7G2を1台で試験したところ、受信データはID3のみとなりました。
    ②通常(CAN_MODE_NORMAL)に設定し、ID3→ID2→ID1の順にセットして
     バッテリーとの通信試験を行いましたが
     ID3のデータを再送繰り返すような状態で、進展はありませんでした。
     (下記の順に呼び出すように変更しました。)
    can_liBattery_end();
    can_liBattery_data();
    can_liBattery_start();

    以上、よろしくお願いいたします。
Reply
  • kijo様

    ご返信いただきありがとうございます。
    ・SK-S7G2を2台用いて通信を行ったところ、
     ID1~3の全てについて正しくデータが受信できていることを確認しております。
     (書き忘れてしまいましたが、受信したフレームのIDとデータについては
     LCDへの表示でも確認しております。)
    ・送信側がACKエラーで再送を繰り返していると考えております。

    2. ターミネータについて、(バッテリとの試験を行っている基板のみですが)
     R119に120Ωを実装して、試験を行っております。

    また、試験を続けている際にモードの設定を特に変更していないことに気がつきましたので、
    ①内部ループバック(CAN_MODE_LOOPBACK_INTERNAL)に設定し、
     SK-S7G2を1台で試験したところ、受信データはID3のみとなりました。
    ②通常(CAN_MODE_NORMAL)に設定し、ID3→ID2→ID1の順にセットして
     バッテリーとの通信試験を行いましたが
     ID3のデータを再送繰り返すような状態で、進展はありませんでした。
     (下記の順に呼び出すように変更しました。)
    can_liBattery_end();
    can_liBattery_data();
    can_liBattery_start();

    以上、よろしくお願いいたします。
Children
  • ルネサスのCAN入門書(RJJ05B0937-0100/Rev.1.00)の6.CANプロトコルの6.2データフレームの(6)ACKフィールドからカット&ペーストします。

    1.正しいメッセージを受信した受信ユニットは、ACKスロットでドミナントビットを送り正常受信の完了を送信ユニットに知らせます。これを"ACK を送る"、または"ACK を返す"といいます。

    2.ACK を返すのは、バスオフ状態でもスリープ状態でもないすべての受信ユニットのうち、正常なメッセージを受信したユニットだけです(送信ユニットはACKを送りません)。バス上に送信ユニットの他に受信可能なユニットが存在しない場合はACK は返りません。通信を成立させるためには、バス上に送信ユニットの他に受信可能なユニットが少なくとも1つは必要です。またバス上に複数の受信可能なユニットが存在する場合、正常にメッセージを受け取ったユニットがどれか1つでもあればACK は返ることになります。


    これらから、バス上にSK-S7G2とリチウムバッテリーユニットのみでそれぞれが120Ωのターミネータを1個づつ搭載していて、SK-S7G2から送信したデータフレームのACKスロットがオシロスコープでドミナントでなくリセッシブなら、リチウムバッテリーユニットがACKを返していない、または、無効なACKを返していることになります。SK-S7G2の不具合ではなく、リチウムバッテリーユニットまたはバスの不具合と予想されます。オシロスコープでもACKが検知できないのだからSK-S7G2が再送することは正しいと思われます。
  • kijo様

    ありがとうございます。

    先ほど試験をしていて、モードの設定を変更したところ、
    SK-S7G2同士でもうまくデータが送られなくなってしまいました。

    上記症状を解決してもバッテリの方だと動かない場合、
    バッテリーユニットやバス側の不具合をあたってみようと思います。