これまで、CAN制御には、SPI制御のMCP2515をよく使っていたのですが、実装のスペースや手間を考えると、CAN内蔵のPICを使うのがよさそうなので、試用してみました。今までMCP2515を使っていたので、わりと簡単に動かせるようになりました。
実用の目処が付きましたので、忘れないうちにまとめるという意味でも、ブログに掲載しておきます。
今回は手持ちの関係でPIC18F4580を使用していますが、レガシィ・モードを使っているので、CAN内蔵の18Fシリーズだとすべてに対応できると思います。
ちなみに、最近RX62NでCAN制御することができましたので、その弾みで、ということもあります。そちらは、インターフェース誌の2011年6月号に掲載予定ですので、興味がある方はごらんください。
下記写真は実験に使う基板ですが、ブレッドボードでも簡単に作れます。
●SPI CANコントローラMCP2515と18F4580の比較
MCP2515と18F4580のどちらもマイクロチップ社の製品ですので、制御方法は似ています。18F4580の内蔵CANコントローラはECANコントローラと呼ばれ、標準的なCAN機能のほかに拡張機能が搭載されています。
今回は一番標準的なレガシィ・モード(モード0)で使用しますが、このモードはMCP2515とほぼ同等の機能があります。モード0で使う分には、直接レジスタを操作する以外は、ほぼMCP2515と同じように扱うことができます。
CANに関しては外付け部品はトランシーバだけなので、実装面積が減り、省配線にできます。SPIで必要だった4本の信号線も、CTX、CRXの2本だけになりますので、I/Oの数も2本稼げます。トランシーバにはMCP2551がそのまま使用できます。
CANコントローラがMCUに内蔵されているため、直接レジスタを操作でき、MCP2515で必要だったSPI通信などの余計な処理が不要です。そのため簡単に高速でアクセスできます。たとえば、MCP2515では受信完了のステータスはいちいちSPI通信でステータス・リード・コマンドを発行してその結果を読み出していましたが、18F4580では割込フラグがセットされているかをレジスタから直接読み出すか、または割込発生で判断できます。
18F4580のモード0では、MCP2515と同様、二つの受信バッファ、三つの送信バッファが利用できます。マスク二つ、フィルタ五つというのも同じ構成です。
今回は関係ありませんが、拡張モード(モード1、モード2)では更に送受信切り換え可能なバッファが六つ用意されています。更にモード2では、これらのバッファは最大8レベルのFIFOとしても利用できます。また、フィルタも更に10個増えて合計16個利用できるようになります。フィルタ15は切り換えにより、第三のマスクとしても利用できます。
TIMER1とCCP1を併用することで送受信の正確なタイムスタンプを得ることができます。この機能を使えば、CANバスモニタを製作するときに、正確な時間でロギングできます。いずれ、モード2でFIFOなどを利用して高性能(?)なCANバスモニタを作りたいと考えています。
●使用機材
今回は筆者が数年前に製作だけして放置していた、#240というDIP形状の基板を利用して話を進めますが、外付け部品が少ないので、ブレッドボードでも簡単に作れます。PICとMCP2551(トランシーバ)のほかは、クリスタル、LED、抵抗、コンデンサなどちょっとしたものだけです。
必要最小限の回路図を示します。
実験としては、どちらも18F4580にしてもかまわないのですが、通信ものを初めて作るときは、デバッグの際にどちらが動いていないか(またはどちらも動いていないか)がわからずに苦労します。一方が確実に作動していれば、それを目標に作ればよいので、かなり楽になります。
●実験の目的
今回は、PIC18F4580を使った基本的なCAN通信の確立を目指します。二つのCANノードを接続して送受信ができることを確認します。
●#240 CAN-PICモジュール基板について
今回使用する#240基板について簡単に説明します(外観は冒頭写真など参照)。
この基板は40ピンDIPタイプのPICが実装可能で、CANコントローラ付きのPIC18F458、18F4580などを対象にしています。
CANトランシーバとCAN用ナイロン・コネクタ、LED、タクト・スイッチなどが実装可能で、電源をつなぐだけで、CANノードとしてある程度の動作が可能です。
細いタイプのピンヘッダをつければ、40PIN 600mil幅の標準的なICソケットに実装可能ですので、既存の40ピンPICと置き換えが可能です。その場合、既存の回路と干渉を避けるため、クロック・ピンとCANのCRX、CTXピンはピンヘッダから切り離しができるようになっています。
UART用のコネクタ(ピンヘッダ)が実装できますので、RS-232Cレベル・コンバータやUSB変換ICを接続すれば、シリアル通信も可能です。また、I2C/SPI用コネクタも実装できますので、I2CまたはSPIデバイスと直接接続することができます。UARTでPCと接続してPC側でターミナル・ソフトを使い、デバッグに使用することもできます。
ICSP用コネクタ(ピンヘッダ)も実装できます。
この基板は、PICに16F886、CANコントローラにMCP2515、トランシーバにMCP2551を使ったマイコン・ボードです。LCDと四つのLED、三つのタクト・スイッチが実装可能です。
CAN用に二つのナイロン・コネクタが実装可能です。また、UART用、I2C/SPI用ナイロン・コネクタも実装可能です。
今回はPIC18FノードからのコマンドでLEDを点灯させたり、カウンタ値をLCDへ表示させたり、タクト・スイッチの状態をPIC18Fノードに通知するなどの処理を行います。
●実験1の概要
まずはCAN受信はひとまず置いておいて、CAN送信オンリのプログラムを作成します。ノード1(PIC18F4580側)では送信バッファを二つ使用し、それぞれ専用のメッセージを送信するようにします。
メッセージの一つはノード2(#221 LCDボード)のLEDをONするコマンド、もう一つはOFFするコマンドです。一つのバッファを書き換えながら交互に送信してもよいのですが、二つのバッファが動くことを確認するためにメッセージごとにバッファを割り当てました。
動作の途中でメッセージを書き換えないならば、初期化の際に一度メッセージを設定しておけば、送信のタイミングで送信要求を出すだけ済みます。今回は1秒周期で二つのメッセージの送信要求を交互に出すようにしました。
●実験2の概要
次の実験プログラムはCAN受信機能を追加して、ノード2のスイッチ操作によりノード1のLEDをON/OFFさせるというものです。ノード1からの1秒間隔でLEDをON/OFFするコマンドの送信はそのまま残しておきますので、ノード2ではLEDが点滅しながら非同期でスイッチ入力を受け付けるというように少しだけ複雑になります。
参考文献 CQ出版刊 動かして学ぶCAN通信
