Baud
プロトコル一覧

CAN

2 本線のバス。ID が小さい方が勝ち、すべてのフレームに CRC が付く。

標準データフレーム

ID 0x123 で 2 バイトのデータを送るフレームです。CRC もスタッフビットも実際に計算しています。同じビットが 5 つ続くたびに余分なビットが挿入される様子を見てください。

CAN0001001000110000011011011110101011010001011011011101011111111識別子 0x123DLC = 2データ 0 バイト…データ 1 バイト…CRC-15 = 0x0B6EEOF(レセッシ…区分データ 0 バイト目71615041312111000xDE222データ 1 バイト目71605140312110010xAD173

フレーム全体

2 バイトのペイロードに、線上で 61 ビット時間かかり、うち 1 ビットがスタッフビットです。SOF から CRC まではスタッフィングされ、終わりの固定形式部分はされません。500 kbit/s なら 122 マイクロ秒です。

  1. SOF

    Start Of Frame。ドミナント(0)の 1 ビットです。バスはアイドル時にレセッシブ(1)なので、この立ち下がりで全ノードに「フレーム開始」を知らせ、ビットタイミングを合わせます。

  2. 識別子 0x123

    11 ビットの識別子(MSB から)です。宛先ではなく「どんなメッセージか」(例: エンジン回転数)を表します。同時に優先度でもあります。2 つのノードが同時に送ると、ドミナント 0 がレセッシブ 1 を上書きするため、数値の小さい方がアービトレーションに勝ちます。0x123 = 291。

  3. RTR

    Remote Transmission Request。0 は通常のデータフレーム、1 なら「この ID を送って」という要求になります。

  4. IDE

    Identifier Extension。0 は標準の 11 ビット識別子、1 は拡張 29 ビット形式です。

  5. r0(予約)

    予約ビット。ドミナントで送ります。

  6. DLC = 2

    Data Length Code。このあと 2 バイトのデータが続きます(0〜8)。4 ビットなので、クラシック CAN では 9〜15 も 8 を意味します。

  7. スタッフビット

    同じビットが 5 つ連続した(00000)ので、送信側が 1 を 1 つ挿入します。CAN にはクロック線がなく、受信側はエッジで同期を取り直します。5 ビットごとにエッジを強制することで、同期に十分な変化を保証します。スタッフビットは受信側が自動で取り除くので、データには含まれません。

  8. データ 0 バイト目 = 0xDE

    0 バイト目のペイロード(MSB から)。CAN フレームは最大 8 バイトで、意味はこの ID の信号定義を作った側が決めます。

  9. データ 1 バイト目 = 0xAD

    1 バイト目のペイロード(MSB から)。CAN フレームは最大 8 バイトで、意味はこの ID の信号定義を作った側が決めます。

概要

CAN(Controller Area Network)は自動車のために作られました。多数の ECU が 1 対のより線を共有し、バスが空いていればどのノードも話せます。メッセージは宛先アドレスではなく ID で区別され、全ノードがすべてのフレームを見ます。

2 つのノードが同時に送り始めると、どちらも ID を送りながら線を監視します。ドミナントの 0 はレセッシブの 1 を上書きするため、1 を送ったノードに 0 が見え、負けたと悟って黙ります。勝った側のフレームは壊れません。アービトレーションに時間のロスがないのです。

基本情報

信号線
CAN_H, CAN_L (differential)
クロック
なし(エッジ再同期 + スタッフィング)
よくある速度
125 k / 500 k / 1 Mbit/s
ペイロード
0〜8 バイト(CAN FD は 64 バイト)
調停
ID が小さい方が勝つ(ビット単位)
誤り検出
CRC-15 + stuffing + ACK

使われる場面

  • 自動車・トラック: エンジン、ブレーキ、ボディ電装(OBD-II は CAN の上で動く)
  • 産業機械・農機(CANopen、J1939)
  • 堅牢なマルチノードバスが要るロボット、ドローン、電動バイク

つまずきやすい点

  • バスの両端に 120 Ω の終端抵抗が必要です。ないと反射でランダムにエラーが出ます。
  • ID は宛先ではなく優先度です。安全に関わるメッセージには小さい ID を割り当てます。
  • 全ノードでビットレート(とサンプルポイント)を揃える必要があります。違う速度のノードは毎フレームでエラーを出し、バスを乱します。

出典・規格

  • ISO 11898-1 (CAN data link layer)
  • Bosch CAN Specification 2.0

関連するプロトコル