Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

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

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

  • 「受信側基板のLEDが光ることを確認」は、受信側が正しくデータを受信できているとの事でしょうか?
    「ACKスロットがリセッシブになっている波形が、再送され続けております」は送信側がACKエラーで再送を繰り返しているとの事でしょうか?

    かなりのいい加減な予想になってしまうのですが、
    1.本当にACKが無い。バスが切れている。
    2.物理層が不適切でACKのタイミングが合わない。SK-S7G2のマニュアルでターミネータが60Ωになっているのが少し気になります。規格ではなるべく離れたユニット2台にのみ120Ωを挿入する事になっているはずです。
    ではないでしょうか?いずれにしても受信側が正しくデータを受信できているならこれは誤りです。
  • 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();

    以上、よろしくお願いいたします。
  • In reply to NNN:

    ルネサスの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が再送することは正しいと思われます。
  • In reply to kijo:

    kijo様

    ありがとうございます。

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

    上記症状を解決してもバッテリの方だと動かない場合、
    バッテリーユニットやバス側の不具合をあたってみようと思います。
  • こんにちは、NNNです。
    上記の件、未だ行き詰っておりますので、現状を報告させてください。

    ①現時点で、前回までに載せていました、SK-S7G2基板同士でもID3しか受け取れない件は、
    メールボックスの設定を
     Mailbox 0 Tyoe:Transmit Mailbox
     Mailbox 1 Tyoe:Receive Mailbox
     Mailbox 2 Tyoe:Receive Mailbox
     ・・・以降全てReceive Mailbox
    とすることで解消されましたので、ここにループバックの設定等は関係ありませんでした。
    混乱する情報を載せてしまい申し訳ありません。

    ②バッテリーに関し、メーカー製のソフトウェアと専用を使用してのCAN通信が行えることを確認しておりますので、全く通信できないという線は薄いように思われます。
    ※手元にそのソフトと基板があるのでデータを再現することは難しいです。


    受信ユニットが送信したACKを送信側がACKを受け取れずエラーと判断しているとしたら、
    私がバッテリーに、設定を合わせられていない可能性も考えているのですが、
    下記の場合、メールボックスの設定はどのようになっているのが正しいのでしょうか。

    ○ 送信側:CANID1~3を送信 → 受信側:CANID1~3を送信


    【現状のconfigの設定】
     Channel : 0
     OverWrite Mode

     Mailbox 0 ID : 0
     Mailbox 1 ID : 1
     ・・・

     Mailbox 0 Tyoe : Transmit Mailbox
     Mailbox 1 Tyoe : Receive Mailbox
     ・・・以降すべてReceive

     Mailbox 0 Frame Tyoe : Data Mailbox
     Mailbox 1 Frame Tyoe : Data Mailbox
     ・・・

    ここの設定が誤っているのではないか?など、
    何か考えられる点がある方いらっしゃいましたら、お教えください。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page