CAN通信について

RL78 F13/F14を使用しています。初心者です。

CAN通信のところで躓いています。

元々受信バッファ、送信バッファを使用してCAN通信を行っていたのですが、

受信できるIDを増やすために受信FIFOを実装しました。

割り込み設定、データの取り込みまではうまくいったのですが、

受信FIFOを使用してCAN信号を取り込むと

受信したID(RFIDL/RFIDH)、データ情報(RFDF00~RFDF33)がいつの間にか

送信バッファ(TMIDH/TMIDL)、送信データ(TMDF00~TMDF33)に上書きされています。

レジスタの設定を一つ一つ見直していますが、おかしいところが見当たりません。

当然、送信バッファに受信FIFOのデータを代入する処理も行っておりません。

どのような原因が考えられるでしょうか?

今は送信の処理をコメントアウトしていますが、送信の処理を入れると

いつの間にか上書きされているため、想定外のIDとデータを稀に送信してしまいます。

以下、ソースコードです。

=============================================

#pragma interrupt INTCANGRFR CanFIFORcvInterrupt

void caninit(void) //CAN通信初期設定
{
DI(); //割り込み禁止
PM1.0 = 0;
P1.0 = 1;
PM1.1 = 1;
CAN0EN = 1; //CANモジュールイネーブル(fclk)

while((GSTS&0x0008)!=0){} //CAN用RAMクリアを待つ GRAMINITフラグが"0":RAMクリアになったか?
GCTRL = 0x0001; //GSLPR=0 グローバルリセットモードに変遷 (GMDC=01)
while((GSTS&0x0001)==0){} //CANグローバルリセットモード変遷を確認
C0CTRL &= 0x0001; //CSLPR=0 チャンネルストップモード⇒チャンネルリセットモードに変遷
while((C0STSL&0x0001)==0){} //CANチャンネルリセットモードに変遷を確認

GRWCR = 0x0001; //RPAGE=1
GCFGH = 0x0000; //タイムスタンプ/ミラー機能/DLCフィルタ/送信優先順位
GCFGL = 0x0000; //インターバルタイマプリスケーラー(FIFO時のみ)
C0CFGH = 0x012F; //SJW:2Tq/TSEG2:3Tq/TSEG1:16Tq
C0CFGL = 0x0001; //fCAN / ((BPR + 1) * 1ビットタイムのTq数)
//250Kbps=10000KHz/((BRP+1)*20Tq)
/************************************/
/*   CAN受信ルール設定 */
/************************************/
GAFLCFG = 1; /*チャネル0受信ルール数設定(r_cg_userdefine.h)*/
GRWCR = 0; /*受信ルール・アクセス用にウインドウ0に切り替え*/
/*受信ルール1*/
GAFLIDL0 = 0x0000; /*受信ルールのID設定(下位バイト)*/
GAFLIDH0 = 0x8000; /*IDE=拡張ID RTR=データ・フレーム 受信ルール対象メッセージ=他ノードからの受信時 受信ルールID設定(上位バイト)*/
GAFLML0 = 0x0000; /*IDビット(下位バイト)を比較する*/
GAFLMH0 = 0x0000; /*IDEビットを比較する RTRビットを比較する IDビット(上位バイト)を比較する*/
GAFLPL0 = 0x0001; /*受信バッファを使用しない 受信バッファ番号=0 CAN0送受信FIFOバッファを選択する 受信FIFOバッファ0を使用しない*/
GAFLPH0 = 0; /*DLCチェックしない 受信ルール・ラベル情報なし*/
GRWCR = 1; /*受信ルール・アクセス用にウインドウ1に切り替え*/

/***************************************/
/* 受信FIFOバッファの設定 */
/***************************************/
RFCCL0 = 0x1102; /*1メッセージ受信完了毎に受信FIFO割り込みを発生する。*/
CANGRFRPR0 = 1; //CAN受信割込プライオリティ設定
CANGRFRPR1 = 0; //01:レベル2
CANGFRMK = 0; //送受信FIFO受信割込マスクフラグ
/***************************************/
/* 送信バッファの設定 */
/***************************************/

※送信バッファの設定をしなくてもTMIDH/Lに値が書き込まれている確認するためにコメントアウト中

//送信バッファ設定
/* TMIEC = 0x000F; //CAN0送信バッファ0~3の割込み許可
C0CTRH |= 0x0080; //ERRD=1:エラー全表示
CAN0TRMMK = 0; //CAN送信割込マスクフラグ 0:許可
CAN0TRMPR0 = 0; //CAN送信割込プライオリティ設定
CAN0TRMPR1 = 1; //01:レベル2
*/
GCTRL &= 0xFFFC; //グローバル動作モードへ
wait();
while (GSTS & (1<<0)) //遷移待ち(GRSTSTS==0)
{;}
RFCCL0 |= 0x0001; /*受信FIFOバッファの許可*/
C0CTRL &= 0xFFFC; //チャネル通信モードへ(CSLPR=0)
//wait();
while (C0STSL & (1<<0)) //遷移待ち(CRSTSTS==0)
{;}
EI(); //割り込み許可
}

__interrupt void CanFIFORcvInterrupt(void) //受信完了割り込み
{
DI(); //割り込み 禁止
RFSTS0 &= 0xFFF7; //CFIF受信FIFO割り込み要求クリア
CAN_SID2 = RFIDL0; //IDを格納
CAN_DATA2[0] = RFDF00L; //Data0を格納
CAN_DATA2[1] = RFDF00L; //Data1を格納
CAN_DATA2[2] = RFDF10L; //Data2を格納
CAN_DATA2[3] = RFDF10H; //Data3を格納
CAN_DATA2[4] = RFDF20L; //Data4を格納
CAN_DATA2[5] = RFDF20H; //Data5を格納
CAN_DATA2[6] = RFDF30L; //Data6を格納
CAN_DATA2[7] = RFDF30H; //Data7を格納
RFPCTR0 = 0x00FF; //バッファポインターインクリメント
EI(); //割り込み 許可

}

Parents
  • ご連絡ありがとうございます。

    確認してみましたが、その設定は残っていませんでした。

    現象的には領域を破壊しているような感じですよね。。。

    受信割り込みの処理については、1つのメッセージを受信するたびに割り込みに入れるような設定にしているため、

    このプログラムでは大丈夫な気がしますが、その設定をしていないとそうなりそうですね。

    メッセージがたまってから読み出す処理はまだ難しそうなのでやっていませんが、将来的には割り込み回数を減らしたいので実装したいと思っています。

Reply
  • ご連絡ありがとうございます。

    確認してみましたが、その設定は残っていませんでした。

    現象的には領域を破壊しているような感じですよね。。。

    受信割り込みの処理については、1つのメッセージを受信するたびに割り込みに入れるような設定にしているため、

    このプログラムでは大丈夫な気がしますが、その設定をしていないとそうなりそうですね。

    メッセージがたまってから読み出す処理はまだ難しそうなのでやっていませんが、将来的には割り込み回数を減らしたいので実装したいと思っています。

Children
No Data