0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[STM32]なぜかFDCANの送信が途中でとまるときの対処法

0
Posted at

はじめに

初心者の備忘録です
情報収集能力が低いため,ソースは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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?