評価ボード(QB-R5F10BMG-TB)を使用したCAN通信について

いつもお世話になっております。

「マサ」と申します。

現在,QB-R5F10BMG-TB(以下、評価ボード)を用いて、CAN通信をさせようとしております。

NAKAさんが以前に作成されたサンプルをベースにコーディングして、デバッグしているのですが、

どうにもうまくいきません。

症状としては以下のようになります。

①CANモジュール設定完了時(グローバル通信、チャンネル通信モードの切り替え完了)

・C0ERFLLが0x0000から0x20DF

・C0STSHが0x0000から0x0081になる。

 

②送信時

②-1送信要求時:

・一度送信要求を行うと、アボートするまでひたすら送信を繰り返す。

・繰り返し送信をしている最中に任意のデータが送られたり、SOFらしきものだけが送られる。

②-2ワンショット送信要求時:

・送信要求を行っていないにも関わらず、SOFらしきものがたびたび送信される。

・送信要求を行ってもバッファに入れた任意のデータが送信されない。代わりにSOFらしきものが送信される。

 

当方、CAN通信は初めてで、データシート等見比べていろいろ試したのですが、状況が変わらず苦戦しております。

何かアドバイスをいただけないでしょうか?

 

※評価ボードのP1.0,P1.1とトランシーバーICと接続しているパターンをカットして、入力ポートとしてします。

代わりにリダイレクション機能を使用してP7.3、P7,2をCANのCTXDとCRXDとして使用しており、それぞれをトランシーバICのTXDとRXDに接続しています。

P1.2は出力のLoとしております。

クロックはオンチップオシレータを使用、オプションバイトで16MHzを指定しています。

またデバッグしている環境ですが、

CS+ V4.00(CA78K0R 1.72)

E1使用 (評価ボードに5V供給しています)

 

以下、ソースになります。

//CANの設定

void CAN_Init( void )
{

PM1 = 0xFBu; /* P1.2 出力*/
P1 |= 0x00; /* P1.2 Lo*/
PIOR4 = bin8(0,1,0,0,0,0,0,0); /* リダイレクションを有効 P72,P73にCANTX,CANRX */
P7 &= 0xF7u; /* P72(CTXD0)="1", P73(CRXD0)="0" */
P7 |= 0x04u; /* P72(CTXD0)="1", P73(CRXD0)="0" */
PM7 &= 0xFBu; /* CTXD0(P72pin)を"0":出力に */
PM7 |= 0x08u; /* CRXD0(P73pin)を"1":入力に */
PIM7 &= 0xF3u; /* 通常入力モード選択 */
POM7 &= 0xF3u; /* 通常出力モード選択 */


/* 高速オンチップ・オシレータ 使用時---------- */
CAN0EN = 1u; /* CANモジュールへクロックを供給 */
//CAN0MCKE = 1u; /* CANモジュールへX1クロックを供給(X1クロックを供給する場合のみ有効) */
NOP();
while((GSTS&0x0008u)!=0u){} /* CAN用RAMクリアを待つ GRAMINITフラグが"0"になればRAMクリア */

while((GSTS&0x0004u)==0u){} /* グローバルストップモードであるかを確認 GSLPSTSフラグが"1"であればグローバルストップモード */

GCTRL &= 0xFFFDu; /* GSLPR=0 グローバルストップモード⇒グローバルリセットモードに変遷 (GMDC=01) */
GCTRL |= 0x0001u;
GCTRL &= 0xFFFBu;
while(((GSTS&0x0004u)==1u) && ((GSTS&0x0001u)==0u)){} /* CANグローバルリセットモード変遷を確認 GSRSTSTが1ならグローバルリセットモード*/

while((C0STSL&0x0004u)==0u){} /* CANチャンネルストップモードかを確認 */

C0CTRL &= 0xFFFDu; /* CSLPR=0 チャンネルストップモード⇒チャンネルリセットモードに変遷 (CHMDC=01) */
C0CTRL |= 0x0001u;
C0CTRL &= 0xFFFBu;
while(((C0STSL&0x0004u)==1u) && ((C0STSL&0x0001u)==0u)){} /* CANチャンネルリセットモードに変遷を確認 */

/* クロック, ビットタイミング, 通信速度等の設定 */
GCFGL = 0x0000u; /* DCS=0:fCAN=(fCLK/2)/TSP=8MHzに設定 */

GCFGH = 0x0000u; /* 15-0bit ITRCP インターバル・タイマ・プリスケーラ設定 */

C0CFGL = 0x0000u; /* (BRP+1)で分周=プリスケーラ分周比設定ビット */
/* = fcan_8MHz/((0+1)×16Tq)=500Kbps */
C0CFGH = 0x0049u; /* SJW=1,TSEG2=5,TSEG1=10 に設定 */

/* 受信ルール設定 */
GAFLCFG = 0x0006u; /* 受信ルール数設定 */
GRWCR = 0x0000u; /* 受信ルール変更準備 */
GAFLIDL0 = 0x0000u; /* 受信ルールID設定  比較しない */
GAFLIDH0 = 0x0000u; /* 受信ルール */
GAFLML0 = 0x0000u; /* 受信ルール 対応IDをマスクしない "0000"=全bitチェックしない=全て受信 */
GAFLMH0 = 0xE000u; /* 受信ルール 標準IDか?とデータフレームか?を比較する。 */
GAFLPL0 = 0x0001u; /* 受信ルール 受信FIFOバッファ0(GAFLFDP0)をのみ選択する */
GAFLPH0 = 0x0000u; /* 受信ルール DLCチェックしない */
GRWCR = 0x0001u; /* 受信ルール変更完了 */

RMNB = 0x0010u; /* 受信バッファ数設定 = 16(仮) */
RFCC0 = 0x1300u; /* 受信FIFOバッファ利用 1メッセージ受信完了ごとに割り込み発生 */

CFCCL0 = 0x0000u; /* 送受信FIFOバッファ未使用 */
CFCCH0 = 0x0000u; /* 送受信FIFOバッファ未使用 */


/* 送信バッファ */
TMC0 = 0x00u; /* 送信禁止 */
TMC1 = 0x00u;
TMC2 = 0x00u;
TMC3 = 0x00u;

/* グローバルエラー割り込み */
GCTRL &= 0xF8FFu; /* エラー割り込み関連無効(仮) */


/* チャンネル割り込み,バスオフ,エラー表 */
C0CTRL &= 0x00FFu; /* RTBO=1:バスオフ強制復帰させる(保険) */
C0CTRL |= 0x0008u; /* エラー割り込み関連無効(仮) */
C0CTRH = 0x0000u; /* 送信アボート割り込み禁止、バスオフ復帰(ISO11898-1仕様)、通信テスト禁止 */

/* 割り込みコントローラ部の割り込み制御レジスタ */
GCTRL &= 0xFFFCu; /* GSLPR=0 グローバルリセットモード⇒グローバル動作モードに変遷 (GMDC=00) */
while((GSTS&0x0001u)!=0u){} /* CANグローバル動作モード変遷を確認 */
RFCC0 |= 0x0001u; /* RFE(1:受信FIFOバッファ使用許可) */

NOP();
C0CTRL &= 0xFFFCu; /* CSLPR=0 チャンネルリセットモード⇒CANチャンネル通信モードに変遷 (CHMDC=00) */
while((C0STSL&0x0001u)!=0u){} /* CANチャンネル通信モードに変遷を確認 */
NOP();

}

 


uchar CAN_Sendstatus( void )
{
uchar ret;
uchar tmp;

do{
tmp = TMSTS0;

if(tmp & 0x01){
ret = 1u;
}else{
switch(tmp){
case 0x00: //送信中
ret = 0;
break;
case 0x02: //アボート
ret = 0;
break;
case 0x04: //送信完了(アボートなし)
case 0x06: //送信完了(アボートあり)
ret = 0u;
break;
default:
ret = 1u;
break;

}
}

}while(0);


return ret;
}


void CAN_SendStart( void )
{
TMSTS0 &= 0xF9u; /* 送信結果フラグクリア */
while(( TMSTS0 & 0x06u ) != 0x00){} /* 送信ステータス確認 */

TMIDL0L = 0x12/* IDを格納 */
TMIDL0H = 0x34;

TMIDH0L = 0x00; /* 拡張ID */
TMIDH0H = 0x00; /* 拡張ID最上位1ビット、IDEビット、RTRビット、送信履歴データ格納許可ビットを格納 */

TMPTR0L = 0x00; /* 送信履歴バッファに格納するラベル情報 */
TMPTR0H = 0x40; /* DLCを格納 */
TMDF00L = 0xAA; /* 送信データ */
TMDF00H = 0xAA;
TMDF10L = 0xAA;
TMDF10H = 0xAA;

TMC0 |= 0x05u; /* 送信要求 TMTRを"1"に ワンショットも合わせて*/

//TMC0 |= 0x01u; /* 送信要求 TMTRを"1"に */
}

return ret;

}

//ここまでCAN設定

 

////メインルーチン

main(){

 

while( 1u ){

WDT_Reset(); /* ウォッチドッグタイマクリア */

if( TMIF07 ){ //1ms毎のイベント(TRD7-コンペアマッチ)
TM07_START_1ms();
i++;
if( i >= 100u ){ //100ms毎のタイミング
i = 0u;
//★★★送信バッファ0の送信★★★★★★★★★★★★★★★
if( CAN_Sendstatus() == 0u ){
/* 先の送信データがない場合→送信開始 */
CAN_SendStart(); /* 送信開始 */
}
else{
/* 送信中の場合→待機 */
}

}

}

}

 

 

 

 

Parents
  • >当方、CAN通信は初めてで、データシート等見比べていろいろ試したのですが

     初めて作るのに、いきなり複雑なプログラムを作っているのではないですか。
     順序としては次のようになるでしょう。
    ・簡単な送信プログラムを作り、波形を観測。フラグもチェック
    ・簡単な受信プログラムを作り、ACKを返すことを確認
  • CANそのものはある程度理解されてますか?
    CAN入門書( https://www.renesas.com/ja-jp/doc/products/mpumcu/apn/003/rjj05b0937_canap.pdf )を一通り読むことをお奨めします。
    ACKの話も出てきます。
    ボッシュの仕様書は入手が面倒で、ルネサスのCAN入門書の方が分かり易いです。

  • お世話になっております。

    マサです。

    報告に参りました。

    無事CAN通信することができました。
    皆様、ありがとうございました。
  • マサさん 良かったですね! 

    NAKA_METAL DEATH !

    NAKAのサンプルコードがお役にたてて、うれしい DEATH !


    こんな困難だって 案外平気だし
    DOKI DOKI しながらまたハマってく

    ただ待っているだけの昨日を脱ぎ捨てて
    WAKU WAKU できる今日を手にしたい

    We can try over the future world!!
  • お世話になります。ikkiです。
    これからCANをやり始めますが、
    マサ様、動いたサンプルを公開していただけないでしょうか?多くの方も期待していると思います。
    よろしくお願いします。
  • すみません。
    同じボードを使ってCAN通信テストしていますが、をうまく行きません。下記はポート設定です、ほかは同様です。教えていただければ助かります。
    PIOR4 &= 0xBF;
    P1 &= 0xFD; // P11 -> 'L'
    P1 |= 0x05; // P10 -> 'H'; P12 -> 'H'
    PM1 |= 0x02; // P11(CRXD0)->Inp(1)
    PM1 &= 0xFA; // P10(CTXD0)->Outp(0);
    // P12->Outp(0)
    PIM1 &= 0xFE; // PIM10=0
    POM1 &= 0xFD; // POM11=0
    P1 &= 0xFB; // P12=0 (tja->ON)
  • ikkiさん こんにちはNAKAといいます。

    ポートの設定ですが、評価ボードのまま使っているならリダクションレジスタを変更する必要もありませんし、TAJ1050のS端子(P12)はフローティングでも動作するようなので
    P1 |= 0x01; //P10(TXD)
    PM1 &= 0xFE; //CTXD0(P10)を"0":出力に
    PM1 |= 0x02; //CRXD0(P11)を"1":入力に
    程度でいいような気がします。

    マサさんはCAN用のクロックを高速オンチップオシレータを16MHz設定で使っているような感じなのですが、ikkiさんの、おおもとのクロックの設定は大丈夫でしょうか?そのまま4MHzの外付け水晶を使ってませんか?

    P.S.
    マサさんはP72とP73にリダクションしているということは、外付けのCANトランシーバを自分でくっつけたのかなぁ?何故ボードについてるトランシーバを使わなかったのだろう? 謎???
  • NAKAさま、
    ご返事ありがとうございます。
    CANは動きましたのでご報告します。
    高速オンチープオシレータを使っています。
    CANポートはリダイレクトせず。
    下記に借りてきたソースですが、上げておきます。

    // 参考:japan.renesasrulz.com/.../32649
    // 評価ボード(QB-R5F10BMG-TB)を使用したCAN通信について
    #include "CAN_api.h"
    /*--------------------------------------------- CAN_api.h
    #ifndef __CAN_API
    #define __CAN_API
    void CAN_Init( void );
    uint8_t CAN_SendStatus( void );
    void CAN_SendStart( void );
    #endif
    -------------------------------------------------------*/
    #include "r_cg_macrodriver.h"
    #include <iodefine.h>

    //CANの設定

    void CAN_Init( void )
    {
    /*----------------------------------------- (ORG)
    PM1 = 0xFBu; // P1.2 出力
    P1 |= 0x00; // P1.2 Lo
    PIOR4 |= 0x40; // = 0x40; // bin8(0,1,0,0,0,0,0,0); // リダイレクションを有効 P72,P73にCANTX,CANRX
    P7 &= 0xF7u; // P72(CTXD0)="1", P73(CRXD0)="0"
    P7 |= 0x04u; // P72(CTXD0)="1", P73(CRXD0)="0"
    PM7 &= 0xFBu; // CTXD0(P72pin)を"0":出力に
    PM7 |= 0x08u; // CRXD0(P73pin)を"1":入力に
    PIM7 &= 0xF3u; // 通常入力モード選択
    POM7 &= 0xF3u; // 通常出力モード選択
    -----------------------------------------------*/
    PIOR4 &= 0xBF;
    // PMC7 &= 0xFB;
    // P1 &= 0xFD; // P11 -> 'L' // redundant!
    P1 |=0x01; // P1 |= 0x05; // P10 -> 'H'; P12 -> 'H'
    PM1 |= 0x02; // P11(CRXD0)->Inp(1)
    PM1 &= 0xFE; //PM1 &= 0xFA; // P10(CTXD0)->Outp(0); P12->Outp(0) // 11111010
    // PIM1 &= 0xFE; // PIM10=0 // redundant!
    // POM1 &= 0xFD; // POM11=0 // redundant!
    // P1 &= 0xFB; // P12=0 (tja->ON)
    //
    // 高速オンチップ・オシレータ 使用時----------
    CAN0EN = 1u; // CANモジュールへクロックを供給
    CAN0MCKE &= 0xFE; //(yama) CAN0MCKE = 1u; // CANモジュールへX1クロックを供給(X1クロックを供給する場合のみ有効)
    NOP();

    //--------- Option-1 (Option-2もOK)
    while((GSTS&0x0008u)!=0u){} // 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チャンネルリセットモードに変遷を確認

    /*---------- Option-2
    while((GSTS&0x0008u)!=0u){} // CAN用RAMクリアを待つ GRAMINITフラグが"0"になればRAMクリア
    while((GSTS&0x0004u)==0u){} // ???? // グローバルストップモードであるかを確認 GSLPSTSフラグが"1"であればグローバルストップモード

    GCTRL &= 0xFFFDu; // GSLPR=0 グローバルストップモード⇒グローバルリセットモードに変遷 (GMDC=01)
    GCTRL |= 0x0001u;
    GCTRL &= 0xFFFBu;
    while(((GSTS&0x0004u)==1u) && ((GSTS&0x0001u)==0u)){} // CANグローバルリセットモード変遷を確認 GSRSTSTが1ならグローバルリセットモード

    while((C0STSL&0x0004u)==0u){} // CANチャンネルストップモードかを確認

    C0CTRL &= 0xFFFDu; // CSLPR=0 チャンネルストップモード⇒チャンネルリセットモードに変遷 (CHMDC=01)
    C0CTRL |= 0x0001u;
    C0CTRL &= 0xFFFBu;
    while(((C0STSL&0x0004u)==1u) && ((C0STSL&0x0001u)==0u)){} // CANチャンネルリセットモードに変遷を確認
    -----------------------*/

    // クロック, ビットタイミング, 通信速度等の設定
    GCFGL = 0x0000u; // DCS=0:fCAN=(fCLK/2)/TSP=16MHzに設定
    //(yama) GCFGH = 0x0000u; // 15-0bit ITRCP インターバル・タイマ・プリスケーラ設定
    C0CFGL = 0x0001u; // C0CFGL+1 = 2 (BRP+1)で分周=プリスケーラ分周比設定ビット(16MHz/2=8MHz)
    // = fcan_8MHz/((0+1)×16Tq)=500Kbps
    C0CFGH = 0x0049u; // SJW=1,TSEG2=5,TSEG1=10 に設定 ボーレートプリスケラ(1)分周無しの場合

    // 受信ルール設定
    GAFLCFG = 0x0006u; // 受信ルール数設定
    GRWCR = 0x0000u; // 受信ルール変更準備
    GAFLIDL0 = 0x0000u; // 受信ルールID設定  比較しない
    GAFLIDH0 = 0x0000u; // 受信ルール
    GAFLML0 = 0x0000u; // 受信ルール 対応IDをマスクしない "0000"=全bitチェックしない=全て受信
    GAFLMH0 = 0xE000u; // 受信ルール 標準IDか?とデータフレームか?を比較する。
    GAFLPL0 = 0x0001u; // 受信ルール 受信FIFOバッファ0(GAFLFDP0)をのみ選択する
    GAFLPH0 = 0x0000u; // 受信ルール DLCチェックしない
    GRWCR = 0x0001u; // 受信ルール変更完了

    RMNB = 0x0010u; // 受信バッファ数設定 = 16(仮)
    RFCC0 = 0x1300u; // 受信FIFOバッファ利用 1メッセージ受信完了ごとに割り込み発生

    CFCCL0 = 0x0000u; // 送受信FIFOバッファ未使用
    CFCCH0 = 0x0000u; // 送受信FIFOバッファ未使用

    // 送信バッファ
    TMC0 = 0x00u; // 送信禁止
    TMC1 = 0x00u;
    TMC2 = 0x00u;
    TMC3 = 0x00u;

    // グローバルエラー割り込み
    GCTRL &= 0xF8FFu; // エラー割り込み関連無効(仮)

    // チャンネル割り込み,バスオフ,エラー表
    C0CTRL &= 0x00FFu; // RTBO=1:バスオフ強制復帰させる(保険)
    C0CTRL |= 0x0008u; // エラー割り込み関連無効(仮)
    C0CTRH = 0x0000u; // 送信アボート割り込み禁止、バスオフ復帰(ISO11898-1仕様)、通信テスト禁止

    // 割り込みコントローラ部の割り込み制御レジスタ
    GCTRL &= 0xFFFCu; // GSLPR=0 グローバルリセットモード⇒グローバル動作モードに変遷 (GMDC=00)
    while((GSTS&0x0001u)!=0u){} // CANグローバル動作モード変遷を確認
    RFCC0 |= 0x0001u; // RFE(1:受信FIFOバッファ使用許可)

    NOP();
    C0CTRL &= 0xFFFCu; // CSLPR=0 チャンネルリセットモード⇒CANチャンネル通信モードに変遷 (CHMDC=00)
    while((C0STSL&0x0001u)!=0u){} // CANチャンネル通信モードに変遷を確認
    NOP();
    }

    uint8_t CAN_SendStatus( void )
    {
    uint8_t ret;
    uint8_t tmp;

    do{
    tmp = TMSTS0;
    if(tmp & 0x01){
    ret = 1u;
    }else{
    switch(tmp){
    case 0x00: //送信中
    ret = 0;
    break;
    case 0x02: //アボート
    ret = 0;
    break;
    case 0x04: //送信完了(アボートなし)
    case 0x06: //送信完了(アボートあり)
    ret = 0u;
    break;
    default:
    ret = 1u;
    break;
    }
    }
    } while(0);

    return ret;
    }


    void CAN_SendStart( void )
    {
    TMSTS1 &= 0xF9u; // 送信結果フラグクリア
    while(( TMSTS0 & 0x06u ) != 0x00){} // 送信ステータス確認

    TMIDL0L = 0xA0; // 0x12; // IDを格納
    TMIDL0H = 0x00; // 0x34;

    TMIDH0L = 0x00; // 拡張ID
    TMIDH0H = 0x00; // 拡張ID最上位1ビット、IDEビット、RTRビット、送信履歴データ格納許可ビットを格納

    TMPTR0L = 0x00; // 送信履歴バッファに格納するラベル情報
    TMPTR0H = 0x40; // DLCを格納
    TMDF00L = 0xAA; // 送信データ
    TMDF00H = 0xAA;
    TMDF10L = 0xAA;
    TMDF10H = 0xAA;

    TMC0 |= 0x05u; // 送信要求 TMTRを"1"に ワンショットも合わせて
    //TMC0 |= 0x01u; // 送信要求 TMTRを"1"に

    return;
    }
    //ここまでCAN設定

    ////メインルーチン

    volatile uint16_t g_cnt2 = 0;
    static uint8_t g_toggle;

    void main(void)
    {
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */

    CAN_Init();
    //can_tja_init();
    //can_tja_start();

    while (1U){
    g_cnt2++;
    if((g_cnt2 & 0xFFFF) == 0xFFFF){
    if(g_toggle==1){
    P6_bit.no7=0;
    g_toggle=0;
    }
    else{
    P6_bit.no7=1;
    g_toggle=1;
    }
    g_cnt2=0;

    if(CAN_SendStatus()==0u){
    //can_tja_start();
    CAN_SendStart();
    //can_tja_disable();
    NOP();
    }
    }
    }
    /* End user code. Do not edit comment generated here */
    }
  • ikkiです。
    やはり人様のソースを理解しないで使うのは危険を伴います。
    前に上げたサンプルにはバッグがありました。
    たまに動作しますが。
    訂正してもう一度上げておきます。

    //-------(以下はソース)
    // 参考:japan.renesasrulz.com/.../32649
    // 評価ボード(QB-R5F10BMG-TB)を使用したCAN通信について
    #include "CAN_api.h"
    /*--------------------------------------------- CAN_api.h
    #ifndef __CAN_API
    #define __CAN_API
    void CAN_Init( void );
    uint8_t CAN_SendStatus( void );
    void CAN_SendStart( void );
    #endif
    -------------------------------------------------------*/
    #include "r_cg_macrodriver.h"
    #include <iodefine.h>

    //CANの設定

    void CAN_Init( void )
    {
    /*----------------------------------------- (ORG)
    PM1 = 0xFBu; // P1.2 出力
    P1 |= 0x00; // P1.2 Lo
    PIOR4 |= 0x40; // = 0x40; // bin8(0,1,0,0,0,0,0,0); // リダイレクションを有効 P72,P73にCANTX,CANRX
    P7 &= 0xF7u; // P72(CTXD0)="1", P73(CRXD0)="0"
    P7 |= 0x04u; // P72(CTXD0)="1", P73(CRXD0)="0"
    PM7 &= 0xFBu; // CTXD0(P72pin)を"0":出力に
    PM7 |= 0x08u; // CRXD0(P73pin)を"1":入力に
    PIM7 &= 0xF3u; // 通常入力モード選択
    POM7 &= 0xF3u; // 通常出力モード選択
    -----------------------------------------------*/
    PIOR4 &= 0xBF;
    // PMC7 &= 0xFB;
    // P1 &= 0xFD; // P11 -> 'L' // redundant!
    P1 |=0x01; // P1 |= 0x05; // P10 -> 'H'; P12 -> 'H'
    PM1 |= 0x02; // P11(CRXD0)->Inp(1)
    PM1 &= 0xFE; //PM1 &= 0xFA; // P10(CTXD0)->Outp(0); P12->Outp(0) // 11111010
    // PIM1 &= 0xFE; // PIM10=0 // redundant!
    // POM1 &= 0xFD; // POM11=0 // redundant!
    // P1 &= 0xFB; // P12=0 (tja->ON)
    //
    // 高速オンチップ・オシレータ 使用時----------
    CAN0EN = 1u; // CANモジュールへクロックを供給
    CAN0MCKE &= 0xFE; //(yama) CAN0MCKE = 1u; // CANモジュールへX1クロックを供給(X1クロックを供給する場合のみ有効)
    NOP();

    //--------- Option-1 (Option-2もOK)
    while((GSTS&0x0008u)!=0u){} // 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チャンネルリセットモードに変遷を確認

    /*---------- Option-2
    while((GSTS&0x0008u)!=0u){} // CAN用RAMクリアを待つ GRAMINITフラグが"0"になればRAMクリア
    while((GSTS&0x0004u)==0u){} // ???? // グローバルストップモードであるかを確認 GSLPSTSフラグが"1"であればグローバルストップモード

    GCTRL &= 0xFFFDu; // GSLPR=0 グローバルストップモード⇒グローバルリセットモードに変遷 (GMDC=01)
    GCTRL |= 0x0001u;
    GCTRL &= 0xFFFBu;
    while(((GSTS&0x0004u)==1u) && ((GSTS&0x0001u)==0u)){} // CANグローバルリセットモード変遷を確認 GSRSTSTが1ならグローバルリセットモード

    while((C0STSL&0x0004u)==0u){} // CANチャンネルストップモードかを確認

    C0CTRL &= 0xFFFDu; // CSLPR=0 チャンネルストップモード⇒チャンネルリセットモードに変遷 (CHMDC=01)
    C0CTRL |= 0x0001u;
    C0CTRL &= 0xFFFBu;
    while(((C0STSL&0x0004u)==1u) && ((C0STSL&0x0001u)==0u)){} // CANチャンネルリセットモードに変遷を確認
    -----------------------*/

    // クロック, ビットタイミング, 通信速度等の設定
    GCFGL = 0x0000u; // DCS=0:fCAN=(fCLK/2)/TSP=16MHzに設定
    //(yama) GCFGH = 0x0000u; // 15-0bit ITRCP インターバル・タイマ・プリスケーラ設定
    C0CFGL = 0x0001u; // C0CFGL+1 = 2 (BRP+1)で分周=プリスケーラ分周比設定ビット(16MHz/2=8MHz)
    // = fcan_8MHz/((0+1)×16Tq)=500Kbps
    C0CFGH = 0x0049u; // SJW=1,TSEG2=5,TSEG1=10 に設定 ボーレートプリスケラ(1)分周無しの場合

    // 受信ルール設定
    GAFLCFG = 0x0006u; // 受信ルール数設定
    GRWCR = 0x0000u; // 受信ルール変更準備
    GAFLIDL0 = 0x0000u; // 受信ルールID設定  比較しない
    GAFLIDH0 = 0x0000u; // 受信ルール
    GAFLML0 = 0x0000u; // 受信ルール 対応IDをマスクしない "0000"=全bitチェックしない=全て受信
    GAFLMH0 = 0xE000u; // 受信ルール 標準IDか?とデータフレームか?を比較する。
    GAFLPL0 = 0x0001u; // 受信ルール 受信FIFOバッファ0(GAFLFDP0)をのみ選択する
    GAFLPH0 = 0x0000u; // 受信ルール DLCチェックしない
    GRWCR = 0x0001u; // 受信ルール変更完了

    RMNB = 0x0010u; // 受信バッファ数設定 = 16(仮)
    RFCC0 = 0x1300u; // 受信FIFOバッファ利用 1メッセージ受信完了ごとに割り込み発生

    CFCCL0 = 0x0000u; // 送受信FIFOバッファ未使用
    CFCCH0 = 0x0000u; // 送受信FIFOバッファ未使用

    // 送信バッファ
    TMC0 = 0x00u; // 送信禁止
    TMC1 = 0x00u;
    TMC2 = 0x00u;
    TMC3 = 0x00u;

    // グローバルエラー割り込み
    GCTRL &= 0xF8FFu; // エラー割り込み関連無効(仮)

    // チャンネル割り込み,バスオフ,エラー表
    C0CTRL &= 0x00FFu; // RTBO=1:バスオフ強制復帰させる(保険)
    C0CTRL |= 0x0008u; // エラー割り込み関連無効(仮)
    C0CTRH = 0x0000u; // 送信アボート割り込み禁止、バスオフ復帰(ISO11898-1仕様)、通信テスト禁止

    // 割り込みコントローラ部の割り込み制御レジスタ
    GCTRL &= 0xFFFCu; // GSLPR=0 グローバルリセットモード⇒グローバル動作モードに変遷 (GMDC=00)
    while((GSTS&0x0001u)!=0u){} // CANグローバル動作モード変遷を確認
    RFCC0 |= 0x0001u; // RFE(1:受信FIFOバッファ使用許可)

    NOP();
    C0CTRL &= 0xFFFCu; // CSLPR=0 チャンネルリセットモード⇒CANチャンネル通信モードに変遷 (CHMDC=00)
    while((C0STSL&0x0001u)!=0u){} // CANチャンネル通信モードに変遷を確認
    NOP();
    }

    uint8_t CAN_SendStatus( void )
    {
    uint8_t ret;
    uint8_t tmp;

    do{
    tmp = TMSTS0;
    if(tmp & 0x01){
    ret = 1u;
    }else{
    switch(tmp){
    case 0x00: //送信中
    ret = 0;
    break;
    case 0x02: //アボート
    ret = 0;
    break;
    case 0x04: //送信完了(アボートなし)
    case 0x06: //送信完了(アボートあり)
    ret = 0u;
    break;
    default:
    ret = 1u;
    break;
    }
    }
    } while(0);

    return ret;
    }


    void CAN_SendStart( void )
    {
    TMSTS0 &= 0xF9u; // 送信結果フラグクリア
    while(( TMSTS0 & 0x06u ) != 0x00){} // 送信ステータス確認

    TMIDL0L = 0xA0; // 0x12; // IDを格納
    TMIDL0H = 0x00; // 0x34;

    TMIDH0L = 0x00; // 拡張ID
    TMIDH0H = 0x00; // 拡張ID最上位1ビット、IDEビット、RTRビット、送信履歴データ格納許可ビットを格納

    TMPTR0L = 0x00; // 送信履歴バッファに格納するラベル情報
    TMPTR0H = 0x40; // DLCを格納
    TMDF00L = 0xAA; // 送信データ
    TMDF00H = 0xAA;
    TMDF10L = 0xAA;
    TMDF10H = 0xAA;

    TMC0 |= 0x05u; // 送信要求 TMTRを"1"に ワンショットも合わせて
    //TMC0 |= 0x01u; // 送信要求 TMTRを"1"に

    return;
    }
    //ここまでCAN設定

    ////メインルーチン

    volatile uint16_t g_cnt2 = 0;
    static uint8_t g_toggle;

    void main(void)
    {
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */

    CAN_Init();
    //can_tja_init();
    //can_tja_start();

    while (1U){
    g_cnt2++;
    if((g_cnt2 & 0xFFFF) == 0xFFFF){
    if(g_toggle==1){
    P6_bit.no7=0;
    g_toggle=0;
    }
    else{
    P6_bit.no7=1;
    g_toggle=1;
    }
    g_cnt2=0;

    if(CAN_SendStatus()==0u){
    //can_tja_start();
    CAN_SendStart();
    //can_tja_disable();
    NOP();
    }
    }
    }
    /* End user code. Do not edit comment generated here */
    }
    //-------(ソースはここまで)
    CAN_SendStart( void )の中にTMSTS1を使いましたが正解はTMSTS0です。
Reply
  • ikkiです。
    やはり人様のソースを理解しないで使うのは危険を伴います。
    前に上げたサンプルにはバッグがありました。
    たまに動作しますが。
    訂正してもう一度上げておきます。

    //-------(以下はソース)
    // 参考:japan.renesasrulz.com/.../32649
    // 評価ボード(QB-R5F10BMG-TB)を使用したCAN通信について
    #include "CAN_api.h"
    /*--------------------------------------------- CAN_api.h
    #ifndef __CAN_API
    #define __CAN_API
    void CAN_Init( void );
    uint8_t CAN_SendStatus( void );
    void CAN_SendStart( void );
    #endif
    -------------------------------------------------------*/
    #include "r_cg_macrodriver.h"
    #include <iodefine.h>

    //CANの設定

    void CAN_Init( void )
    {
    /*----------------------------------------- (ORG)
    PM1 = 0xFBu; // P1.2 出力
    P1 |= 0x00; // P1.2 Lo
    PIOR4 |= 0x40; // = 0x40; // bin8(0,1,0,0,0,0,0,0); // リダイレクションを有効 P72,P73にCANTX,CANRX
    P7 &= 0xF7u; // P72(CTXD0)="1", P73(CRXD0)="0"
    P7 |= 0x04u; // P72(CTXD0)="1", P73(CRXD0)="0"
    PM7 &= 0xFBu; // CTXD0(P72pin)を"0":出力に
    PM7 |= 0x08u; // CRXD0(P73pin)を"1":入力に
    PIM7 &= 0xF3u; // 通常入力モード選択
    POM7 &= 0xF3u; // 通常出力モード選択
    -----------------------------------------------*/
    PIOR4 &= 0xBF;
    // PMC7 &= 0xFB;
    // P1 &= 0xFD; // P11 -> 'L' // redundant!
    P1 |=0x01; // P1 |= 0x05; // P10 -> 'H'; P12 -> 'H'
    PM1 |= 0x02; // P11(CRXD0)->Inp(1)
    PM1 &= 0xFE; //PM1 &= 0xFA; // P10(CTXD0)->Outp(0); P12->Outp(0) // 11111010
    // PIM1 &= 0xFE; // PIM10=0 // redundant!
    // POM1 &= 0xFD; // POM11=0 // redundant!
    // P1 &= 0xFB; // P12=0 (tja->ON)
    //
    // 高速オンチップ・オシレータ 使用時----------
    CAN0EN = 1u; // CANモジュールへクロックを供給
    CAN0MCKE &= 0xFE; //(yama) CAN0MCKE = 1u; // CANモジュールへX1クロックを供給(X1クロックを供給する場合のみ有効)
    NOP();

    //--------- Option-1 (Option-2もOK)
    while((GSTS&0x0008u)!=0u){} // 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チャンネルリセットモードに変遷を確認

    /*---------- Option-2
    while((GSTS&0x0008u)!=0u){} // CAN用RAMクリアを待つ GRAMINITフラグが"0"になればRAMクリア
    while((GSTS&0x0004u)==0u){} // ???? // グローバルストップモードであるかを確認 GSLPSTSフラグが"1"であればグローバルストップモード

    GCTRL &= 0xFFFDu; // GSLPR=0 グローバルストップモード⇒グローバルリセットモードに変遷 (GMDC=01)
    GCTRL |= 0x0001u;
    GCTRL &= 0xFFFBu;
    while(((GSTS&0x0004u)==1u) && ((GSTS&0x0001u)==0u)){} // CANグローバルリセットモード変遷を確認 GSRSTSTが1ならグローバルリセットモード

    while((C0STSL&0x0004u)==0u){} // CANチャンネルストップモードかを確認

    C0CTRL &= 0xFFFDu; // CSLPR=0 チャンネルストップモード⇒チャンネルリセットモードに変遷 (CHMDC=01)
    C0CTRL |= 0x0001u;
    C0CTRL &= 0xFFFBu;
    while(((C0STSL&0x0004u)==1u) && ((C0STSL&0x0001u)==0u)){} // CANチャンネルリセットモードに変遷を確認
    -----------------------*/

    // クロック, ビットタイミング, 通信速度等の設定
    GCFGL = 0x0000u; // DCS=0:fCAN=(fCLK/2)/TSP=16MHzに設定
    //(yama) GCFGH = 0x0000u; // 15-0bit ITRCP インターバル・タイマ・プリスケーラ設定
    C0CFGL = 0x0001u; // C0CFGL+1 = 2 (BRP+1)で分周=プリスケーラ分周比設定ビット(16MHz/2=8MHz)
    // = fcan_8MHz/((0+1)×16Tq)=500Kbps
    C0CFGH = 0x0049u; // SJW=1,TSEG2=5,TSEG1=10 に設定 ボーレートプリスケラ(1)分周無しの場合

    // 受信ルール設定
    GAFLCFG = 0x0006u; // 受信ルール数設定
    GRWCR = 0x0000u; // 受信ルール変更準備
    GAFLIDL0 = 0x0000u; // 受信ルールID設定  比較しない
    GAFLIDH0 = 0x0000u; // 受信ルール
    GAFLML0 = 0x0000u; // 受信ルール 対応IDをマスクしない "0000"=全bitチェックしない=全て受信
    GAFLMH0 = 0xE000u; // 受信ルール 標準IDか?とデータフレームか?を比較する。
    GAFLPL0 = 0x0001u; // 受信ルール 受信FIFOバッファ0(GAFLFDP0)をのみ選択する
    GAFLPH0 = 0x0000u; // 受信ルール DLCチェックしない
    GRWCR = 0x0001u; // 受信ルール変更完了

    RMNB = 0x0010u; // 受信バッファ数設定 = 16(仮)
    RFCC0 = 0x1300u; // 受信FIFOバッファ利用 1メッセージ受信完了ごとに割り込み発生

    CFCCL0 = 0x0000u; // 送受信FIFOバッファ未使用
    CFCCH0 = 0x0000u; // 送受信FIFOバッファ未使用

    // 送信バッファ
    TMC0 = 0x00u; // 送信禁止
    TMC1 = 0x00u;
    TMC2 = 0x00u;
    TMC3 = 0x00u;

    // グローバルエラー割り込み
    GCTRL &= 0xF8FFu; // エラー割り込み関連無効(仮)

    // チャンネル割り込み,バスオフ,エラー表
    C0CTRL &= 0x00FFu; // RTBO=1:バスオフ強制復帰させる(保険)
    C0CTRL |= 0x0008u; // エラー割り込み関連無効(仮)
    C0CTRH = 0x0000u; // 送信アボート割り込み禁止、バスオフ復帰(ISO11898-1仕様)、通信テスト禁止

    // 割り込みコントローラ部の割り込み制御レジスタ
    GCTRL &= 0xFFFCu; // GSLPR=0 グローバルリセットモード⇒グローバル動作モードに変遷 (GMDC=00)
    while((GSTS&0x0001u)!=0u){} // CANグローバル動作モード変遷を確認
    RFCC0 |= 0x0001u; // RFE(1:受信FIFOバッファ使用許可)

    NOP();
    C0CTRL &= 0xFFFCu; // CSLPR=0 チャンネルリセットモード⇒CANチャンネル通信モードに変遷 (CHMDC=00)
    while((C0STSL&0x0001u)!=0u){} // CANチャンネル通信モードに変遷を確認
    NOP();
    }

    uint8_t CAN_SendStatus( void )
    {
    uint8_t ret;
    uint8_t tmp;

    do{
    tmp = TMSTS0;
    if(tmp & 0x01){
    ret = 1u;
    }else{
    switch(tmp){
    case 0x00: //送信中
    ret = 0;
    break;
    case 0x02: //アボート
    ret = 0;
    break;
    case 0x04: //送信完了(アボートなし)
    case 0x06: //送信完了(アボートあり)
    ret = 0u;
    break;
    default:
    ret = 1u;
    break;
    }
    }
    } while(0);

    return ret;
    }


    void CAN_SendStart( void )
    {
    TMSTS0 &= 0xF9u; // 送信結果フラグクリア
    while(( TMSTS0 & 0x06u ) != 0x00){} // 送信ステータス確認

    TMIDL0L = 0xA0; // 0x12; // IDを格納
    TMIDL0H = 0x00; // 0x34;

    TMIDH0L = 0x00; // 拡張ID
    TMIDH0H = 0x00; // 拡張ID最上位1ビット、IDEビット、RTRビット、送信履歴データ格納許可ビットを格納

    TMPTR0L = 0x00; // 送信履歴バッファに格納するラベル情報
    TMPTR0H = 0x40; // DLCを格納
    TMDF00L = 0xAA; // 送信データ
    TMDF00H = 0xAA;
    TMDF10L = 0xAA;
    TMDF10H = 0xAA;

    TMC0 |= 0x05u; // 送信要求 TMTRを"1"に ワンショットも合わせて
    //TMC0 |= 0x01u; // 送信要求 TMTRを"1"に

    return;
    }
    //ここまでCAN設定

    ////メインルーチン

    volatile uint16_t g_cnt2 = 0;
    static uint8_t g_toggle;

    void main(void)
    {
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */

    CAN_Init();
    //can_tja_init();
    //can_tja_start();

    while (1U){
    g_cnt2++;
    if((g_cnt2 & 0xFFFF) == 0xFFFF){
    if(g_toggle==1){
    P6_bit.no7=0;
    g_toggle=0;
    }
    else{
    P6_bit.no7=1;
    g_toggle=1;
    }
    g_cnt2=0;

    if(CAN_SendStatus()==0u){
    //can_tja_start();
    CAN_SendStart();
    //can_tja_disable();
    NOP();
    }
    }
    }
    /* End user code. Do not edit comment generated here */
    }
    //-------(ソースはここまで)
    CAN_SendStart( void )の中にTMSTS1を使いましたが正解はTMSTS0です。
Children
No Data