今回は、CANコントローラ MCP2515の機能について、ポイントとなる点を中心に説明します。
●CANコントローラ MCP2515について
CANコントローラにはマイクロチップ社のMCP2515、CANトランシーバには、MCP2551というデバイスを使います。番号が似ていて紛らわしいですが、筆者は最近やっと覚えました。
DIPやSOICパッケージも用意されているため手作りも容易で、DIPタイプを使えば、ブレッド・ボードでも製作可能です。
RSコンポーネンツに一部のパッケージの取り扱いがありますが、MPC2515のほうはDIPとSOICの取り扱いがないということで、リクエストはしておきました。Digi-Keyで両デバイス1セット4~500円程度で購入できます。
このコントローラは、SPIで各種マイコンと接続し、SPIのコマンドにより制御できます。今回、SPI通信はソフトウェアだけで制御しますので、マイコン側のハードウェアは、汎用出力ポートが三つ("SCK"、"SDO"、"SS")と汎用入力ポートが一つ("SDI")あれば制御可能です。プログラム容量は、CPUやコンパイラにもよりますが、2KWから4KWあれば、簡単な実験ができます。
なおSPIの信号名称はMCP2515にあわせて、"SDO"を"SO"、"SDI"を"SI"、"SS"を"CS"と表現することがあります。
CAN通信にはビット・スタッフィングやCRC計算など面倒なことがいろいろありますが、これらはすべてMCP2515が自動で処理してくれるため、ユーザはとくに意識する必要はありません。
●ビット・スタッフィング
ビット・スタッフィングとは、連続して5ビット以上同じ状態が続いたとき、その状態を反転した1ビットのデータをデータ列内に挿入することです。これは、連続した状態が6ビット以上続かないようにするための措置ですが、ビットの同期をとる際に同じ状態が継続すると、同期をとるタイミング(リセッシブからドミナントへの変化点)が検出できないため、それを防止するという意味があります。
なお、MCP2515はこのスタッフ・ビットの挿入、削除を自動で行ってくれるため、ユーザは意識する必要はありませんが、ロジアナなどで波形を測定したときに悩まないように、こういうものがあるということを覚えておいてください。
次の図は、実際の通信時にロジアナで計測したものに補足図などの書き込みを行ったものです。これはデータ・フレームの例ですが、データ長は0なので、リモート・フレームと似たような形になっています。ドミナントが5ビット以上連続している箇所が2か所あり、ビット・スタッフィングが2回発生しています
●フィルタとマスク
各CANノードは、受信したメッセージの内容を判定して、それが自分宛てのものかどうかを判別し、処理する必要があります。したがって、メッセージを受信し終わっても、結局、関係なかったということもあります。
すべてのメッセージを受信して、ソフトウェアで判定する方法もありますが、余計な処理が必要で効率が悪いため、MPC2515にはフィルタという機能が搭載されています。あらかじめフィルタにメッセージ値を設定しておいて、それと受信メッセージが一致(ヒット)したものだけを採用する[実際はMAB(メッセージ・アセンブリ・バッファ)にすべての受信データが読み込まれるが、ヒットしないものは受信バッファへ転送されないで読み捨てられる]というように働きます。MCP2515にはこのフィルタが合計七つあります。
ある特定の範囲のメッセージを受信したいという場合もあります。この場合、マスクにマスク値を設定しておけば、フィルタ値の一部をマスクすることができます。マスクされたビットは何でもよくなり、このビットはフィルタ値に関係なくなります。
マスクは各受信バッファに一つずつ、合計二つあります。
●ロールオーバ・オプション
通常、受信バッファ0にメッセージが残った状態で、続けてメッセージを受信しようとすると、オーバフロー・エラーが発生しますが、ロール・オーバ・オプションを有効にしておくと、二つの受信バッファはダブル・バッファとして働きます。もともと受信バッファ0にあったデータは自動的に受信バッファ1に転送され、新たに受信したデータは受信バッファ0に転送されます。
いうまでもありませんが、ロール・オーバが発生しているときは、受信バッファ1の内容を先に取り出す必要があります。
●試作基板の紹介
SPIでつないでおけば、後はなんとかなるだろう、という安直な考えで、年末に数種類の基板を設計し、試作しました。結果的に問題もなくちゃんと動くものが製作できました。
本連載では、この試作基板を使った通信の実験例やプログラムのサンプルを示しますが、ユニバーサル基板やブレッド・ボードを使ったマイコン・セットでもI/Oポートのアサインをあわせるか、プログラムで定義を変更することで、ほとんどそのまま使用できると思います。
次に3種類の基板を紹介します。筆者のサイトにリンクしてありますので、回路図などの詳細はそちらを参照してください。
#219 PIC CANコントローラ
CANコントローラにPIC(PIC16F886など)を組み合わせたスタンドアロンのコントローラ・ボードです。リレーや温度センサなどを接続できます。また、タクト・スイッチとLEDも実装できます。
#221 I2C/SPI/CAN LCDボード
もともとは、I2C/SPIのスレーブとして設計したものですが、CANコントローラを追加してCANノードとして製作できるようにしました。LCDのほか、タクト・スイッチとLEDが実装できます。
#220 SPI-CANブリッジ2
CANコントローラとトランシーバを1枚の基板にまとめたものです。PICをはじめ、AVRやH8などほかのCPUへ接続することで、CANノードが製作できます。ブレッド・ボード対応です。
次の写真は、ブレッド・ボード上でSPI-CANブリッジ2をAVR ATtiny2313に接続して実験したときのものです。
このデバイスは使い方を理解すれば、非常に簡単にCANノードを構築することができます。CANの特徴であるエラー検出、リカバリの機能をフルに使うとそれなりに大変ですが、単純な通信だけなら素直にプログラミングできます。
今回、レジスタやビットの定義を全部自分で記述したため、記述ミスなどが原因で、動くようになるまで数日かかりましたが(大晦日に始めて、1/2の午後に開通)、基本的には最初に作ったプログラムがそのまま作動しました。
書籍の原稿に使うこともあり、年末に内容をまとめながら、10日ほどデータシートと格闘した後、おおよその使い方を理解することができました。
制御レジスタが多いのと、SPIコマンドでレジスタへアクセスするということに多少戸惑いはありましたが、レジスタは同様の構造のものが複数あって、命名規則を覚えればそれほど複雑でもなく、またSPIコマンドについてもアクセスはわりと単純です。
-------------------------------------
