はじめに
去年末からマイコン系の作業を振られるようになりました。
Arduinoの次は、RXってレベルアップし過ぎでは?と思いつつ作業している途中、RXファミリーのCAN通信用のサンプルコードで拡張CAN IDモードが動かなかった件に躓いたので、同じように困っている人向けの記事。
ビルドなどの細かな手順は省略してます。
#環境
- ボード:RX71M-Starter-Kit-Plus
- IDE:Renesas e² studio(Version: 2022-01 (22.1.0))
- CANコンポーネント:r_can_rx rev.5.20
- ツールチェーン: Renesas CCRX v.3.03.00
- サンプルコード:r01an2472xx0520-rx-can.zip内のcan_demo_rskrx71m.zip
#サンプルコード修正箇所
- src/demo/can_api_demo.c
ループバックモードでテストするために、232行目のコメントアウトを解除
//api_status = R_CAN_PortSet(g_can_channel, CANPORT_TEST_1_INT_LOOPBACK);
- r_can_rx_config.h
拡張CANIDモードにするために、81行目のSTD_ID_MODE
をEXT_ID_MODE
に変更する。
#define FRAME_ID_MODE (STD_ID_MODE)
#現象
起動時にシリアルモニターに「Success! Sent first CAN frame.」と出力されるはずが、出力されない。
より詳細には、R_CAN_TxSetXidで送信用のデータセットした後、データが送信されず、送信状態のまま(R_CAN_TxCheck()の戻り値が、R_CAN_NO_SENTDATA(0x08)のまま)になる。
#原因
下のように、FRAME_ID_MODE
がSTD_ID_MODE
の時は、R_CAN_Control(g_can_channel, OPERATE_CANMODE);
が呼ばれているが、EXT_ID_MODE
では呼ばれていない。
OPERATEモードにしないと送受信始まらないので、そりゃ動きませんわ。
/***************************************************
* Try to send very first frame. Stop if no success.
***************************************************/
if (FRAME_ID_MODE == STD_ID_MODE )
{
R_CAN_Control(g_can_channel, OPERATE_CANMODE);
api_status |= R_CAN_TxSet(g_can_channel, g_mb_mode, CANBOX_TX, &tx_dataframe, DATA_FRAME);
}
else
{
api_status |= R_CAN_TxSetXid(g_can_channel, g_mb_mode, CANBOX_TX, &tx_dataframe, DATA_FRAME);
}
#対策
EXT_ID_MODE
の場合でも、R_CAN_Control(g_can_channel, OPERATE_CANMODE);
を実行するようにする。
#最後に
マイコン開発はプログラムが悪いのか、ハードが悪いのか(故障含む)の問題切り分けノウハウが無くて辛い。
あと、ルネサスさん。サンプルコードに含まれている説明書に、「動作確認環境」の項目にRX71Mがありましたが、どんな確認しているんですかねぇ。
とりあえず、明日ルネサスの株売っておきますね。