1. 今回のやりたいこと
今回のやりたいことは外付けCANコントローラを制御することです。マイコンに内蔵されているCANコントローラの制御はやったことあるのですが、外付けになったら制御がどう変わるのか、何を気にしなければならないのかを知りたく、外付けCANコントローラの制御をやりたいと思いました。
CAMコントローラの制御についてですが、ネットで調べれば制御用のライブラリが出てきますが、それを使用してしまうとCANコントローラの制御部分がブラックボックスになってしまい勉強にならないため、すべて自作します。
2. 環境
- 使用ボード:STM32F769I-DISCOVERY
- 開発環境:STM32CubeIDE
- OS:CMSIS_RTOS
- CANアナライザ:SH-C31A
- CANコントローラ:MCP2515
- CANトランシーバ:MCP2562FD
3. CANアナライザ
今回は、CANアナライザにはSH-C31A、ツールとしてはcangarooを使用しました。SH-C31Aは、3000円と安価なのでお手軽に買えるかと思います。スイッチで終端抵抗をON/OFFできるため、抵抗を用意する必要がありません。
CANを解析する環境を構築するにあたり、以下のサイトを参考にさせていただきました。
上記のサイトに記載されている対応だけでは私の使用しているPCがSH-C31Aを認識しなかったので、認識するようになった手順を備忘録として残しておきます。
私の環境では、上記サイトの対応に加えて、CANable 2.0 - Updaterからファームウェア:「slacan with FD support(b158aa7 7/6/22)」をSH-C31Aにダウンロードする必要がありました。ダウンロードするには、SH-C31AのDIPSWを切り替えてDFUモードにする必要があるため、ご注意ください。
4. 使用ハードウェア
今回は、CANコントローラにはMCP2515、CANトランシーバにはMSP2562を使用します。それぞれについて説明します。
4.1 MCP2515
MCP2515のデータシートに記載されている説明文を引用します。
マイクロチップテクノロジ社MCP2515はCAN仕様バージョン2.0Bを満足するスタンドアロンのコントロールエリアネットワーク(CAN)コントローラです。そして標準と拡張データおよびリモートフレームの送受信を行うことができます。MCP2515は、2個の受信マスクと6個の受信フィルタを持っていて、不要なメッセージをふるい落とすのに使われます。これによりホストMCUのオーバーヘッド負荷を減らします。MCP2515は工業標準のシリアル周辺機器インタフェース(SPI)によって、マイコン(MCU)とインターフェースします。
MCP2515を選択した理由は特にありません。秋月電子でCANコントローラを調べていたときに最初に目に入ってきたのがMCP2515だったため、これにしました。今思えば、今後のことも考えてCANFDに対応したCANコントローラを買えばよかったです。
4.2 MSP2562
MCP2562FDのデータシートに記載されている説明文を引用します。
MCP2561/2FD は、Microchip 社の第 2 世代高速 CANトランシーバです。MCP2561/2 と同じ機能を提供します。さらに、CAN FDに必要なより高いデータレー トをサポートするために、ループ遅延対称性を保証しています。より長いバス長に対応できるように、最大伝搬遅延を改善しました。
このデバイスは、2 Mbpsを超えるCAN FDビットレート、低静止電流、電磁適合性(EMC)、静電気放電(ESD)に関する車載グレードの要件を満たしています。
トランシーバについては、MCUと直接つなげないため、制御については意識する必要はありません。
5. 回路図
回路図は、動かして学ぶCAN通信を参考にさせていただきました。
図中のU74HC14Lはいわゆるインバーターになります。インバータの入力になっているMCP2515のINTピンは、送信または受信関連のイベントが発生したタイミングでHighからLowになる信号線です。LowからHighのエッジでもそれらのイベントを検出できるようにインバーターも今回のシステムに組み込みました。今後、送信または受信のイベントを割り込みで検出したり、ウェイクアップの実装をするときに使用できればと思います。今回の送信完了、受信処理はポーリングで行うこととします。
MCP2515周りは、リセット、発振子の回路がありごちゃごちゃしてしまうので、ユニバーサル基板上に回路を作成しました。はんだはあまり得意でないのですが、頑張って作成したので写真をアップさせてください。
6. 実装
実装について説明するとかなり長くなるため、別の記事にする予定です。また近いうちに投稿させていただきますので少々お待ちください。
ソースコードについては以下にアップロードしております。
CAN
7. 動作確認
7.1 動作環境
動作確認を行った環境を以下に載せます。
マイコン側では、受信したCANのIDとデータをUART経由でPC側へ送信するようにしています。PC側でTerminalを立ち上げて、マイコンとUART通信しているポートと接続すれば、マイコンからの送信データを表示することができます。受信はTerminalに表示されるデータで確認することとします。
なお、CANの信号を適切に伝えるためには、CANバス上のエンドノードに終端抵抗が必要になります。今回のシステムでは、MCP2562側に120オームの抵抗を取り付け、CANアナライザ側は終端抵抗のスイッチをONにしています。
7.2 送受信確認
今回、確認用に作成したプログラムで送受信するCANは以下の通りです。なお、ボーレートは250kbpsとします。
| CANID | 送信/受信 | DLC[byte] | 周期[ms] |
|---|---|---|---|
| 0x100 | 送信 | 8 | 100 |
| 0x101 | 送信 | 8 | 200 |
| 0x102 | 送信 | 8 | 300 |
| 0x103 | 送信 | 8 | 400 |
| 0x104 | 送信 | 8 | 500 |
| 0x105 | 送信 | 8 | 600 |
| 0x106 | 送信 | 8 | 700 |
| 0x107 | 送信 | 8 | 800 |
| 0x108 | 送信 | 8 | 900 |
| 0x109 | 送信 | 8 | 1000 |
| 0x300 | 受信 | 8 | - |
| 0x400 | 受信 | 8 | - |
| 0x500 | 受信 | 8 | - |
| 0x600 | 受信 | 8 | - |
| 0x700 | 受信 | 8 | - |
実際に動作させたときの様子になります。
-
送信

上の図はCANアナライザとして使用したcangarooの画面になります。データがすべて0x00のため、見栄えが悪いのですが0x100~0x109までのCANが送信されていることがわかります。 -
受信
上記のcangaroo画面の右下に「Transmit View」があるので、それを使えばマイコン側にCANを送信することができます。受信CANID:0x300~0x700、データはすべて0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07と設定して、cangaroo側から送信したときのTerminal画面を以下に載せます。

7.3 他に確認したこと
マイコン側からCANを送信したときの波形を何パターンかに分けて確認してみました。黄色い波形がCANH、水色の波形がCANLになります。マイコン側からは、ID:0x555、Data:0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07を送信しています。
-
終端抵抗ありのパターン
MCP2562側、CANアナライザ側の両方に終端抵抗を設定した場合の波形になります。受信側のCANアナライザも起動させておいて、ACKを返す状態にしています。なかなかいい波形が出ていると思います。

-
終端抵抗なしのパターン
MCP2652側、CANアナライザ側の両方の終端抵抗を取り除いた場合の波形になります。終端抵抗ありの波形と全く違うのがわかると思います。ちなみにCH、時間軸の縮尺は合わせてます。終端抵抗がないときちんとした波形が出ないとは聞いていましたが、ここまでとは想像してませんでした。

-
受信側が存在しないパターン(終端抵抗あり)
CANアナライザからCANH、CANLを抜き、誰もACKを返さない状態で波形を確認してみました。終端抵抗ありのパターンの波形と見比べるとACKが返ってきてないことがわかります。

7. 参考文献まとめ
[1]. MCP2515のデータシート
[2]. MCP2562FDのデータシート
[3]. 動かして学ぶCAN通信
[4]. 安価にCANアナライザを構築する方法
8. まとめ
今回は、内蔵されているCANコントローラが外付けになった場合、制御がどう変わるかを知るために外付けのCANコントローラを制御してみました。もともと、CANコントローラと通信するためのペリフェラルドライバを用意するくらいかなと思っていましたが、実際にそれくらいでした。あとは、CANコントローラ周りの回路を自分で作る必要があることくらいでしょうか。あまり、いいことが書けなくて大変申し訳ないです。
次は、CANFD対応のCANコントローラを購入し制御してみたいなあと思っています。みなさんも何か確認したいことがあれば、コメントしていただければと思います。(こういう場合の波形ってどうなるの??等)



