自動車の車内通信でポピュラーなCAN通信をやってみたく、色々トライ中。
CANコントローラにはMCP2515、
CANトランシーバには、MCP2551
というデバイスがあることが分かり、とりあえず購入。
MCUはPIC16F886を使用。
参考書はCQ出版 「動かして学ぶCAN通信」(¥2600税別)。
とりあえず、書籍どおり回路を組んでみる。
CANコントローラとPICの通信(CANの前にもう1つ通信がある!)は、
「SPI」という通信方式で行うそうで。
PIC16F886に標準でこの機能があるのでそれを利用しようと計画。
しかし、ここからが泥沼の日々。
書籍で使用しているプログラム言語はC言語。
ワタクシはアセンブラを使用。
うーん。時代はC言語が主流なんですかねぇ。
とりあえず、MCP2515のRX0BFピンを出力にして、LEDをピッカリさせてみようと、
四苦八苦しながらプログラムを書いてみました。
しかし、反応無し。
ネットで検索しても、参考になる情報が見つからない。
試行錯誤の末、SPIの設定がよろしくない事が判明。
MCP2515はSPIモード0,0か1,1に対応との事で、
PICのSSPCONレジスタのCKPを0、SSPSTAレジスタのCKEを0にしていたのですが、
CKP,CKE共に1すると動作しました。理由はよく分かりません。
タイミングチャートを見ても理解不能だし、
SPIのモードってのもよく分からないし、
とりあえず動くので放置です。
気を良くしてLEDを0.5秒間隔でピカピカさせてみましたYO。
次に、MCP2515のレジスタの内容を読んでみようと試みましたが、
またもやうまく動作しません。
自分で書き込んだレジスタの状態を読んだのですが違う値が出ます。
他のレジスタを読んでも、8ビット目が必ず1になり、
その他が左に1ビットシフトしているような感じになっていました。
試行錯誤の末、SSPSTAレジスタのSMPを1にすると改善されましたYO。
MCP2515のデータは半クロック分遅れて送信されているようで、
出力データの後縁で読むとうまく動作しました。
結論
・PICのSPIモードはCKP,CKE=1,1にする
・SMP=1とする
これでとりあえずCANコントローラとの通信は可能になりましたYO。
しかし、PICを使ってCAN通信をする人は少ないのか、
参考になるページや書籍が少ないですねぇ。
CAN通信をするまでにはまだ道のりは遠そうです。
0 件のコメント:
コメントを投稿