はじめに
初心者の備忘録です
情報収集能力が低いため,ソースはGeminiです.
でもコードはちゃんと動くと思います.
誰に向けた記事か
- CANの送信,受信は一旦できた.
- でも途中で送信が止まっちゃう.
- Bus-Off状態から復帰したい.
Bus-Off状態について
FDCANではTX,RXそれぞれでエラー数をカウントしており,エラー数が一定数を超えるとBus-Off状態となりCANが停止します.
以下ではTXでのエラーについて述べます.
エラーとは,例えばデータを送信したあとにACKが返ってこない状態ですね.
[!TIP]
受信側が受信に成功した場合,送信側によって'1'にされたバスを'0'にすることで「受信したよ」というメッセージ,つまり"ACK"を返します.
エラーカウントの変化の仕方
上記のようにエラーが発生した場合, エラーカウントを+8します
送信に成功すればエラーカウントを-1します
エラーカウントとBus-Off状態の関係
エラーカウントが255(多分)を超えるとBus-Off状態となり,この機器のCANが停止します.
通信が不安定な状況では,徐々にこのカウントがたまるため,最初はうまくいくのに途中からCANでメッセージで送れなくなる.ということが起きるのです.
エラーカウントをLiveで見る方法
live_tecにTXのエラーカウントを
live_recにRXのエラーカウントを格納します.
PVにこれを↓
FDCAN_ErrorCountersTypeDef ErrorCounters;
uint32_t live_tec=0;
uint32_t live_rec=0;
WHILEにこれを↓
HAL_FDCAN_GetErrorCounters(&hfdcan1, &ErrorCounters);
live_tec = ErrorCounters.TxErrorCnt;
live_rec = ErrorCounters.RxErrorCnt;
以上!
Bus-Offからの復帰方法
上のコードはエラーカウントを見るためのものでした.
Bus-Offから復帰するだけなら上のコードはいらないです.
WHILEにこれを書くだけでOK!
if ((hfdcan1.Instance->PSR & FDCAN_PSR_BO) != 0) {
HAL_FDCAN_Stop(&hfdcan1);
HAL_FDCAN_Start(&hfdcan1);
}
Bus-Off状態かどうかを示すフラグを見て,それが立っていればFDCANを再起動する.という簡単なコードです.
参考文献
Gemini 3.1Pro