CAN通信 初心者です。助けてください !

はじめまして、『そろそろ』と申します。

 

NAKAさんのサンプルプログラムでCAN通信しようとしていますがうまくいっていません。

有識者方々にアドバイスが頂けると助かります。

 

NAKAさんプログラムからの主な変更点は、★部分です。

 (1) CAN0MCKE = 1;     //CANモジュールへX1クロックを供給 ★

⇒ CAN0MCKE = 0

 (2) GCFGL = 0x0010; //DCS=1:fCAN=X1=8MHzに設定 DLC配置禁止とは?★

⇒ GCFGL = 0x0000

(3) C0CFGL = 0x0000; //C0CFGL+1で分周=ボーレートプリスケラ = fCAN_8Mhz/((0+1)×16Tq)= 500Kbps★

⇒ C0CFGL = 0x0002

 

※(1)~(3)の設定理由は、X1クロックでなくてCPU/周辺ハードウェアクロック(fCLK)を使用しています。

 fCLKが24MHzなのでfCAN=(24MHz/2)((2+1)×16Tq) = 250Kbpsになります。

 

■■質問1■■

本来は、500Kbpsにしたかったのですが、設定可能でしょうか?

 

■■質問2■■

CANUSBというツールを使ってPCからRL78にCAN通信しようとしています。

 

CANUSBについてはこちら

http://www.compass-lab.com/CAN_Tool/CANUSB.htm

http://www.can232.com/?page_id=75

http://www.h5.dion.ne.jp/~enarin/page043.html

 

PCからRL78に

11bit標準CANフォーマット CANフレーム送信

をしていますが、RL78のRX, TXの信号がオシロでパタパタしません。

 

PCから通信できないのはCANUSBがおかしいかもしれないので

試しに

   TMDF00L = CAN_RX_ID >> 8;     //受信IDを送信

   TMDF00H = (unsigned char)(CAN_RX_ID & 0x00FF);

   TMDF10L = CAN_RX_DLC;         //受信DLCを送信

   TMDF10H = CAN_RX_DATA[0];   //受信DATA0を送信

   TMDF20L = CAN_RX_DATA[1];   //受信DATA1を送信

   TMDF20H = CAN_RX_DATA[2];   //受信DATA2を送信

   TMDF30L = CAN_RX_DATA[3];   //受信DATA3を送信

   TMDF30H = 0x12;                   //固定データを送信

の部分を

   TMDF00L = 0x00;

   TMDF00H = 0x01;

   TMDF10L = 0x10;

   TMDF10H = 0x11;

   TMDF20L = 0x20;

   TMDF20H = 0x21;

   TMDF30L = 0x30;

   TMDF30H = 0x31;

に変更したところ

   RFDF00L;

   RFDF00H;

   RFDF10L;

   RFDF10H;

   RFDF20L;

   RFDF20H;

   RFDF30L;

   RFDF30H;

については0x00のままで変化はなく

   RFDF01Lが0x00;

   RFDF01Hが0x01;

   RFDF11Lが0x10;

   RFDF11Hが0x11;

   RFDF21Lが0x20;

   RFDF21Hが0x21;

   RFDF31Lが0x30;

   RFDF31Hが0x31;

となっています。

この挙動は正しいのでしょうか?

/////////////////////////////////

下記 NAKAさん サンプルプログラム

http://japan.renesasrulz.com/cafe_rene/f/forum18/3353/rl78-f13-14can

/*************************************************************************
// 関数名 : fn_Init_CAN(void)
// 動作 : CAN通信の初期化
// 引数 :
// 作成 : NAKA  16.02.08
// 備考 :
// ***********************************************************************/
void fn_Init_CAN(void)
{
 //CANポートの設定
 PIOR4 = 0x40;        //周辺I/Oリダイレクションレジスタ設定
 P7 |= 0x04;            //P72(CTXD)
 PM7 &= 0xFB;        //CTXD0(P72pin)を"0":出力に
 PMC7 &= 0xFB;      //PMCの設定CAN使用時は"0"
 PM7 |= 0x08;          //CRXD0(P73pin)を"1":入力に
 PMC7 &= 0xF7;      //PMCの設定CAN使用時は"0"

 //外付け水晶振動子 8MHz使用時----------
 CAN0EN = 1;          //CANモジュールへクロックを供給
 CAN0MCKE = 1;     //CANモジュールへX1クロックを供給 ★
    __nop();
 while((GSTS&0x0008)!=0){} //CAN用RAMクリアを待つ GRAMINITフラグが"0":RAMクリアになったか?
 GCTRL &= 0xFFFB;             //GSLPR=0  グローバルリセットモードに変遷 (GMDC=01)
 while((GSTS&0x0004)!=0){} //CANグローバルリセットモード変遷を確認
 C0CTRL &= 0xFFFB;           //CSLPR=0 チャンネルストップモード⇒チャンネルリセットモードに変遷
 while((C0STSL&0x0004)!=0){} //CANチャンネルリセットモードに変遷を確認
 GCFGL = 0x0010;                //DCS=1:fCAN=X1=8MHzに設定 DLC配置禁止とは?★
 C0CFGH = 0x0049;             //SJW=1 TSEG2=5 TSEG1=10  に設定 ボーレートプリスケラ(1)分周無しの場合
 C0CFGL = 0x0000;             //C0CFGL+1で分周=ボーレートプリスケラ = fCAN_8Mhz/((0+1)×16Tq)= 500Kbps★
 
 //受信ルール設定
 GAFLCFG = 0x0006;    //受信ルール数設定 0:ルール無し? or 1:受信バッファを使用する?
 GRWCR = 0x0000;      //受信ルール変更準備
 GAFLIDL0 = 0x0000;   //受信ルール① ID設定  比較しない?
 GAFLIDH0 = 0x0000;   //受信ルール② 標準ID・データフレーム
 GAFLML0 = 0x0000;    //受信ルール③ 対応IDをマスクしない "0000"なので全bitチェックしないので全て受信する。
 GAFLMH0 = 0xE000;   //受信ルール④ 標準IDか?とデータフレームか?他のCANノードが送信? を比較する。
 GAFLPL0 = 0x0001;    //受信ルール⑤ 受信FIFOバッファ0(GAFLFDP0)をのみ選択する
 GAFLPH0 = 0x0000;    //受信ルール⑥ DLCチェックしない
 GRWCR = 0x0001;      //受信ルール変更完了
 
 //受信バッファ設定
 RFCC0 = 0xF302;      //
 C0CTRL |= 0x0008;    //RTBO=1:バスオフ強制復帰させる ?
 
 GCTRL &= 0xFFFC;     //GSLPR=0 グローバルリセットモード⇒グローバル動作モードに変遷 (GMDC=00)
 while((GSTS&0x0001)!=0){} //CANグローバル動作モード変遷を確認
 RFCC0 |= 0x0001;     //RFE(1:FIFOバッファ使用許可) 注)グローバル動作モードに変更するp1264
 C0CTRL &= 0xFFFC;     //CSLPR=0 チャンネルリセットモード⇒CANチャンネル通信モードに変遷 (CHMDC=00)
 while((C0STSL&0x0001)!=0){} ///CANチャンネル通信モードに変遷を確認
 
    __nop();
}


//********************************************************************
//*************メインルーチン*****************************************
//********************************************************************
unsigned char  CAN_RX_DATA[8];
unsigned char  CAN_RX_DLC;
unsigned short  CAN_RX_ID;
unsigned short  i;

while (1)
{
 if(f_TRD0 != 0)                   //1ms毎のイベント(TRD0-コンペアマッチ)
 {
  f_TRD0 = 0;
   i++;
   if(i >= 1000)                   //1s毎のタイミング
   {
    i=0;
          
    //★★★CANの送信(1秒毎の定期送信)★★★★★★★★★★★★★★★
    TMSTS0 &= 0xF9;              //送信結果フラグクリア
    while((TMSTS0 & 0x06)!=0){}  //確認
    TMIDH0 = 0x0000;             //標準ID データフレーム 履歴をバッファしない
    // IDセット
    TMIDL0 = 0x0123;             //送信IDバッファ0にIDをSET!
    // データ長セット
    TMPTR0 = 0x8000;             //送信DLCバッファ0にDLCをSET!
    // データセット
    TMDF00L = CAN_RX_ID >> 8;     //受信IDを送信
    TMDF00H = (unsigned char)(CAN_RX_ID & 0x00FF);
    TMDF10L = CAN_RX_DLC;         //受信DLCを送信
    TMDF10H = CAN_RX_DATA[0];    //受信DATA0を送信
    TMDF20L = CAN_RX_DATA[1];    //受信DATA1を送信
    TMDF20H = CAN_RX_DATA[2];    //受信DATA2を送信
    TMDF30L = CAN_RX_DATA[3];    //受信DATA3を送信
    TMDF30H = 0x12;                   //固定データを送信
    TMC0 |= 0x01;                      //送信要求 TMTRを"1"に


    //★★★CANの受信★★★★★★★★★★★★★★★★★★★★★★★★★   
    CAN_RX_ID = RFIDL0;          //IDを格納
    CAN_RX_DLC = RFPTR0 >> 12;   //DLCを格納
    CAN_RX_DATA[0] = RFDF00L;    //Data0を格納
    CAN_RX_DATA[1] = RFDF00H;    //Data1を格納
    CAN_RX_DATA[2] = RFDF10L;    //Data2を格納
    CAN_RX_DATA[3] = RFDF10H;    //Data3を格納
    CAN_RX_DATA[4] = RFDF20L;    //Data4を格納
    CAN_RX_DATA[5] = RFDF20H;    //Data5を格納
    CAN_RX_DATA[6] = RFDF30L;    //Data6を格納
    CAN_RX_DATA[7] = RFDF30H;    //Data7を格納
    RFPCTR0 = 0x00FF;                //バッファポインターインクリメント
   
   }
  }
 }

  • そろそろ様

    高速システム・クロック設定
    『X1発信(fX)』を選択『8MHz』という環境ではありますが
    それ以外は同条件で試してみましたところ
    250kbpsで動作しています。
    (同じ現象であれば125kbpsになるはず)

    コード生成を使用されていると思いますが、
    クロック発生回路の項目の下の方にある
    CPUと周辺クロック(fCLK)のドロップダウンリストを
    1個下げてしまっている(fMP/2)という可能性は・・・さすがにないですかね(^_^;)


    因みにですが、
    RFDF01~に送信バッファ0のデータが入る件、
    やはり検証時に受信FIFOバッファの設定ができていなかったらしく
    設定してあげたら入らなくなりました。

  • NAKAさん、お世話になっております。
    そろそろ です。

    少し混乱しています。

    RL78 マニュアル(P1220) 図18-1 CANモジュールのブロックによると
    左下側で
    (1) CPU/周辺ハードウェアクロック(fCLK)
    (2) X1クロック (fx)
    がCANモジュールのクロック入力になっています。

    上記のクロックは
    図5-1 クロック発生回路のブロック図でいうと
    高速システム・クロックの
    『水晶/セラミック発信(fx)』が上記の(2)で
    『外部入力クロック(fEX)』が(1)になる
    という事ではないのでしょうか?

    高速システム・クロック(fMX)はCANモジュールの入力になるけど
    オンチップ・オシュレーター(fIH)はCANモジュールの入力にはなっていないように見受けられますが
    その認識はあっていますでしょうか?

    NAKAさんコメントによると『高速オンチップオシレータ』を
    CANモジュールの入力としてみてはどうか?
    という話なのでちょっと混乱しています。
  • Sugachanceさん、お世話になっております。
    そろそろ です。

    > CPUと周辺クロック(fCLK)のドロップダウンリストを
    > 1個下げてしまっている(fMP/2)という可能性は・・・

    もしかすると・・・と思い確認しました。
    (fMP/2)にはなっていなかったです(fMPでした)。
  • そろそろさん、おはようございますNAKAです。

    >高速システム・クロック(fMX)はCANモジュールの入力になるけど
    >オンチップ・オシュレーター(fIH)はCANモジュールの入力にはなっていないように見受けられますが
    > その認識はあっていますでしょうか?
    ⇒メインシステムクロック(fMAIN)の選択で外部fMX(水晶や発振器)か内部fIH(オンチップオシレータ)でfIH側
     にしてPLLやDIVをしてfCLK周辺ハードクロックに選択にできるのではないでしょうか?
     fIH⇒fMAIN⇒fCLKという順番に選択していくだけのようなきがしますよ!

    ※なんとなくですが、周辺機能使うためには、必ず水晶を外付けしないといけないなんて、オンチップオシレータ
      の意味がないような気がしますもの!!

      確認してみてくださいね!チュッ!
  • NAKAさん、おせわになっております。
    そろそろ です。

    メイン・システム・クロックを『高速オンチップオシュレーター』にして
    fIH(16MHz)⇒fMAIN⇒fCLK×1/2⇒fCAN
    で動作させたところ500kbpsで動作しました。

    適切なアドバイス、ありがとうございます。

    /////////////////////////

    マニュアル図18-1によると
    CANブロックへのクロック入力は(1)と(2)になっています。

    (1)fCLK
     (1-1) fLH: ソースは高速オンチップオシュレーター
     (1-2) fEX: 高速システムクロックの外部クロック入力
    (2)fx
     (2-1) fx: 高速システムクロックのX1発信)

    (1-1)は今回NAKAさんアドバイスで所望の500kbpsが出ています・
    (2-1)は多く方々が試しているパターンで500kbpsで動作するようです。

    現状、(1-2)が動作していません。
    fEX⇒fMAIN⇒fCLK×1/2⇒fCAN
    は駄目なのかな?

    今更で申し訳ないのですが、
    fEXは、24MHzのクロックになっています。
    コード生成のクロック発生回路で
    fEXの設定を『16MHz』としてもダメですよね?
    fEXを24MHzから16MHzに変換するところがないですから・・・
  • そろそろさん、おはようございますNAKAです。

    >現状、(1-2)が動作していません。
    >fEX⇒fMAIN⇒fCLK×1/2⇒fCAN
    >は駄目なのかな?
    ⇒外部クロックを直接選択すると”fCLK×1/2”のように2分周はしませんよ!
     ブロック図確認してみてね!

    >fEXは、24MHzのクロックになっています。
    ⇒8MHzでも16MHzでも24MHzでもBRPで任意の値に分周すれば良いと思いますよ!

    P.S.
    最近実験室の中はヘルメットを被ることが義務づけられたため、ヘルメットでプログラム
    組んでいるため首が痛い..........涙)
    毛根にも悪い!「斉藤さんだぞ!」じゃなくて「NAKAさんだぞ!」になりそうで怖い。
  • Hello NAKA, this is sagar
    I am working on RL78/F14 controller (BOARD- QB-R5F10PPJ-TB) and developing Interrupt base CAN driver in E2 studio. Can anybody tell me how to generate transmit interrupt??, my messages are transmitting over Bus but Transmit Interrupt is not getting generated.. please help me out..
  • Hi sagar,this is NAKA.

    I'm sorry but I cannot understand English well. Because my TOEIC score is only 400 points. :_(

    But I explain interrupt.
    Please refer to the example code below.

    ①You set a vect first.
    ex)
    void __near CAN_TX_INT(void);
    #pragma interrupt CAN_TX_INT(vect=INTCAN0TRM) //CAN送信割り込み宣言
    void __near CAN_RX_INT(void);
    #pragma interrupt CAN_RX_INT(vect=INTCANGRFR) //CAN受信割り込み宣言

    ②Then, You set SFR.
    ex)
    //割込設定    割り込み名称:INTCANGRFR(グローバルFIFO受信割込み) INTCAN0TRM(チャンネル送信割込み)
    CAN0TRMPR0 = 0; //CAN送信割込プライオリティ設定
    CAN0TRMPR1 = 1; //01:レベル2
    CAN0TRMMK = 0; //CAN送信割込マスクフラグ 0:許可

    CANGRFRPR0 = 0; //CAN受信割込プライオリティ設定
    CANGRFRPR1 = 1; //01:レベル2
    CANGRFRMK = 0; //CAN受信割込マスクフラグ 0:許可

    ③Finally You write interrupt program.
    ex)
    void __near CAN_TX_INT(void)
    {
    if(CAN0_TxWtPtr == CAN0_TxRdPtr) // ポインタ比較
    { // 送信完了
    f_CAN0_TxBusy = 0; // 送信中フラグOFF
    }
    else
    {
    CAN0_TX_SET(); // メールボックスへの送信データのセット
    }
    }

    I am glad if I can help it.