RH850F1KHで自動生成コードをベースでCANドライバーを作る3

前記事では北斗電子さんHSBRH850F1KH176向けにRH850自動コード生成し、RH850/U2A 用のCANドライバサンプルコードをRH850F1KH用に移植し、CAN送信をテストまでできました。今回は受信をテストします。その覚書きです。テスト環境は前記事と同じです。一先ず送信までできていれば、ハード的には送受信OKのはずです。


受信ルール は旧来のCAN Message Box の CAN ID Mask を包括したものといえます。受信ルール 数は以下のようになっています。

適用受信ルール数
CAN UNIT 一つあたり256
CAN Cahnel任意、0~256

受信ルール のCh毎割当ては r_rh850_can_cfg.c にて以下のように設定します。Channel の group が 2つに分かれ 、リトルエンディアンなので定義の一番下が Ch. 0 になります。分かっていてもついつい上から Ch .0 と思い書いてしまいがち、なかなか気付ずトラップです。Ch毎割当数==0では受信無反応となってしまいます。

can_rx_rule_num_t	g_can_rx_rule_num[ USED_UNIT_NUM ]  = {
// ========================== U n i t 0 設 定 ==========================
	{
		{		// group0 (ココ注意Trap:一番下がch0)
		 	0,	// Ch3
		 	0,	// Ch2
		 	16,	// Ch1
		 	16,	// Ch0
		},
		{		// group1 (ココ注意Trap:一番下がch4)
		 	0,	// Ch7
		 	0,	// Ch6
		 	0,	// Ch5
		 	0,	// Ch4
		},
	},
};


CAN ID 一つづつに受信ルール を割当てれば、 F1KH の176pinなら 256の CAN ID+データ を受信できそうですが、後述する 受信Buffer の制約を受けます。 むろんCAN ID MASK値を絞って一つの受信ルール で複数のCAN IDでを受信してもOKですが、CANデータは素早くRAMに退避する必要があります。

取り急ぎテストでは以下のように、受信ルール が 1つにつき、CAN ID 一つで行うとします。

CAN Ch.CAN ID受信ルール
00x1000
00x1011
10x20016

受信ルール の定義コードは以下の通りです。受信ルール の4つのSFR: ID、MASK、ポインタ0、ポインタ1 詳細はF1KHマニュアルを見ます。MASK値の ID種、Frame種、Node種は 基本1を立てます。32bit 16進数表記では間違い易いため、 弊方では設定マクロを追加しています。

const uint32_t g_rxrule_table[ USED_UNIT_NUM ][ CAN_RX_RULE_NUM ][ 4 ] = {
// ========================== U n i t 0 設 定 ==========================
	{
		// ------------------------ C h 0 設 定 ---------------------------
		{ // [0]
			CAN_RX_RULE_ID(0/*標準ID*/, 0/*DataFrame*/, 0/*他Node*/, 0x100/*ID*/),
			CAN_RX_RULE_MASK(1/*ID種*/, 1/*Frame種*/, 1/*Node種*/, 0x7FF/*ID*/),
			CAN_RX_RULE_PTR0(0x0000/*label*/, 1/*buf使用*/, 0/*buf番号*/, 8/*dlc*/),
			CAN_RX_RULE_PTR1(0x000000/*送受信FIFO*/, 0x00/*受信FIFO*/),
		},
		{ // [0]
			CAN_RX_RULE_ID(0/*標準ID*/, 0/*DataFrame*/, 0/*他Node*/, 0x102/*ID*/),
			CAN_RX_RULE_MASK(1/*ID種*/, 1/*Frame種*/, 1/*Node種*/, 0x7FF/*ID*/),
			CAN_RX_RULE_PTR0(0x0000/*label*/, 1/*buf使用*/, 1/*buf番号*/, 8/*dlc*/),
			CAN_RX_RULE_PTR1(0x000000/*送受信FIFO*/, 0x00/*受信FIFO*/),
		},
・・・ 中略 (定義の欠番はNG) ・・・ 
		// ------------------------ C h 1 設 定 ---------------------------
		{ // [16]
			CAN_RX_RULE_ID(0/*標準ID*/, 0/*DataFrame*/, 0/*他Node*/, 0x200/*ID*/),
			CAN_RX_RULE_MASK(1/*ID種*/, 1/*Frame種*/, 1/*Node種*/, 0x7FF/*ID*/),
			CAN_RX_RULE_PTR0(0x0000/*label*/, 1/*buf使用*/, 16/*buf番号*/, 8/*dlc*/),
			CAN_RX_RULE_PTR1(0x000000/*送受信FIFO*/, 0x00/*受信FIFO*/),
		},
・・・ 中略 (定義の欠番はNG)・・・ 
		
		


RH850では受信内容の取得方法が2つあるようです。今回はその中でシンプルな 受信Buffer による受信でテストします。 受信Buffer 数は以下のとおりです。

適用受信Buffer数
CAN UNIT 一つあたり128
CAN Cahnel任意、0~128

CAN ID に一つづつ受信Buffer を割当てれば、 F1KH の176pinなら 128コCAN ID+データ を同時期に受信でき、最新のそれぞれのCANデータ内容をSFRに保持でき、最も効率的といえます。むろん受信Buffer を複数のCAN IDで使いまわしてもOKですが、CANデータは素早くRAMに退避する必要があります。

受信Buffer は 送信と異なり CAN Channel の割当てはなく、一つの CAN UNIT 内で自由です。 受信ルール が 1つにつき、受信Buffer を一つ割当てます。上記のコード例では以下のように割当てています。

CAN ID受信ルール受信Buffer
0x10000
0x10111
0x2001616


設定は、API: R_CAN_Init() の中で行われます。CAN通信中には行うべきものではないようです。注意点は各数は以下のようななっています。

適用
受信ルール255
受信ルールSFRセット16

これは受信ルール のページ番号を 0~15 に切替えながらSFR を使い回す仕組みになっています。弊方では「U2Aとの違い?」と勘違いしてしまいました。 受信ルール の現在設定値もSFR値をウオッチしても分からないんです。 受信ルール は一つづつテストしていくしかなさそうです。


受信Buffer による受信では受信完了割込みは発生しません。 API: R_CAN_ReadRxBuffer() でポーリングチェックします。ただCANドライバのOriginal仕様では 、ポーリング周期内に複数CAN Frame受信するケースには対応していません。弊方ではここは改造しました。その呼出し部は以下のような感じです。

	  uint32_t		last_tm = 0;
	  uint32_t		now_tm = 0;
	  uint8_t 		CAN_RxBufIdx[ CAN_RX_MAX_1MSEC ];	// 受信Buffer Index
    can_frame_t 	CAN_RxBuffer[ CAN_RX_MAX_1MSEC ];	// 受信Frame内容
	
    while ( 1U ) {
    	/// 初期化待ち ///
    	if ( complateInit == FALSE ) {
 ・・・ 中略 ・・・    	
    		}
    	}
    	/// 初期化済み ///
    	else {
    		now_tm = R_Config_TAUB_Get1msTimer();

    		if ( now_tm - last_tm > 0 ) {	// 1ms経過した
    			// 全CHからの受信CHECK
    			retCan = R_CAN_ReadRxBuffer(
   					0                 /*unit*/,
						CAN_RX_MAX_1MSEC,	/* 同時受信Frame max数 */
						CAN_RxBufIdx,		  /* 受信あったBuffer番号*/
						CAN_RxBuffer 		  /* Frame内容*/ );
    		}
 

テストは BUSMATER から疑似CAN Frame を送信し、e2Studio + E1 でStudioで内部をウオッチして確認します。Ch.0 、Ch.1ともに。


これで RH850F1KH で、自動コード生成とサンプコードを用いて最短(?)で動作検証およびプラットフォーム作成ができました。延べ3week程度でしょうか?

手順とそのポイントは以上ですが、RH850F1KH を直ぐに動かしたい、工数がない、自身がない会社さん等はご相談を受付けています。ある程度の有償でもよろしければこちらまでご一報ください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です