どうも高校生活最後のロボカップに向けて頑張ってる高ⅡのEaterです。
CAN通信で結構痛い目にあったので何かの役に立たないかとCAN通信が成功するまでの軌跡をまとめてみようと思った次第です。
CAN通信は車載ネットワークの一つで、いわゆるバス型の通信です。マルチマスターでIDを使って通信相手を特定するのが特徴でしょうか。I2Cと違いIDはデバイスに固有というわけではなくプログラムでIDを読んで受信するかどうかを判断する感じですね。詳しい仕様はインターネットで調べてください。
CAN通信は多数のマイコンで通信するのに大変便利な仕様なわけですがなにせ初めて使ったので通信に成功するまでかなり時間がかかりました。その過程での間違いポイントを下にまとめます。
・CANトランシーバーの電源電圧を間違えた
我々はmcp2551をCANトランシーバとして使用しています。これは電源電圧5V程度で動作します。使用していたマイコンはstm32f1シリーズで電源電圧は3.3V。しょうもない話ですが、両方の電源電圧を3.3Vに設定してしまいトランシーバが電圧不足で動きませんでしたorz。何事においてもですが動作電圧は必ず確認しましょう。
・終端抵抗を忘れた
CAN通信には終端抵抗というものが必要です。120Ω抵抗を両端にそれぞれつけなければならないのですがすっかりそれを失念。しょうもないですね。
・RS抵抗の抵抗値ミス(?)
mcp2551にはRSピンにRS抵抗というものをつけます。データシートに書かれていることがよく分からなくていまいち抵抗値の設定法がよく分からなかったのですが、とりあえずもともと10kΩだったのを2.2kΩに替えてみました。
ここまで修正を加えるととりあえず1対1の通信はできるようになりました。しかしそれでも二つのマイコンからデータを送信してもう一つのマイコンがその二つからのデータを受信しようとすると片方からのデータしか受信できませんでした。次からはそれに対する対策をまとめます。
・UARTのボーレートを上げる
この時のテストは受信割り込みが入ったら受け取ったIDとデータを配列に保存してUARTでFT232RLを経由してPCに送信、というプログラムで行っていたのですが、もしかするとUARTを送信する間に割り込みが入ってせっかく受信したデータが上書きされているのかもしれないと考え、UARTの通信速度を上げてみました。
・バッファをID別に複数用意する
上の対策をもってしても受信できませんでした。そこでいっそID別にバッファを用意してたとえ上書きされても別のIDからのデータと競合しないようにしました。
結果、主にバッファを増やしたことが功を奏して二つのマイコンからのデータを両方受信できました。ちなみにですが、一つだけF4マイコンでなんでか通信できないなぁと思っていたら通信速度の設定ミスというオチ。お粗末さまでした。
結論 : 実装するときは、仕様をちゃんと把握してまとめてから実装しましょう。
P.S.
デバッグのことは常に考えておきましょう。すべてのノードのマイコンにデバッグ用LEDをつけておくと後々幸せになれます。
通信が成功する前提でデバッグ用LEDを一つのマイコンにだけ実装するとか愚の骨頂です。
コメントお待ちしております!
RSS feed for comments on this post. TrackBack URL