CANプロトコル 基本のキ

# CAN車載ネットワークの始まり
CAN(Controller Area Network)が開発される以前、自動車メーカーは**ポイントツーポイント方式**（1対1で接続する専用経路）で電子制御ユニット（**ECU**）の接続を行っていたが、自動車の高性能化によって電子部品の数が増えるにつれ、重くて高価なワイヤハーネス（電源供給や信号通信に用いられる複数の電線を束にしたもの）が邪魔になってきた。これを車載ネットワークに置き換え、コスト削減と軽量化を図ったのがCANの始まりだ。

**ピアツーピア**（読み書きのタイミングを制御するマスタデバイスが存在しないこと）のシリアルバスであり、現在では車載分野を超えて、ファクトリーオートメーションやIoTなど多様な分野へと拡大している。

自動車のエンジン制御に使われるだけあって信頼性が高いため、医療系の組み込みネットワークとしてもCANが利用されている。手術台や照明、カメラ、X線装置などもCANで制御している病院がある。

2012年、CANを拡張する形で**CAN FD**（CAN with Flexible Data rate）の仕様が発表される。従来のCANよりも、通信速度の高速化と送受信データの大容量化に対応し、自動運転技術の開発が加速する中、次世代の車載ネットワークとして期待されている。

# CANの特徴

まず用語を抑えておこう。
ネットワークに接続される通信機器のことを一般的には**ノード**というが、CANでは電子制御ユニット（**ECU**）がそれに当たる。また、通信線のことを**バス**と呼び、**バス**へデータを送信することを**バスアクセス**と言う。
![78b1de62-c12d-64b7-de87-64d0026c75e5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/f576445b-eaef-9e3f-13bf-b924345904f5.png)

一般的に言われているCANの特長を以下に示す。

1. **ライン型のバストポロジ**
複数のノードを接続する方式には、リング型、スター型、ライン型があるが、CANでは**ライン型**を採用している。ノードの追加削除がしやすく、ネットワークの設計が行いやすいシンプルな構造だ。

2. **すべてのECUがマスターになれるマルチマスター方式**
バスに空きがあれば、どのユニットからでも通信を開始できる。
相手を特定せずに送信でき、誰もがマスターになれるというわけだ。
通信はデータを要求して送ってもらうこともできるが、垂れ流しになっているのを必要なら見るというパターンが今は多いらしい。

3. **通信調停の仕組みによるCSMA/CA方式**
バスに早くアクセスしたユニットが送信権を得ることができる。
もし同時に複数のユニットが送信を始めたら、優先順位の高いID（ID番号が小さい）のメッセージを送信しているユニットが送信権を得る。
CSMA/CA方式ではバス使用中に他ノードからデータ送信できないよう頑張るが、実際には同時に複数のノードからデータが送信され衝突してしまうケースはある。CANにはその優先順位を決める**通信調停**（アービトレーション）の仕組みがある。

4. **差動電圧送信を利用し、外部からのノイズに強い**
2本の通信線（ツイストペアケーブル）に発生する電圧差の有無によってデータを送信する。外部から加わるノイズは同一のため電圧差が起こらず、ノイズが発生しても影響を受けにくい。

5. **エラー検出とハンドリング**
すべてのユニットがエラーを検出することができる。
エラーを検出したユニットは、即座に他のすべてのユニットにエラーを一斉通知する。
メッセージを送信しているユニットがエラーを検出すると、すべての送信データを削除して、再度すべてのノードに送り直す。

# データ通信の仕組み

CAN通信は**フレーム**と呼ばれる単位で行なわれる。
以下に各フレームの役割を示す。

- **データフレーム**
送信ユニットが、受信ユニットへデータを送るためのフレーム。

- **リモートフレーム**
受信ユニットが、送信ユニットにデータ送信を要求するフレーム。

- **エラーフレーム**
送受信時になんらかのエラーを検出したときに、他のユニットへエラーを通知するためのフレーム。

- **オーバーロードフレーム**
受信ユニットが、受信準備ができていないことを通知するためのフレーム。

CANでは、**データを必要とするECUからリモートフレームが送信され、そのデータを持ったECUからデータフレームを返すこと**で通信が成り立っている。**データフレーム**から制御ビットを除くと、実際に送信できるデータは最大8バイト（**CAN FD**では最大64バイト）になる。
近年では、各ECU間の情報交換が非常に多くなっているので、バス占有率を下げるためにリモートフレームは殆ど使わず、各ECUへ定期的にデータフレームを送信する方式（垂れ流し）が一般的だ。

# 関連規格/プロトコル
CANプロトコルは、開発元であるドイツBosch社が仕様を定め、その後にISO（国際標準化機構）が`ISO11898`（1Mbpsまでの高速CAN通信用）、`ISO11519`（125Kbps以下の低速CAN通信用）として規格化した。
ISOで定めたのはOSI参照モデルにおける物理層とデータリンク層のみなので、メッセージIDの採番方法とかデータ規則・応答の手順は、CANの上位層プロトコルとして開発する必要がある。
CANは自動車に限らず、産業機械やファクトリーオートメーション、医療機器、鉄道、航空から宇宙まで幅広い分野で活用されていて、各分野に合わせた上位層プロトコルが存在するので紹介する。

## CAN 2.0
**CAN2.0A**プロトコルは11ビットのID（標準フォーマット）を使用し、29ビットのID（拡張フォーマット）を使用するものは**CAN2.0B**と呼ばれる。2.0Bではさらに、パッシブ（受動）とアクティブ（能動）に分かれる。
2.0Aでは標準フォーマットのみ送受信可能で、もし拡張フォーマットを受信してしまった場合はエラーが発生する。
2.0Bパッシブは、送受信可能なのは2.0Aと同じ標準フォーマットのみだが、拡張フォーマットを受信した場合は無視することでエラーを回避できる。
2.0Bアクティブは、標準フォーマットも拡張フォーマットも送受信可能であり、現在の主流となっている。

## J1939
**J1939**プロトコルは、SAE（アメリカの自動車関連規格の開発などを行っている非営利団体）から提供されているCANの上位層規格で、トラックやバスなどの大型車で広く使用されている。**J1939**の応用規格として、農業機械用のISO11783や船舶用のNMEA2000がある。

## OBD II
**OBD II** 自動車診断規格は、欧州で販売されているすべての乗用車および軽トラックに搭載が義務付けられている（日本でも2008年以降の新車に搭載を義務付け）。CANは**OBD II**で使用されるプロトコルの1つである。故障診断用の端末を接続してデータを吸い出すことを主な目的としている。
現在では、運転席ダッシュボード下の**OBD II**コネクタに挿し込むだけで、BluetoothやWi-Fi経由でスマホの専用アプリにエンジンの状況を表示するものまで登場している。

## CANopen
**CANopen**は、組み込み向けの通信プロトコルであり、ドイツのCiA（CAN in Automation）によって規格化されたもの。規格の名前が示すとおり、誰もが自由に規格書を入手でき、対応製品を開発、販売、使用できるので、市場参入や市場競争もオープン。従来のRS-232/485独自規格で設計された組込ネットワークからの置き換えも進んでいる。

## FMS
**FMS**（フリート管理システム）は、輸送効率の向上を目的に欧州自動車工業会（ACEA）が開発を進めているもので、車両データの遠隔測定を可能にする。FMS標準規格はJ1939プロトコルがベースになっている。**FMS**における外部接続ではFMSコントロールユニットを経由してCANに接続する。