概要
CAN(Controller Area Network:コントローラ・エリア・ネットワーク)は、1986年にドイツのBosch社が車載ECU(電子制御ユニット)間の通信を目的として開発した差動シリアル通信バスです。現在は車載だけでなく、産業機器・医療機器・航空宇宙分野など、高信頼性が求められる幅広い用途で使われています。
CANの最大の特徴は「高い耐ノイズ性」と「マルチマスター対応」です。CANH/CANLの2線差動信号を使うため、ノイズ環境に強く、バスに接続された全デバイス(ノード)が対等にバスを使えるマルチマスターアーキテクチャを採用しています。また、1つのノードが故障してもバス通信が維持される耐障害性も大きな強みです。
標準的なCAN(CAN 2.0)は最大1Mbpsの速度を持ちます。より高速・大容量が必要な用途にはCAN FDが使われます。
歴史・背景
CANの開発は1983年、Boschがメルセデス・ベンツと共同で開始しました。1986年のSAE(自動車技術会)で正式発表され、1991年にはIntelとPhilipsが最初のCAN ICを製品化。1993年にISO 11898(高速CAN)とISO 11519(低速CAN)として国際標準化されました。
1990年代に欧州の自動車メーカーが次々とCANを採用し、2004年にはEUがすべての新車へのCAN搭載を義務化。今日では1台の自動車に70〜100個ものECUが搭載され、数本のCANバスで繋がれています。
産業分野ではCANopenプロファイルが標準化され、産業機器の相互接続性を確保しています。また医療機器・エレベーター・農業機械など、安全性・信頼性が重視される分野でも採用が進んでいます。
技術仕様
物理層
| 仕様 | 値 |
|---|---|
| 信号方式 | 差動(CANH/CANL) |
| ドミナント電圧 | CANH: 3.5V, CANL: 1.5V(差電圧2V) |
| レセッシブ電圧 | CANH/CANL共に約2.5V(差電圧0V) |
| 最大ノード数 | 理論値127、実用上32〜110 |
| 最大バス長 | 1Mbps時: 40m / 125kbps時: 500m / 10kbps時: 6km |
| 終端抵抗 | 両端に120Ω(差動インピーダンス60Ω) |
速度と距離の関係
| 速度 | 最大バス長 |
|---|---|
| 1 Mbps | 40 m |
| 500 kbps | 100 m |
| 250 kbps | 250 m |
| 125 kbps | 500 m |
| 10 kbps | 6 km |
フレームフォーマット(CAN 2.0A:標準フレーム)
[SOF][ID(11bit)][RTR][IDE][r0][DLC(4bit)][Data(0〜8byte)][CRC(15bit)][CRC Del][ACK][ACK Del][EOF]
- SOF(Start of Frame): フレーム開始の1ビット(ドミナント)
- ID(識別子): 11ビット(標準)または29ビット(拡張フレーム)。優先度も兼ねる
- RTR(Remote Transmission Request): データ要求フレームの識別
- DLC(Data Length Code): データ長(0〜8バイト)
- Data: 最大8バイトのペイロード
- CRC: 15ビットのCRC(誤り検出)
CAN 2.0Bでは拡張フレーム(29ビットID)が追加されました。
動作原理
ビット調停(Arbitration)
CANはマルチマスターバスのため、複数ノードが同時に送信を開始する可能性があります。CANはビット単位の「非破壊調停(Non-destructive Arbitration)」で競合を解決します:
- ドミナント(Dominant): 論理0。任意のノードがドミナントを送出すると、バス全体がドミナント
- レセッシブ(Recessive): 論理1。全ノードがレセッシブのとき、バスはレセッシブ
送信中に自分の送出ビット(レセッシブ)とバスの状態(ドミナント)が異なる場合、そのノードは送信を停止して受信に切り替わります。IDが小さい(数値が低い)フレームが優先されます(低IDほど0が多くドミナントが勝つ)。
エラー処理
CANの高信頼性を支えるのは多層的なエラー検出と自動再送です:
- CRCエラー: CRC不一致
- スタッフエラー: 6ビット連続同値(ビットスタッフィング違反)
- フォームエラー: フレームフォーマット違反
- ACKエラー: ACKスロットで誰もACKを返さない
- ビットエラー: 送信中に異なるビットを検出
エラーを検出したノードはエラーフレームを送出してフレームを無効化します。各ノードはTEC(送信エラーカウンタ)とREC(受信エラーカウンタ)を持ち、一定値を超えると「バスオフ状態」になりバスから切り離されます。
// STM32 HAL を使ったCAN送信例(CAN 2.0A標準フレーム)
CAN_TxHeaderTypeDef tx_header;
uint8_t tx_data[8];
uint32_t tx_mailbox;
tx_header.StdId = 0x123; // 11ビットID
tx_header.IDE = CAN_ID_STD; // 標準フレーム
tx_header.RTR = CAN_RTR_DATA;
tx_header.DLC = 8; // データ長8バイト
tx_header.TransmitGlobalTime = DISABLE;
tx_data[0] = 0x01;
tx_data[1] = 0x02;
// ... (tx_data[2]〜[7]をセット)
HAL_CAN_AddTxMessage(&hcan1, &tx_header, tx_data, &tx_mailbox);
// 受信設定(フィルタ設定)
CAN_FilterTypeDef filter;
filter.FilterBank = 0;
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterIdHigh = 0x0000;
filter.FilterIdLow = 0x0000;
filter.FilterMaskIdHigh = 0x0000;
filter.FilterMaskIdLow = 0x0000;
filter.FilterFIFOAssignment = CAN_RX_FIFO0;
filter.FilterActivation = ENABLE;
HAL_CAN_ConfigFilter(&hcan1, &filter);
// 受信割り込みコールバック
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
CAN_RxHeaderTypeDef rx_header;
uint8_t rx_data[8];
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data);
// rx_header.StdId でIDを確認、rx_data でデータを処理
}
用途・ユースケース
CANが採用される主な分野:
- 車載ECU間通信: エンジン制御・変速機・ABS・エアバッグ・ボディコントロールなど多数のECUをCANバスで接続
- OBD-II診断: 車両の故障診断ポートはCAN上のOBDプロトコル(ISO 15765-4)
- 産業用ロボット: 多軸ロボットの各軸モーターコントローラ間のリアルタイム通信(CANopenプロトコル)
- 医療機器: 人工呼吸器・手術ロボットなど安全性が求められる機器
- 農業機械・建設機械: ISOBUS(ISO 11783)規格による農業機械の標準インターフェース
- エレベーター制御: 各階ボタンユニットと制御盤の通信
実装・開発のポイント
終端抵抗の重要性
CANバスの両端には必ず120Ωの終端抵抗が必要です。終端がないと信号が反射してエラーが多発します。開発時はバスの両端(最初と最後のノード)に120Ωを実装します。
ビットタイミングの設定
CANのビットタイミングはプリスケーラ・プロパゲーションセグメント・フェーズセグメント1・フェーズセグメント2で構成されます。1ビット時間は複数のTime Quantum(Tq)に分割されます。マイコンのクロックから目標ボーレートを設定するための計算:
1ビット時間 = 1 / ボーレート
Time Quantum (Tq) = 1 / (システムクロック / プリスケーラ)
1ビット = (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2) × Tq
各マイコンベンダーのCANビットタイミング計算ツールや、オンラインのBit Timing Calculatorを使うと便利です。
CANopenとDBC
産業用途ではCANopenプロトコルを使うことでデバイス間の相互運用性が確保できます。車載用途ではDBC(CAN Database)ファイルでメッセージ定義を管理し、CANalyzerなどのツールで通信解析を行います。
他技術との比較
CAN vs RS-485
| 項目 | CAN | RS-485 |
|---|---|---|
| マルチマスター | あり(調停機能) | なし(マスタースレーブ) |
| エラー処理 | ハードウェアで自動 | ソフトウェアで実装 |
| ボーレート | 最大1Mbps | 最大10Mbps |
| 最大距離 | 1Mbps時40m | 10Mbps時12m, 100kbps時1200m |
| 対象分野 | 車載・産業 | 産業・建物設備 |
CAN vs CAN FD
CAN FD(CAN with Flexible Data-rate)は標準CANの後継で、データフェーズを最大8Mbpsまで高速化し、ペイロードを最大64バイトまで拡張しました。既存のCANネットワークとの後方互換性も持ちます。