[第1 章]

信頼性の高い通信を行う

中距離マイコン間インターフェース
CAN とは● CAN とは
CAN とは，「Controller Area Network」の略で，BOSCH 社が開発した車載ネットワークのことです．元々は自動車内の機器間の通信で使用されるためのシリアル・バスですが，信頼性の高さや優れた故障検出機能により，オートメーション機器の制御などにも利用されています．
CAN は仕様が公開されているため，ほかの自動車メーカなどもこの方式を採用しているところがあります．
最近のカー・エレクトロニクスではコンピュータ化が進み，いたるところに多数のマイコンが使われています．これらの機器を個別に配線していたのでは，膨大な量の配線が必要になり，重量もコストも増大します．この問題を解消する手段として開発されたのが CAN です．ネットワーク上で短い
情報（コマンドやステータスなど）をやり取りすることで各マイコンを制御できるため，車内配線の大幅な省力化が可能です．
CAN の特徴として，比較的長距離の伝送が可能，通信レートが高い，差動通信路のためコモン・モード（同相）ノイズに強い，エラー検出機能が充実していてリカバリが容易などが挙げられます．また，マルチ・マスタ，というより，すべてのデバイスがマスタでありスレーブであり，優先順位もメッセージの内容に依存するというのも大きな特徴です．
ただし，一度に送受信できるデータは最大 8 バイトと短く，大量のデータをやり取りするのには向いていません．
本書では，比較的安価で手軽に実現できるマイコン機器間の中距離通信の通信手段として CAN を取り上げ，マイコン機器を制御する具体的な方法を解説していきます．

● 転送レート
CAN バスは比較的長い距離でも通信できるのが特徴の一つですが，当然ながら，伝送路が長いと通信速度も落ちます．規格上の最高レートは伝送路が 40m のときで 1Mbps，1000m のときでは50kbps となっています．
CAN は通信レートの違いにより 250kbps 以上のものはハイ・スピード CAN，それ未満で，125kbps 程度のものはロー・スピード CAN と分類されています．実際の自動車では，エンジンやブレーキなどの制御系にはハイ・スピード CAN，パワーウィンドやワイパなどの制御系にはロー・ス
ピード CAN や LIN（これもクルマ車載ネットワークの一つの標準規格）というように数種類のバスが11

（1）GND基準の CAN H
電圧（V） ド
ミ
ナ
5
ン
ドミナント
4
ト
CAN H
3
(GND基準) 2
リセッ
リセッシブ
リセッ
1 シブ
シブ
0

（2）GND基準の CAN L
電圧（V）

時間

5
4
CAN L
3
(GND基準)
2
1
0

リセッ
シブ

リセッシブ

ドミナ
ント

リセッシブ
ドミナント

（3） CAN L 基準の CAN H （差分つまり，CAN H − CAN L ） （4） CAN H ，CAN L の合成波形
電圧（V）
電圧（V）
仮想GNDレベル
ド
ミ
ナ
ン
ト

5
4
CAN L，H 3
差分
2（CAN Ｌ
1
基準）
0

ドミナント

5
4
CAN L ， 3
CAN H
2
差分（＊1）
1
0

CAN H

電位差なし
（アイドル）

CAN H

リセッ
リセッ
リセッ
シブ
シブ
シブ
ドミナント
ドミナント
CAN L
CAN L

時間
リセッ
リセッシブ
リセッ
シブ
シブ
（＊1）CANバスの信号ラインにはGNDは存在しないが，2.5Vを仮想的なGNDとしたときの示したもの．

図 1-1

時間

CAN L ， CAN Ｈ

時間

両信号の波形をCAN バスの信号

これらのタイムチャートは CAN バスの信号の電圧レベルを基準電圧を変えて表現したもの．

混在しています．
同一の CAN バスに接続されているすべての CAN デバイスは，同じ転送レートで動作している必
要があります．

● CAN バスの信号――ドミナントとリセッシブ
CAN バスの信号は，2 本の信号ラインで伝達されます．コモン線（GND）は不要です．この二つの信号は， CAN H ， CAN L と呼ばれ，両信号間の電位差（電圧差があるか，ないか）で信号を伝達します．I2C や TTL レベルの信号のように GND に対する電位レベルで信号を伝達するのとは異なります．
実際の自動車内の配線では，CAN ラインと一緒に電源もケーブルで分配されていて，電源を共用している関係で GND がシャーシなどで接続されていますが，本来は電源を共用する必要もないため，
2 本の信号線だけで通信できます．
このように電位差で動作するものを差動（ディファレンシャル）
式といいます．差動式は伝送路などで拾う同相のノイズが打ち消されるため，外来ノイズの影響を受けにくく，自動車などのノイズの発生源の多いところではとくに有用な方式です．差動式は，RS-422などの長距離伝送にも利用されています．
CAN バスの信号状態には図 1-1 のように 2 通りあり， CAN L ， CAN H 両ラインの，¡電位差がある状態をドミナント（Dominant）¡電位差がない状態をリセッシブ（Recessive）といいます．ドミナントは信号がアクティブである，リセッシブは非アクティブ（アイドル）である，と言い換えることもできます．このように，ドミナントもしくはリセッシブの状態と長さの組み合わせにより，データを伝達します．

12

第1章

中距離マイコン間インターフェース CAN とは

（1）標準的なCANバスの接続
CANノード1

CANノード n

CANノード2

CAN H
終端抵抗器

終端抵抗器

CAN L

（2）本書で製作するノードの接続
CANノード1（終端）

終端抵抗器

終端抵抗器

終端抵抗器はジャンパで切り離し可能

CANノード n（終端）CANノード2

CAN H

CAN H

CAN L

CAN L

図 1-2 CAN ノードの接続

一般的な CAN ノードの接続方法と，本書で製作する CAN ノードの接続形態を示す．本書で製作するものは CAN の端子を二つ持ち，内部で並列に結線されているため，ノードを数珠つなぎにできる．

CAN は，同期用のクロック信号がなく，同時に双方向の通信ができないことから，非同期の半二重通信方式といえます．
同一バス上で複数のノード（接続されている CAN デバイス）が信号を出力する際，あるノードがリセッシブ状態にある場合でも，ほかのノードがドミナントを出力すると，バスの状態はドミナントに上書きされます．リセッシブはバスがアイドル状態と考えればわかりやすいでしょう．この仕組みはバスのアービトレーション（調停）
や ACK の応答に利用されます（後述）．
CAN バスの両端には終端抵抗が必要です．図 1-2 はバスにつながる CAN デバイス（ノード）間の配線例を示したものです．

● 通信波形の確認
図 1-3 は CAN バス・トランシーバを二つ接続して，片側にオシレータ（発振器）をつなぎ，CAN バ
スの CAN H と CAN L の 2 本の信号をオシロスコープで実際に測定したものです．オシレータの周波数はロー・スピード CAN の代表値である 125kHz に設定してあります．
トランシーバの GND をオシロスコープの GND レベルにして， CAN H ， CAN L の両信号をオ
シロスコープの CH1 と CH2 に接続し，2 チャネル同時に表示させています．
約 2.5V を中心として約± 1V で信号が伝達されている様子が確認できます．なお，CAN バス・トランシーバについては第 2 章以降で説明しています．

● CAN ノード
CAN バスに接続される各デバイスは「ノード」と呼ばれます．同じくシリアル・バスの規格である
2

I C（シングル・マスタ・モードの場合）や SPI のように一つのマスタに対して複数のスレーブが接続されているというのではなく，各ノードがマスタであり，スレーブでもあります．通信を始めるノー13

コントロール・フィールド
データ・フィールド（可変長；8ビット単位で 0〜8バイト：N ＝0〜7）

SOF
ID10
ID9
ID8
ID7
ID6
ID5
ID4
ID3
ID2
ID1
ID0
RTR
IDE
RB0
DLC3
DLC2
DLC1
DLC0
D07
D06
D05
D04
D03
D02
D01
D00
D17
D16
D15
D14
D13
D12
D11
D10

アービトレーション・フィールド

識別子（ID値）＝メッセージ
RTR＝ 0

データ長
コード（0〜8）

データ0

データ1

（a）データ・フレーム
ACKスロット・ビット

SOF
ID10
ID9
ID8
ID7
ID6
ID5
ID4
ID3
ID2
ID1
ID0
RTR
IDE
RB0
DLC3
DLC2
DLC1
DLC0
CRC14
CRC13
CRC12
CRC11
CRC10
CRC9
CRC8
CRC7
CRC6
CRC5
CRC4
CRC3
CRC2
CRC1
CRC0
CRCDEL

CRCフィールド

識別子(ID値)＝メッセージ

RTR＝ 1

データ長コード（0）EOF

ACKDEL

コントロール・フィールド
アービトレーション・フィールド

CRC値（15ビット）

CRCDEL：正常時はリセッシブ，CRCエラー時はドミナント
ACK SLOT BIT：正常時は受信側ノードがドミナントに上書きする（b）リモート・フレーム

図 1-4

データ・フレーム/リモート・フレーム

標準モードのデータ・フレーム，リモート・フレームのフォーマットを示す．データ・フレームは RTR= 0 で，DLC
ビットで指定されたバイト数（0 〜 8 バイト）のデータ・フィールドをもつ．リモート・フレームは RTR= 1 でデータ・フレームはない．ACK スロット・ビットは送信ノード側はリセッシブを出力し，正常受信時には受信側ノードがドミナ
ントに上書きする．

電圧
0.5V

CAN H

約125kHz

電圧

VRef（2.5V）

CAN H

約125kHz
CAN L
時間

CAN L

5μs

（a）同相ノイズが乗った状態のCANバス信号

図 1-3

VRef（2.5V）

0.5V

時間

5μs

（b）同相ノイズが少ない状態のCANバス信号

CAN バスのオシロ測定波形

125kHz の矩形波をトランシーバに入力した際の CAN 出力をオシロスコープで測定した波形．（a）は大きな同相ノイズが混入して，波形が大きくひずんでいるが，差動の原理により，ノイズが打ち消されて通信には問題ない．

ドがマスタとなり，受信する側がスレーブということになります．
各ノードは図 1-2 のように接続され，バスの終端には終端抵抗器が付いています．
各ノードは，データを送信する際はデータ・フレームまたはリモート・フレームに ID 値（メッセージ）を含めて送信します．この ID 値はフレームの優先順位も表していて，同時に複数のノードが送信を始めようとするときのアービトレーション（調停）に利用されます．

14

第1章

中距離マイコン間インターフェース CAN とは

ACKスロット・ビット

データN

CRC値（15ビット）

ACKDEL

EOF

DN7
DN6
DN5
DN4
DN3
DN2
DN1
DN0
CRC14
CRC13
CRC12
CRC11
CRC10
CRC9
CRC8
CRC7
CRC6
CRC5
CRC4
CRC3
CRC2
CRC1
CRC0
CRCDEL

CRCフィールド

バス・アイドル
すべてリセッシブ

CRCDEL：正常時はリセッシブ，CRCエラー時はドミナント
ACK SLOT BIT：正常時は受信側ノードがドミナントに上書きする

IFS

Intermission（すべてリセッシブ）

ACKDEL：正常時はリセッシブ，
エラー時（非ACK）はドミナント

IFS

バス・アイドル
すべてリセッシブ

Intermission（すべてリセッシブ）

ACKDEL：正常時はリセッシブ，
エラー時（非ACK）はドミナント

SOF（Start of Frame）……………………… フレーム開始
RTR（Remote Transmission Request）… リモート送信要求
DLC（Data Length Code）………………… データ長コード
CRCDEL（CRC Delimiter）………………… CRCデリミタ
ACKDEL（Acknowledge Delimiter）……… ACKデリミタ
EOF（End of Frame）……………………… フレーム終了
IFS（Interframe Space）…………………… フレーム間スペース

ノードの数は仕様上の制限はありませんが，ハイ・スピード CAN の場合は最大 30 と規定されています．また，トランシーバや伝送路の電気的な特性や制限により，ノード数は制限されます．

● フレームのフォーマット
図 1-4 にフレームのフォーマットを示します．フレームとは通信情報として意味をもつフィールドの集まりのことで，CAN 通信の基本単位です．この図では， L レベルがドミナント， H レベル
がリセッシブを表しています（リセッシブがアイドル状態）．
CAN の転送データには 4 種類のフレームが規定されています．各フレームはいくつかのフィールドから構成されています．
データ・フレームまたはリモート・フレームの場合，フレームは SOF（Start of Frame）で始まり，
アービトレーション・フィールド，コントロール・フィールド，データ・フィールド（データ・フ
レームの場合のみ），CRC フィールド，ACK スロット，EOF（End of Frame）と続き，最後に IFS（Interframe Space）
フィールドで終わります．
SOF と EOF は文字通り，フレームの最初と最後を示すもので，それぞれ 1 ビットのドミナントが送信されます．
アービトレーション・フィールドには識別子（以下 ID 値）と RTR ビット（データ・フィールドかリ
モート・フィールドかを区別するためのフラグ）が含まれています．この ID 値はメッセージとも呼ばれ，値の大きさにより，優先順位も決まります（値が小さいほど高優先）．

15

データ・フィールドは可変長（0 〜 8 バイト）のデータ領域で，その直前にあるコントロール・フィールド内の 4 ビットの DLC フィールドで長さが指定されています．CRC フィールドは 15 ビットの CRC（巡回冗長検査）の値が設定されます．CRCDEL は CRC フィールドを区切るためのデリミタです．CRC エラーがない場合にはドミナントですが，エラーがある場合は，リセッシブに設定されます．ACK スロットでは，送信側のノードはリセッシブを出力しますが，受信側ノードが正常にフレームを受信できたときに受信側ノードがドミナントに上書きします．ACKDEL は ACK ビットのデリミタです．
IFS は次のフレームが送信できるようになるまでの時間稼ぎのフィールドで，フレームの区切りをつけるのと，内部処理のための時間を確保するために挿入されています．
次に四つのフレームの機能を簡単に説明しますが，各フィールドの内容については図 1-4 も参照してください．なお，アービトレーション・フィールドの長さにより，標準フォーマットと拡張フォー
マットの 2 種類が規定されていますが，本書ではビット長が 11 ビットの標準フォーマットについて説明します．拡張フォーマットの場合でもデータ長が増えるだけで動作は同じです．
（1）データ・フレーム
相手にデータを送信するフレームです．データ長は 0 〜 8 バイトの可変長で，データ長は，コント
ロール・フィールドにある 4 ビットの DLC フィールドで指定できます．データ・フレームでは RTR
ビットがドミナントに設定されます．なお，データ長が 0 の場合は，RTR ビットがドミナントである以外はリモート・フレームと同じフォーマットになります．
（2）リモート・フレーム
相手へデータを要求するフレームです．データ・フレームのデータ・フィールドがないような
フォーマットになっています．リモート・フレームは RTR ビットがリセッシブに設定されます．このフレームを受け取ったノードは（1）のデータ・フレームでデータを送り返します．
（3）エラー・フレーム
エラーを検出したノードがエラー状態を通知するために送信するフレームです．
エラーが発生すると，ほかのフレーム送信の途中であってもエラー・フレームが割り込んで出力されます．エラー・フレームは連続 6 ビットのドミナントをビット・スタッフィング（後述）なしで送信
したあと，個別のエラー・フラグとエラー・デリミタを送信します．エラーについては「CAN のエラー」の項を参照してください．
（4）オーバロード・フレーム
受信した側の処理が追いつかないときに，このフレームを出力することで，次のメッセージが出力されるのを待機させて，処理時間を稼ぎます．
最近ではあまり使われていないようですが，なんらかの理由で相手ノードを待たせたいときに使用できます．

● メッセージ
データ・フレームとリモート・フレームにはアービトレーション・フィールドが含まれていますが，このフィールドの値（ID 値）
がメッセージを表しています．
アービトレーション・フィールドは標準フォーマットの場合は 11 ビットなので，211 種類（実際は

16

第1章

中距離マイコン間インターフェース CAN とはノード1の出力
ID＝0x493（調停負け）S
O
F（＊1） （＊2）（＊2）

1 0 0 1 0 0 1 0 0 1 1

RTR

これらのビットは打ち消されて出力されない
ノード2の出力
ID＝0x401（調停勝ち）
実際のバスの状態
ID＝0x401

S
O
F

S
O
F

1 0 0 0 0 0 0 0 0 0 1

1 0 0 0 0 0 0 0 0 0 1

R
T
R

R
T
R

（＊1）自分が出力している値とバスの状態が不一致となった場合は，調停負けと判断する．
（＊2）実際は，調停負けと判断した後のデータは出力されないかもしれない．

図 1-5

CAN バスのアービトレーション（調停）

二つのノードが同時に送信を始めた場合の調停の仕組みを示す．この図はID値が小さいノード2が調停勝ちする場合の例．
チャートの H レベルはリセッシブ， L レベルはドミナントを示す．なお，この図はビット・スタッフィングを考慮していないので注意（p.18 参照）．

それより少し少なくなる）のメッセージが作成できます．また，拡張フォーマットの場合は，アービ
トレーション・フィールドは 29 ビットあるので，229 種類のメッセージが作成できます．
本書では標準フォーマットの ID 値
（メッセージ）を単に SID と表記することがあります．

● フィルタとマスク
受信したメッセージを振り分けるための仕組みで，特定のメッセージだけを受信したり（フィルタ機能），ある範囲の複数のメッセージを受信したい（マスク機能）ときに使用します．マスクとは，特定のビットを隠して，そのビットは何でもよいという状態にすることを意味しています．詳細はMCP2515 の「フィルタとマスク」の項で説明します．

● CAN ノードの優先順位とアービトレーション（調停）
CAN ネットワークは半二重（送受信の交互，片側通行）通信なので，送信と受信は同時にはできません．また複数のノードが一斉に送信することもできません．
そこで，複数のノードがバスをシェアしながら通信する仕組みが用意されています．
CAN 通信では，ノードに関係なく，送信されるメッセージごとに優先順位が決まっていますが，基本的にはメッセージの優先順位にも関係なく，早い者勝ちで送信されます．すでに通信が始まってバスが使用中の場合は，たとえ優先順位の高いメッセージを送信しようとしても，バスが空くのを待たなければなりません．
CAN では 1 回の通信データの量が少ないため，高優先順位のメッセージが少し待たされてもそれほど問題はありません（と考える）．
もし，まったく同時に複数のノードが通信を始めた場合は，アービトレーションの機能が働きます．
この場合は，優先順位の高いメッセージを出力しているノードが使用権を獲得し，そのまま送信を継17送信側ノード
オリジナル
送信データ

1 0 0 0 0 0 0 0 0 1 1
5ビット以上 0 が連続している
スタッフ（詰め込み）
ビット．0 の反転で
1 が挿入される

ビット・
スタッフィング
後の出力

1 0 0 0 0 0 1 0 0 0 1 1
スタッフ・ビットがここにあることを確認して，データとしては無視

受信側ノード
受信データ（復元データ）

図 1-6

1 0 0 0 0 0

0 0 0 1 1

ビット・スタッフィング

ビット・スタッフィングが発生する場合の通信データの例．5 ビット以上同一レベルの信号が連続した場合に 1 ビットの反転ビットが挿入される．受信側ではビット・スタッフィングが発生する状況で，反転ビットがあることを確認して，ビット・データとしては無視することで，元のデータ・ビット列を復元する．

続しますが，優先順位の低いほうのノードは送信を中断して，バスが空いてからリトライします．
優先順位は，データ・フレームまたはリモート・フレームのアービトレーション・フィールドのメッセージ値（ID 値）が小さいほど高順位になります．図 1-5 はアービトレーションの仕組みを簡略化して示したものです．
複数のノードが同時に通信を始めた場合，一斉にフレームを出力するわけですが，バスの信号は
ID 値の小さい ID 値で上書きされてしまう（ドミナントはリセッシブを上書きする）ため，結果的に ID
値の小さいものの値がバス上に出力されることになります．これが，ID 値が小さいほど優先順位が高いという理由です．
ID 値の大きいほう（優先順位の低いほう）の ID 値は打ち消されてしまいます．このようにして調停が成立します．
調停負けは，自分が出力した ID 値と実際にバスに出力された ID 値を比較して，結果が異なっていれば負けたと判断できます．通常，このような判定は CAN コントローラのハードウェアが自動でやってくれます．
同じ ID 値のデータ・フレームとリモート・フレームが同時に送信された場合，フレーム中の RTR
ビット（リモート送信要求ビット）がドミナントであるデータ・フレームのほうが調停勝ちします．

● ビット・スタッフィング
スタッフとは詰め込むという意味ですが，ビット・スタッフィングとは，同一の信号レベルが 5
ビット以上連続した場合，その 5 ビットの後に，レベルを反転したビットを 1 ビット挿入して（詰め込んで）出力することです．つまり，6 ビット以上，同一レベルの状態が連続しないようにします．
図 1-6 は 0 が 8 ビット連続した場合に 1 のスタッフ・ビットが挿入される場合の例を示していま
18

第1章

中距離マイコン間インターフェース CAN とは

電源（DC5V）
両トランシー
バ兼用

ターミネータオシロスコープ
のプローブ

CANバス

MCP2551（送信側）

オシレータ出力

MCP2551（受信側）

写真 1-1

CAN トランシーバ通信実験

す． 1

が 5 ビット以上連続している場合は， 0 が挿入されます．

これはブレッドボード上で二つの CAN トランシーバ（MCP2551）を接続して通信を確認したようす．オシレータで125kHz を発生させ，オシロスコープで波形を確認した．この写真では MCP2515 の VRef を基準として CAN H を測定している．

スタッフ・ビットの役割は，データ・ビットの同期ずれを補正する際に，補正ができない時間を短くするためのものです（連続した状態が長く続くとその間，同期ずれの補正ができない）．
CAN では DPLL（Digital Phase Lock Loop）という位相補正の仕組みがあり，信号の状態がリセッ
シブからドミナントへ変化した時に位相ずれの補正機構が働き始めるようになっています．したがって，同じ状態のビットが長い間連続すると，この変化点がなかなか検出できないため，補正できない
時間も長くなって位相ずれが大きくなってしまい，ついには補正できなくなる恐れがあります．
データの内容によっては 0 または 1 が 6 ビット以上連続するということもあるわけですから，
その場合にダミーのビットを挿入して連続個所をなくす，というのがビット・スタッフィングの役目です．DPLL の働きで，同期ずれは頻繁に補正されながら通信しているため，ビット・レートの多少の食い違い（発振子の精度による周波数のばらつき）をカバーでき，信頼性が向上します．
このスタッフ・ビットはコントローラにより自動的に挿入され，受信時に自動的に取り除かれる（データ・ビットとして無視される）ため，通常のアプリケーションでは意識する必要はありません．
図 1-7（p.20）は実際に CAN トランシーバ MCP2515 同士で通信した際にロジアナ（ロジック・アナライザ）で測定した波形に，各フレームの説明を書き加えたものです（写真 1-1）．
この例では，2 か所で 0 のビットが 5 ビット以上連続しているため，自動的にビット・スタッ
フィングが発生しています．
もし，6 ビット以上同一レベルの信号を受け取ると，本来あるべきはずのスタッフ・ビットが検出できないということで，スタッフ・エラーとなります．

● CAN のバス・エラー
CAN では，運用中に発生するエラーに次のようなものがあります．

19

スタッフ・ビット

LaDoc1
Bus/Signal Trigger Enable

T
A
B
Ds

1694274.333

1694367.129

1694459.924

1694552.719--New000100000 * 00100000 * 00
S
O
F

図 1-7

SID(11)
SID＝0x0101

R I R DLC(4)T D B DLC＝0
RE0

ロジアナ実測波形

データ・フィールドがない（DLC ＝ 0 ）場合のデータ・フレームの測定波形．2 か所でビット・スタッフィングが発生している．括弧内の数字はフィールドのビット数．ACK が L にドライブされているため，受信側がメッセージを正常に受信したことが確認できる．

（1）CRC エラー（受信側）
受信した CRC 値と受信データから再計算した CRC 値が異なる場合に発生します．エラーを検出す
ると，エラー・フレームが送信されるので，送信側はフレームを再送しなくてはなりません．
（2）ACK エラー（送信側）
受信側ノードが ACK を返さない（ノードが存在しない場合も含む）ときに発生します．エラーを検出すると，エラー・フレームが送信されるので，送信側はフレームを再送しなくてはなりません．
（3）フォーム・エラー（受信側）
EOF，IFS，CRCDEL，ACKDEL でドミナントを検出した場合に発生します．エラーを検出すると，エラー・フレームが送信されるので，送信側はフレームを再送しなくてはなりません．
（4）ビット・エラー（送信側）
アービトレーション・フィールドと ACK スロットを除き，自分が出力したビット状態と実際のバスの状態が異なるときに発生します（ドミナントを出力しているのに実際のバス状態がリセッシブになっているとき，またはその逆のとき）．
ノイズの混入やバスが断線しているとき，短絡しているときなどに起こる可能性があります．
（5）スタッフ・エラー（受信側）
SOF から CRCDEL の間で 5 ビット以上連続して同一のデータ・ビットが送信されているにも関わらず，スタッフ・ビットがない場合に発生します．エラーを検出すると，エラー・フレームが送信されるので，送信側はフレームを再送しなくてはなりません．

● エラー・ステート
CAN では運用中に発生するエラーの程度を累積して評価する仕組みがあり，エラーの程度を数値としてカウントするためのカウンタが用意されています．このカウント値により，いくつかのエ
ラー・ステート（状態）に分類されます．このステートはエラー発生状況の深刻度を表すものです．
PIC マイコンの 18Fxx8 や本書で利用する CAN トランシーバ MCP2515 などでは，¡送信エラーをカウントする TEC（Transmit Error Counter）

20

第1章

中距離マイコン間インターフェース CAN とは1694645.515

1694738.31

1694831.106

1694923.901

16950160

CRC(15)

CA A
RC C
CK K
D D
E E
L L

EOF(7)

IFS(3)¡受信エラーをカウントする REC（Receive Ereor Counter）の二つの 8 ビット・カウンタが用意されていて，それぞれ，通常は，エラーが発生するたび（エラー・フレームが送信されるたび）に＋ 8 されます．ただし，送信しようとしても受信ノードが存在しない場合は，いきなり＋ 128 されるというようなこともあります（リスト 2-1 参照）．
正常な運用状態では，エラー・アクティブというステートにありますが，エラー・カウンタの値が127 を超えるとエラー・パッシブというステートに移行し，さらに 255 に達するとバス・オフというステートに移行します．なお，正常に送受信できた場合は，それぞれのカウンタが−1 され，エラーの重症度が減ります．したがって，正常な通信が続けばカウンタ値はどんどん小さくなります（最小0）．これら三つの状態をまとめると次のようになります．

（1）エラー・アクティブ
REC，TEC とも 128 未満の正常な状態．とくに 96 以上 128 未満はエラー・アクティブのウォーニング・ステートに分類される．
（2）エラー・パッシブ
REC または TEC が 128 以上で 255 未満の中〜高程度の異常な状態．復旧可能だが，かなり重症．
（3）バス・オフ
TEC が 255 の最悪な状態．この状態では通信不能で，特定の手順（デバイスのリセットなど）を踏まないと復旧不可能．

21

[第

2 章]

CAN 専用コントローラを用いて各種マイコンから活用を図る

CAN コントローラ MCP2515 の機能

本章では，本書での CAN 通信の要となる CAN コントローラ MCP2515 について詳しく説明します．
このコントローラさえ使えるようになれば，多様な CPU 用の制御プログラムにも応用ができるようになります．

2-1 CAN コントローラの概要● MCP2515 CAN コントローラの概要
マイクロチップ社の MCP2515 は SPI（Serial Peripheral Interface）通信で操作することできる CAN
コントローラです．CAN V2.0B に対応しています．CAN トランシーバ MCP2551 と組み合わせて簡
単に CAN ノードを作ることができます．図 2-1 に MCP2515 のピン配列を示します．DIP パッケージも用意されているため，ブレッドボードなどでも使用できます．また，フラット・パッケージを含めた外観を写真 2-1 に示します．
おもな仕様
sCAN V2.0B 準拠 最高ビットレート 1Mbps

1

18

VDD

2

17

RESET

CLKOUT/SOF

3

16

CS

TXD

1

TX0RTS

4

15

VSS

2

TX1RTS

5

14

SO
SI

TX2RTS

6

13

SCK

VDD

3

OSC2

7

12

INT

RXD

4

OSC1

8

11

RX0BF

VSS

9

10

RX1BF

MCP2515

TXCAN
RXCAN

（a）CANコントローラ MCP2515(DIP/SOIC) ピンアウト（＊1）
（1）
（2）
，

図 2-1

CAN デバイスのピン・アウト

MCP2551s メッセージ長は 11 ビット，29 ビット両対応

8

Rs

7

CANH

6

CANL

5

VREF

（b）CANトランシーバ MCP2551（DIP/SOIC）ピンアウト（＊2）

本書で使用する CAN コントローラ（MCP2515）と CAN トランシーバ（MCP2551）のピン配列を示す．MCP2515 のTSSOP パッケージは 20 ピンで一部ピン配置が異なるので注意．

22

第 2 章 CAN コントローラ MCP2515 の機能

MCP2551（DIP；8ピン）

MCP2551（SOIC；8ピン）
MCP2515（TSSOP；20ピン）

MCP2515（SOIC；18ピン）

MCP2515（DIP；18ピン）

写真 2-1

CAN コントローラ IC

マイクロチップ社の CAN コントローラ(MCP2515)，CAN トランシーバ(MCP2551)の外観を示す．MCP2515 の TSSOPのピン数，ピン配列は，DIP と SOIC のものとは異なるので注意．

s 二つの受信バッファをもつ
s 三つの送信バッファをもつ
s 六つの 29 ビット・フィルタと二つの 29 ビット・マスクをもつ
s 三つの RTS 信号入力ピンあり
s 二つの RXBUF 信号出力ピンあり
s ハイ・スピード SPI（10MHz）
s クロック出力端子あり（ホスト・マイコンのクロックなどに利用可能）
s 送受信タイミングなど多様な割り込み発生機能あり
s ロー・パワー CMOS テクノロジで動作電圧は 2.7V 〜 5.5V 動作時消費電力 5mA（標準）s 動作保証温度− 40 ℃〜 +85 ℃（産業用）
s スリープ・モードあり データ受信などのイベントでウェイクアップ可能

このコントローラは，PIC18Fxx8 などに内蔵されている ECAN モジュールのレガシ・モード相当の機能があるものと思われます．
レジスタのアクセスの際は，PIC がもつ SPI 通信でインストラクションやデータを送受信するため，
特定の手順が必要ですが，その反面，SPIさえ備えていれば，接続先を選ばないという利点があります．
■ RTSn 信号（n=0 〜 2）

MCP2515 には三つの RTS 信号入力があります．この三つはそれぞれ三つの送信バッファに対応していて，ハードウェアにより送信を開始させるトリガ信号となっています．この機能を利用しない場
合は，切り替えにより単純な汎用の入力ポートとしても使えます．
■ RXnBUF 信号（n=0,1）

MCP2515 には二つの RXBUF 出力信号があります．この二つはそれぞれ二つの受信バッファに対応していて，メッセージが受信されたタイミングをハードウェアで検出できるようになっています．
割り込み信号として利用できます．この機能を利用しない場合は，切り替えにより単純な汎用の出力
2-1 CAN コントローラの概要

23

表 2-1

ビットレート一覧表

CAN の 1 ビットが 16TQ の場合の BRP 設定値とビットレートの一覧表．
TQ = 2 ＊（BRP ＋ 1）/ FOSC の関係がある．

発振子周波数（MHz） BRP 設定値

20

16

12

8

0
1
2
3
4
5
6
0
1
2
3
4
5
6
0
1
2
3
4
5
6
0
1
2
3
4
5
6

（ns） CAN ビットレート（kHz）
100.0
625.0
200.0
312.5
300.0
208.3
400.0
156.3
500.0
125.0
600.0
104.2
700.0
89.3
125.0
500.0
250.0
250.0
375.0
166.7
500.0
125.0
625.0
100.0
750.0
83.3
875.0
71.4
166.7
375.0
333.3
187.5
500.0
125.0
666.7
93.8
833.3
75.0
1000.062.5
1166.7
53.6
250.0
250.0
500.0
125.0
750.0
83.3
1000.062.5
1250.050.0
1500.041.7
1750.035.7

ポートとしても使えます．
本書の製作例では，RX0BF に LED を接続して，SPI 通信の動作確認に利用している場合があります．
■ リセット信号

リセット回路は外部に用意する必要があります．また，SPI 経由のリセット・コマンド送出によってもリセットすることができます．リセット回路は CR による一般的なものですが，実際のリセット
回路は，製作例の回路図を参照してください．半導体メーカ各社から発売されているリセット IC を使ってもかまいません．
■ クロック

ボーレートが低い場合は，発振子には多少精度が劣るレゾネータ（セラミック発振子）が利用できます．ボーレートが高い場合にはクリスタルを使う必要があります．発振子を使わずにオシレータのク
ロック信号を直接入力することも可能です．発振子周波数とビットレート，パラメータの設定の組み合わせの一部を表 2-1 に示します．
24

第 2 章 CAN コントローラ MCP2515 の機能

CLKOUT ピンからクロック信号を出力することができます．このクロックは内蔵のプリスケーラ
で 1/1，1/2，1/4，1/8 のいずれかに分周して出力することができます．マイコンのクロックとして利用することも可能です．パワー・オン直後，リセット時には 1/8 に設定されるので，必要に応じてプリスケーラを再設定する必要があります．

● 割り込みとその要因（エラー，非エラー）
MCP2515 には大きく分けて 8 種類の割り込み要因があります．割り込みを使わない場合でも，要因フラグのチェックやクリアが必要なものがあります．
割り込みが許可された状態で割り込みが発生すると，INT ピンが L レベルに設定されホストへ知らせます．この状態は，ソフトウェアによって割り込み要因がクリアされるまで維持されます．
割り込みを使う場合は，この INT 信号をマイコンの割り込み入力ピンに接続しておき，割り込み処理で，MCP2515 から要因を読み出して処理を実行したあと，割り込み要因をクリアします．
割り込み要因は SPI コマンドで CANINTF レジスタを読み出すことで特定できます．また，割り込
み状態をクリアする場合も SPI コマンドで同レジスタの該当ビットに 0 を設定することでクリアできます．
なお，割り込みを使う場合は，あらかじめ CANINTE レジスタで要因ごとに割り込みを許可しておく必要があります．割り込みを使わない場合は，CANINTF レジスタをポーリングするなどして読み出すことで，割り込み要因を知ることもできます．
なお，言うまでもありませんが，マイコン側でも割り込みを受け付けるような処理が必要です．
PIC の場合は，通常は INTn
（RB0 〜）
割り込みを使うことになると思います．
次に，割り込み要因を CANINTF レジスタのビット構成にそって簡単に説明します．次のような要因があります．
s MERRE ……メッセージ・エラー（メッセージの送受信中に発生するエラー）が発生
s WAKIF ……スリープ状態からウェイクアップした
s ERRIF ……エラー割り込み発生（複数要因あり，内容は EFLG レジスタに格納）
s TX2IF ……送信バッファ 2「空」
s TX1IF ……送信バッファ 1「空」
s TX0IF ……送信バッファ 0「空」
s RX1IF ……受信バッファ 1「フル」（受信データあり）
s RX0IF ……受信バッファ 0「フル」（受信データあり）

RXnIF 受信バッファ n「フル」は，受信データがバッファにあるときにセットされますが，このフラグは割り込み使用の有無に関わらず，受信データを取り出したあと，必ずクリアしておく必要があります．これを怠ると，次にメッセージを受信しようとしたときにオーバフロー・エラーが発生します．

TXnIF 送信バッファ n「空」は，送信バッファが利用可能になったことを知るためのものですが，
このフラグは割り込みを使用していない場合は，クリアしなくても動作に支障はありません（クリア
しておかないといつ空になったかわからないが）．割り込みを許可している場合はもちろん，クリア
2-1 CAN コントローラの概要

25