Open4

CAN周りのメモ

NetetraNetetra

CANとは

  • 車とかで使われてるノイズに強い通信規格
  • 通信の速度は最大1MbpsCAN FDというCANを強化した通信規格もあって、最大5Mbpsぐらい出せる)

バス

バスというのは複数の機器が通信するとき、通信する経路を共有するような接続の形で、CANi2cで使われている。その通信経路に接続されてる各機器のことをノードと呼ぶ

NetetraNetetra

i2cとCANの比較

i2c

  • SDLとSCLと呼ばれる信号線を共有してる
  • 基本はシングルマスター・マルチスレーブ方式
    マスターと呼ばれる命令する役のノードが1つと複数のマスターからの命令を受け付けるスレーブと呼ばれるノードが繋がれる形(基本はというのは、マスターを複数にすることも可能ではあるから)
    → スレーブはマスターから命令されないと何もできないのでマスターが無いと動かない

CAN

  • CAN HIとCAN LOWと呼ばれる信号線を共有してる
  • マルチマスター方式
    どのノードも他のノードに命令することが可能で、どのノードも他のノードからの命令を受け付けれる
    → どのノードも命令を出すことが可能なので、一つ二つ壊れたノードがあっても動ける
NetetraNetetra

CANでのデータのやり取り

CANではフレームと呼ばれる決まった形式のデータを送受信する。フレームには5種類あって、それぞれデータフレーム リモートフレーム エラーフレーム オーバーロードフレーム インターフレームスペースと呼ばれる

※以下ではCANトランシーバー、CANコントローラーを使っている場合気にしなくていいインターフレームスペースや、オーバーロードフレームCRCフィールドSOFEOFなどの解説は省く

データフレーム

データを送信するためのフレーム

送受信されるデータ

  • 調停フィールド
    • このフレームが送信される優先順位とこのフレームのID
  • 制御フィールド
    • データフィールドで何byteのデータを送っているか、など
  • データフィールド
    • 送りたいデータ(8byteまで)

リモートフレーム

指定したIDのノードにデータを要求するためのフレーム

送受信されるデータ

  • 調停フィールド
    • データを送ってほしいノードのID
  • 制御フィールド
    • そのノードが返すデータが何byteか、など

エラーフレーム

エラーを各ノードに通知するためのフレーム

送受信されるデータ

  • エラーフラグ
    • 何のエラーかを表すデータが入る
NetetraNetetra

CANトランシーバーとCANコントローラーについて

CANトランシーバーとは

CANの通信経路の回路は特殊で作るとめんどい。そこでCANトランシーバーと呼ばれるICを使うと回路部分をいい感じにしてくれる。これに以下で説明するCANコントローラーを繋ぐことでマイコンからCANコントローラーに対してSPIやI2Cなどの通信方法で命令するだけでCAN通信ができる

CANコントローラーとは

マイコンでトランシーバーと直接通信するのはめんどいのでこれを間につないでおくと便利。マイコン側からはSPIやI2Cのような通信方式でCANコントローラーに命令するだけでCANでのデータの送受信ができる。また、送信バッファや受信バッファを内蔵していたり、受信フィルタや受信マスクも搭載しているのでマイコンから直接トランシーバーと通信するより楽にCANが使えるようになる

送信バッファとは

送信待ちのフレームが一時的に置かれるところ。マイコン側から送信したいデータを送信バッファに置く命令を出してデータを送信バッファにセットしておくと送信処理はCANコントローラー側でやってくれるので、マイコン側は送信処理が行われている間も他の処理ができる

受信バッファとは

受信したフレームが一時的に置かれるところ。受信する処理はCANコントローラー側で勝手に行われてデータは受信バッファに入れてくれるので、マイコンが忙しくてもデータを受信可能(暇になってから受信したデータを使った処理ができる)
受信マスク、受信フィルタは設定しておくと受信バッファに入るフレームをIDで限定できるので、特定のノードから送られてきたフレームだけを受信するみたいなことが可能

他にCANコントローラーがしてくれること

フレームの解説のところで出た、オーバーロードフレームインターフレームスペース、データフレームやリモートフレームのCRCフィールドSOFEOFはCANコントローラー側で勝手に生成してくれるので気にしなくていい