3.3V コントローラを使って CAN 通信

Raspberry Pi の GPIO は 3.3V です。また、これから使う予定の STM32 コントローラも 3.3V 電源で 5V は使えません。こういったことから Analog3 プロジェクトでは、3.3V コントローラから CAN 通信を行うことが重要になってきました。この問題は少し注意の必要なややこしい問題なので今まで調べたり実験したことをまとめておきます。

なぜややこしい問題なのか?

CAN 通信を行う場合、コントローラで通信を制御、物理層の面倒はトランシーバに見てもらう、という方法が一般的です。この記事ではコントローラとして MCP2515 を使った場合を例に出すことにします。マイクロコントローラから直接トランシーバを制御する場合もありますが電源電圧に関しては同じ話です。

下の図の例では MCP2551 がトランシーバです。これが基本の CAN 通信の構造です。仮定として、この基本構造で稼働している他ノードがバス上にいることにします。というか現プロジェクトではいます。

話をややこしくする要因はいくつかあって、上図のように 3.3V マイクロコントローラの先に CAN コントローラがいる場合もある、という点が一つ。もう一つの点が、CAN トランシーバの多くが 5V 稼働なこと。多くのトランシーバは 3.3V 電源では動作停止してしまい使えません。さらにもう一点気がかりなのが、5V で稼働するトランシーバと 3.3V で稼働するトランシーバは混在できるのか?という問題があります。

CAN コントローラデバイスの電源電圧

CAN インタフェースを備えたマイクロコントローラも増えてきて、専用の CAN コントローラはすたれて行く傾向にあるように思えますが、とりあえずラズベリーパイから CAN 通信する場合には専用コントローラが必要です。現在使っているのは MCP2515、使う予定に入っているのが MCP2518FD なんですが、どちらも 3.3V 電源で稼働します。というわけで、ラズベリーパイもそうですが CAN コントローラに繋ぐホストの I/O レベルが 3.3V なら、CAN コントローラもそのまま 3.3V 電源で使うのが一番簡単です。

CAN トランシーバを 3.3V I/O から使う

CAN トランシーバを 3.3V I/O から使うのは話がもう少し面倒になります。多くの CAN トランシーバは 5V 電源対応で、そういったトランシーバは、電源電圧を 5V より下げると (例えば 4.5V)スタンバイモードに入ってしまうものがほとんどで 3.3V 電源では稼働しません。そういうわけで、CAN トランシーバを 3.3V I/O で動かすには注意が必要です。

今のところ 3つの方法が見つかりました。

方法1:5V CAN トランシーバをレベルシフトして使う

MCP2551 で動作確認しました。

この方法は 5V 電源の CAN トランシーバならたいてい使えます。CAN トランシーバは 5V 電源で使い、コントローラは 3.3V 電源で使います。Tx について、たいていの 5V 電源トランシーバは 3.3V を High レベルと認識しますからそのまま繋いで大丈夫です(でもデータシートは要確認)。Rx については、抵抗器 R1 と R2 で分圧して 5V を 3.3V に落とします。

この方法は確実に実施できて手堅いですが、3.3V と 5V の二系統の電源が必要なのが痛いです。

方法2:I/O レベルが設定できるトランシーバを使う

TCAN1044V で動作確認しました。無印の TCAN1044 ではこの方法は使えないので注意。

CAN トランシーバによっては 3.3V コントローラと接続するため、I/O レベルを設定する機能が付いています。そういったトランシーバでは、コントローラとトランシーバをレベルシフトせずに直接繋げます。TCAN1044V は一例で、5 ピンを使って I/O の電圧レベルを設定できます。

このタイプの CAN コントローラは探せば結構あります。接続は単純になりますが、VCC に 3.3V を使うとやはりスタンバイモードに入ってしまい動作しません。そういうわけで、この方法でもまだ 5V と 3.3V の二系統の電源が必要です。

方法3:3.3V で稼働するトランシーバを使う

TCAN3413 で動作確認しました。

トランシーバによっては、3.3V の電源でもスタンバイモードに入らず稼働するものがあります。上記の TCAN3413 がその例ですけれども、そのようなトランシーバは 3.3V の電源が共有できます。

この方法は接続回路も単純ですし電源も 3.3V の一系統だけで動作するので最強なのですが、気がかりなのは、このトランシーバは 5V 稼働のトランシーバと混在できるのか?という問題です。これは CAN バスの仕様を満たしていれば大丈夫なはずで、TCAN3413 の場合には 5V トランシーバとの混在は可能とデータシートに明記してあります。さらに実験して大丈夫なことを確認もしました。ですが、ネット上を検索してみたら「できない」「いやいやできる」なんて意見が飛び交っており混乱しやすい点ではあります。

5V トランシーバと 3.3V トランシーバはなぜ混在できるか?

CAN バスは、下図のように2本のバスの両端に R が繋がっているループにノードがぶら下がっており、

By EE JRW – Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=38256600

二本のバス間の電位差で Dominant と Recessive を見分けています。

By EE JRW – Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=55237229

つまり、CANH の線と CANL の線との間の電位差が問題なわけであり、電圧の絶対値は Dominant と Recessive 判定と無関係です。では、CANH と CANL の電位差がどれぐらいあれば Dominant なのかというと、CAN bus の仕様 ISO 11898-2 を読んで確認したわけではありませんが、どのデバイスもだいたい 2V 以上を確保するようです。また、電圧の絶対値は判定に無関係とはいっても、コモンモード電圧が極端に異なるノード同士を接続するのはちょっと考えてみても実装の難しさ、安全性、ノイズ放射などの点から現実的ではありません。CAN 規格でもコモンモード電圧の範囲は決められているようです。Dominant 時のコモンモード電圧 (CANH + CANL) / 2 は GND から 1.5V から 3.5V の範囲に入っていることが条件で、TCAN3413 の場合には 1.9V に設定されているようです。Recessive 時にはコモンモード電圧は ±12V が求められているようですが TCAN3413 ではこれも 1.9V です。

いつも CAN トランシーバを購入するとき「高いなー」とぼやいていますが、データシートを読むと考慮すべき点が非常に多岐にわたってあるのがわかります。それに基本的には車載用のデバイスですから誤動作や破損したら人命にかかわりかねない、ということでトランシーバの設計・製造は実はすごく大変なんだなと思います。1ドルちょっとで買えるのはむしろ安いのかも?

Comments

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

コメントを残す

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

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