RX621 拡張IDでのCAN通信

はじめまして ヨシオカと申します。

RXマイコンでCAN通信を学習しており、内部ループバックを使用してCANの送受信を行おうと考えています。

標準ID(11bit)での送受信は成功したのですが拡張ID(29bit)の送受信を試みたところ、受信メールボックスのSIDのビットは受信できているのですが、EIDは0となっております。

IDFMレジスタを2,送受信めーりボックスのIDEビットを1に設定すれば拡張IDでの送受信ができると認識していたのですが...

原因に心当たりがありましたら、いくつか挙げていただけると助かります。

以下プログラムの抜粋となります。

//CANコントローラ初期化

CAN0.CTLR.BIT.MBM = 0; // 通常メールボックス
CAN0.CTLR.BIT.IDFM = 2; // ミックスIDモード(29bit)
CAN0.CTLR.BIT.MLM = 0; // オーバライトモード
CAN0.CTLR.BIT.TPM = 0; // ID優先送信オード
CAN0.CTLR.BIT.TSRC = 0; //1:CANオペレーションモード
CAN0.CTLR.BIT.TSPS = 3; // タイムスタンプ・プリスケーラ 8ビット毎
CAN0.CTLR.BIT.SLPM = 0; // スリープモードでない
CAN0.CTLR.BIT.RBOC = 0; // バスオフ強制復帰 なにもしない

//送信メールボックス設定
CAN0.MB[mbn].ID.BIT.RTR = 0; // データフレーム
CAN0.MB[mbn].ID.BIT.IDE = 1; // 0:標準ID 1:拡張ID

CAN0.MB[mbn].ID.BIT.SID = 0x5FB; //IDの上位11bit
CAN0.MB[mbn].ID.BIT.EID = 0x30107; //IDの下位18bit

//受信メールボックス設定

CAN0.MCTL[mbn].BYTE = 0; // コントロールレジスタクリア
//マスクレジスタ設定---全ビット比較しない
for(i=0;i<8;i++)
{
CAN0.MKR[i].LONG = 0x00; //マスクレジスタ クリア
}
CAN0.MKIVLR = 0x00;
CAN0.MB[mbn].ID.BIT.RTR = 0; // データフレーム
CAN0.MB[mbn].ID.BIT.IDE = 1; // 拡張ID

  • ヨシオカさま ボーと眺めて今気づいた、通りすがりのNAKAといいます。

    少し前なので、解決されたでしょうか?

    RX621ではなく手持ちのRX630のCANで確認しました。

    レジスタの設定で標準IDから拡張IDに変更したのは、下記①★印部分だけです。

    下記②は動作確認画面です。

    RX621とRX630でCAN機能が違う場合はご容赦ください!

                記①

    CAN1.MB[CAN1_Tx_Mslot].ID.BIT.IDE = 1; //拡張IDセット ★
    CAN1.MB[CAN1_Rx_Mslot].ID.BIT.IDE = 1; //拡張IDセット ★
    CAN1.MB[CAN1_Tx_Mslot].ID.BIT.RTR = 0; //データフレーム送信要求
    CAN1.MB[CAN1_Rx_Mslot].ID.BIT.RTR = 0; //


    //割り込みの設定
    ICU.IPR[52].BIT.IPR = 10; //CAN1割込みプライオリティ 0:禁止 ~ 15:最高
    ICU.IER[0x06].BIT.IEN6 = 1; //RXM割り込み要求許可 IER_1A_IEN6 P357
    ICU.IER[0x06].BIT.IEN7 = 1; //TXM割り込み要求許可 IER_1A_IEN7 P357
    //RXF,TXFはFIFO割込み

    CAN1.CTLR.WORD = 0x00;
    CAN1.CTLR.BIT.CANM = 0; //CAN1オペレーション(動作)モードに変更
    while(CAN1.STR.BIT.RSTST){} //オペレーションになったか確認


    //メッセージBOX受信設定-
    while(CAN1.MCTL[CAN1_Rx_Mslot].BYTE != 0x00) //CANメッセージ制御レジスタが"00h"時のみMIER設定可能 P1330
    {
    CAN1.MCTL[CAN1_Rx_Mslot].BYTE = 0x00;
    }
    CAN1.MIER.BIT.MB30 = 1; //メールBOX割込み許可 MB30 受信
    CAN1.CTLR.BIT.IDFM = 2; //メールBOX はMIXIDフォーマット★
    CAN1.MCTL[CAN1_Rx_Mslot].BYTE = 0x40; //メッセージBOX[30]を受信BOXに設定する。

    //メッセージBOX送信設定-
    while(CAN1.MCTL[CAN1_Tx_Mslot].BYTE != 0x00) //CANメッセージ制御レジスタが"00h"時のみMIER設定可能 P1330
    {
    CAN1.MCTL[CAN1_Tx_Mslot].BYTE = 0x00;
    }
    CAN1.MIER.BIT.MB31 = 1; //メールBOX割込み許可 MB31 送信
    CAN1.CTLR.BIT.IDFM = 2; //メールBOX はMIXIDフォーマット★

               記②

  • NAKA様

    一度返信を書いたのですが勘違いで頓珍漢なことを記載してしまったので削除しました。


    原因が分かりましたので共有いたします。
    制御レジスタ(CTLR)はCANリセットモード時に変更してくださいとハードウェアマニュアルに記載があるのですが
    それだけではなく、先にCANスリープモードを解除する必要があるようです。

    IORを今一度眺めていたところ、IDFMを2と指定しているにも関わらず、初期値の0となっていました。

    以下のようにプログラムを修正したところ動作しました。
    CAN0.CTLR.BIT.SLPM = 0; // スリープモードでない
    CAN0.CTLR.BIT.MBM = 0; // 通常モード(FIFOなし)
    CAN0.CTLR.BIT.IDFM = 2; // ミックスIDモード
    CAN0.CTLR.BIT.MLM = 0; // オーバライトモード
    CAN0.CTLR.BIT.TPM = 1; // メッセージボックス優先
    CAN0.CTLR.BIT.TSRC = 0;
    CAN0.CTLR.BIT.TSPS = 3; // タイムスタンプ・プリスケーラ 8ビット毎
    CAN0.CTLR.BIT.RBOC = 0; // バスオフ強制復帰 なにもしない

    アドバイスありがとうございました。
    たすかりました。

  • ヨシオカさま、NAKAです。解決して良かったですね!

    確かに、スリープはクロックを停止し消費電力を下げるので、機能が停止しちゃいますものね!

    あと、バスオフになった時じどうで復帰させたいで、エラー割込みがはいったら、強制復帰しちゃってます。(^_-)-☆

    /*******************************************************************************
    // 関数名 : CAN_ER_INT(void)
    // 動作 : CAN エラー割込み
    // 備考 :
    // 作成 : NAKA 12.02.22
    // ****************************************************************************/
    void CAN_ER_INT(void)
    {
    if(ICU.GRP[0].BIT.IS0 == 1) //CAN0_ER_INT フラグが立ったら p364
    {
    ICU.GCR[0].BIT.CLR0 = 1; //CAN0_ER_INT フラグのクリア
    if(CAN0.STR.BIT.BOST == 1) //バスオフ状態なら
    {
    CAN0.CTLR.BIT.RBOC = 1; //バスオフから強制復帰
    }
    }
    if(ICU.GRP[0].BIT.IS1 == 1) //CAN1_ER_INT フラグが立ったら p364
    {
    ICU.GCR[0].BIT.CLR1 = 1; //CAN1_ER_INT フラグのクリア
    if(CAN1.STR.BIT.BOST == 1) //バスオフ状態なら
    {
    CAN1.CTLR.BIT.RBOC = 1; //バスオフから強制復帰
    }
    }
    if(ICU.GRP[0].BIT.IS2 == 1) //CAN2_ER_INT フラグが立ったら p364
    {
    ICU.GCR[0].BIT.CLR2 = 1; //CAN2_ER_INT フラグのクリア
    if(CAN2.STR.BIT.BOST == 1) //バスオフ状態なら
    {
    CAN2.CTLR.BIT.RBOC = 1; //バスオフから強制復帰
    }
    }

    }