CAN FD に挑戦

Analog3 プロジェクトでは、ハードウェアは FDCAN 対応が進んできました。が、設定の方がまだでせっかくの FD 機能が使えてなく宝の持ち腐れでした。が、現在、モジュールのフレームワークを Embassy に引っ越しているのでファームウェアも書き直し、今が CAN FD を導入してしまう絶好のチャンスです。CAN FD 規格については知らないことや、かねてから疑問だったことが結構あるので、最低限の設定を試してみて、感触をつかむことにしました。

CAN FD とは何?なんで使いたいの?

CAN FD とは CAN 2.0、いわゆる Classic CAN の規格を拡張したもので Controller Area Network Flexible Data-Rate が略さない名前です。どんな拡張がされているのかというと、主に二点

  • フレーム送信中ビットレートを切り替えて、データ部を高いビットレートで送ることができる
  • データ長を最大 64 byte まで伸ばせる

Analog3 で注目しているのは前者です。なんでかというと、Classic CAN の通信速度は意外と遅いからです。バスのビットレートは最大 1 Mbps、レガシー MIDI の通信速度は 31.25 baud ですがこれは実のところ 250 kbps です。つまり CAN はレガシー MIDI より 4 倍速いバスを使っていますが、アドレスや CRC などオーバヘッドが大きく、Analog3 のリアルタイムメッセージでよくある 2 byte のデータ長で送信した場合、1 メッセージを送るのに約 62 μSかかってしまいます。レガシー MIDI はバスは遅いものの 1 メッセージを送るのは通常 2 byte で済みます。1 メッセージを送るのに必要な時間を計算すると 64 μS です。ほぼ変わらない。Analog3 では MIDI よりも忙しくバスを使う予定なので、輻輳するのではないかという懸念があります。そういうわけでデータを高いビットレートで送れる CAN FD を試してみたいわけなのです。

nominal bitrate = 1Mbps, brs = 0, dlc = 2, elapsed = 61.9 μS

ビットレートを上げるには

詳細は別記事を書くかもしれませんが、CAN FD ではフレームのヘッダの FDF (FD Format) ビットを recessive にすると (CAN 2.0 では reserved bit の位置で、dominant にするように決められている)、FD フォーマットでの伝送が始まります。これだけでは不十分で続く BRS (Bit Rate Switch) ビットをセットするとビットレートが切り替わります。

実際にやってみた

まずは 2 Mbps から。ロジックアナライザのキャプチャをよく見るとデータ部と CRC 部分のビットレートが高くなっています。メッセージ送信の所有時間は 51.86 μS、まだ足りないが短くなることは確認できました。

arbitration = 1 Mbps, data = 2 Mbps, dlc = 2, elapsed = 51.86 μS

4 Mbps ならどうだろう?39.5 μS に短縮、いいぞー、

arbitration = 1 Mbps, data = 4 Mbps, dlc = 2, elapsed = 39.5 μS

これぐらいのビットレートになってくると、ビットレートの切り替えがはっきり見えるようになります。

下はビットレート切り替え前後を拡大してみたところです。

データ部に続いて CRC も高いビットレートで送りますが、ACK のところで通常の 1 Mbps に戻ります。

さてそれでは気をよくして 6 Mbps を試してみましょう。

arbitration = 1 Mbps, data = 6 Mbps, dlc =2, no propagation delay compensation

エラーになってしまいました。何が悪いかというと、ビットレートが高まると伝送の遅延が無視できなくなるのです。下図でも rx と tx がかなり大きくずれています。CAN コントローラは送信データを自分自身の rx でも確認して、送信内容と一致しなければエラーになります。

エラーは続けて dominant または recessive (勉強中です) を padding bit の間隔より長く維持するものです。

CANFD コントローラにはたいてい Transceiver Delay Compensation (TDC) という仕組みがついていてその機能を使ったところ、今度はうまく通信できました。35.3 μS、もともとの約半分の伝送時間になりました。

aritration = 1 Mbps, data = 6 Mbps, with propagation delay compensation, dlc=2, 35.3 μS

TDC は tx と rx の間の遅延を測定してサンプル点をずらすという離れ業を行います。別ページに詳しい解説を書きました

ここからさらに 8 Mbps にも挑戦したいですが今のところうまく行っていません。検討の続きに必要な部品を取り寄せ中なので高ビットレートチャレンジは今回はここまで。

非サポートノードが混じるとどうなる?

  • Classic CAN のみ対応のノードが混じると、そのノードは FD フォーマットのフレームを受け取ったらエラーになるがエラー時の動作はうまく把握できなかった(勉強中)
  • ノード同士ビットレートが異なるとエラーになり回復不能な状態に陥ってしまう。厳禁

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください