VCA モジュールを CAN ネットワークに入れたところで、今まで見えなかった新たな問題が見えてきました。Analog3 のネットワークは、電源投入時にモジュール間のやり取りを一斉に開始するため、トラフィックのバーストが起きやすく、ラズベリーパイで実装しているミッションコントロールが処理について行けずメッセージを取りこぼしてしまうのです。いずれバーストを軽減するための仕組みを入れるかもしれませんが、こんな簡単にメッセージを取りこぼしてしまうのは問題外。基本性能を上げる必要があります。今まで CAN コントローラには MCP2515 を使っていましたが、古いデバイスで性能不足、かねてから視野に入っていた、MCP2518FD への移行をやらなくてはならなくなりました。MCP2518FD にはメッセージの FIFO が入っているので一時的なバーストには対応できることに期待です。

実装はまだ完了はしていませんが、一通りは動くようになりました。現在 Github レポジトリの mcp2518-dev というブランチで作業中です。
https://github.com/naokiiwakami/can-controller/tree/main
MCP2518FD はもはや「ちょっとした外付けデバイス」とは違います。CAN 機能を内蔵しているマイクロコントローラが増えている昨今、外付けの専用コントローラ一本なんて廃止の方向なのでは?と思ってたんですけれども、実際繋いでみるとびっくりの多機能高性能です。クロックは 40MHz まで受け付けて CAN FD の 8Mbps の通信速度に対応、FIFO だけでなく稼働中にも設定を変えられるフィルタ、タイムスタンプ、送信ログ、などなど、よそにはない機能がてんこ盛りです。そういうわけで、操作も MCP2515 より大分複雑です。ですが、MCP25xx コントローラシリーズの弱点は SPI インタフェースでの外付けのため速さに難があることでしたが、SPI クロックは 2515 の 10MHz 上限に対して 2518 では 20MHz、SPI 通信のオーバヘッドはやや軽くなりました。とはいえ操作が多くなったので実際のスピードはよくわからないんですけどね。
機能が複雑になっただけに実装は困難を極めました。設定の必要な部分の多いこと多いこと。組み込みの実装は、レジスタの叩き方など「データシートを読むだけだけどそれが時間かかる」部分はかなり AI にやってもらってますが今回は AI も正しい設定ができず途方にくれました。しかし、 Microchip から MCP2518FD 用の API がサンプルプログラムとして出ているのが見つかり、これを参考にすることでやっとまともに動き出しました。だってね。データシートもリファレンスマニュアルもものすごく不親切なんだもの。これサンプルプログラムなしに実装できる人いるのか?と思ったぐらいです。
サンプルプログラムは当然マイクロチップのデバイス向けでそのままは使えませんでしたが、レジスタまわりの定義が書いてあるヘッダファイルだけは移植可能でそのまま使わせてもらいました。ありがたし。ある意味データシートを充実させるより現実的かもしれません。
下の絵はミッションコントロールの立ち上がり時に行うモジュールの点呼の模様。いまネットワークには 1 モジュールしかいないので、1メッセージ対1メッセージのやり取りです。Channel 6 の信号は CAN コントローラの割り込みピンで、0 レベルの割り込み信号が 1 レベルに戻る時間がメッセージの応答時間です。今のところ約 300 μs、1メッセージ分より長く応答にかかっているので、メッセージが連続で来ると処理が怪しくなりそうです。もう少し速くしたいところですがまずは動かすことに注力したいです。

SPI クロックを 20MHz まで上げると今度はロジアナが付いてこられなくなるようです。デバッグ時には遅くするなどで対応するしかなさそうです。追いつかないのは多分 USB 通信だと思うので USB タイプのロジアナはこの辺が限界でもう上がらないのかな?あるいは新しい世代の USB ならついてこられることもあるのかな?でもまあ数百ドル程度のロジアナで 25M サンプリングできるというのがすでにものすごいとは思うんですけれども。
