3.23. I2Cの基礎¶
I2C(Inter-Integrated Circuit、"アイスクエアドシー" または "アイツーシー" と発音)は、同じボード上のチップ間の短距離リンク向けに設計された2線式シリアルバスです。優先度の点でSPIとUARTの中間に位置します。SPIより遅いものの、よりピンを節約でき、SPIがデバイスごとに専用のCS線を必要とするのに対し、アドレス指定によって(同じ2本の配線上に複数のデバイスを)扱えます。
I2Cは、生のスループットよりもピンとバスの複雑さを削ることが重視される低速センサー、つまり加速度センサー、温度センサー、湿度センサー、磁気センサー、リアルタイムクロック、EEPROMなどに最適なバスです。
3.23.1. 2本の配線、どちらもオープンドレイン¶
I2Cバスには信号が2本しかありません。
SCL(シリアルクロック)。(ほとんどの場合)コントローラーが駆動します。
SDA(シリアルデータ)。その時点で発言しているデバイスが駆動します。アドレスと送出データの間はコントローラーが、読み出しとACKビットの間はペリフェラルが駆動します。
両方の配線はオープンドレインです。バス上のすべてのデバイスは配線をグラウンドへ引き下げることはできますが、Highへ駆動することは決してありません。バス上の2本のプルアップ抵抗(通常は電源レールへ 2.2 kΩ から 10 kΩ)が、誰も引き下げていないときに配線をHighへ引き上げます。ワイヤードOR動作はこれから生じます。配線をLowへ引いたデバイスが優先され、High状態は単に "誰も話していない" ことを意味します。
MCUのSCLおよびSDAピンの内蔵プルアップは、それ単独でバスのプルアップとして機能するには通常十分な強さがありません。通常はバス上に外付け抵抗が必要です。多くのセンサーブレイクアウトボードにはすでに含まれています。追加する前にデータシートを確認してください。
3.23.2. トランザクション¶
すべてのI2Cトランザクションは同じ形に従います。
I2Cトランザクション:START、7ビットアドレス + R/W、ACK、レジスタ、ACK、データ、NACK、STOP。¶
やり取りはビット単位で展開されます。
START。 コントローラーはSCLがまだHighの間にSDAをLowへ引き下げます。この通常とは異なるエッジが、バス上のすべてのデバイスにトランザクションが始まろうとしていることを伝えます。
アドレス + R/W。 コントローラーは7ビットのペリフェラルアドレスに続いて1ビットのリード/ライトビット(書き込みは
0、読み出しは1)をクロック出力します。ACK / NACK。 すべてのバイトの後、受信側が1クロックの間SDAを駆動してACK(Low)またはNACK(High)を返します。アドレスバイトでは、ペリフェラルは自分自身のアドレスを認識した場合にACKを返します。どのデバイスもACKを返さない場合、コントローラーはNACKを見て、そのアドレスがバス上にないことを知ります。
データバイト。 各バイトの後には受信側からのACKが続きます。書き込みではペリフェラルが各バイトにACKを返します。読み出しではコントローラーがもっと欲しい各バイトにACKを返し、最後のバイトにはNACKを返してペリフェラルに停止するよう伝えます。
STOP。 コントローラーはSCLがHighの間にSDAをHighへ解放し、トランザクションを終了します。
リピーテッドスタートとは、間にSTOPを挟まずに発行される2回目のSTARTです。コントローラーはバスを手放すことなく、同じペリフェラル上で方向を切り替えます(書き込みアドレス、続いて読み出しアドレス)。
3.23.3. アドレス指定¶
7ビットのアドレス空間は 0x08 から 0x77 までをカバーします。両端の値は特別な用途のために予約されています。各デバイスのアドレスはチップ設計者が設定しますが、多くの部品では下位ビットのいくつかをボードレベルで(ピンをHighまたはLowにつなぐことで)変更でき、同じセンサーを2つ同じバス上に置けるようになっています。
2つのデバイスがアドレスを共有すると、もう一方が干渉せずに一方と通信する方法がないため、部品を組み合わせる前にデータシートを確認してください。i2c.scan()(コードでのI2C で説明)はアドレス空間を走査し、どのアドレスが応答するかを報告します。これはバス上に何があるかを調べる標準的な方法です。
3.23.4. 長所と短所¶
このバスの長所と短所が、その適所を決めます。
多数のデバイスに2本のピン。 1組のSCL/SDAペアで十数個のセンサーを扱えます。SPIではデバイスごとに余分なCSピンが必要です。
標準的な速度。
100 kHz("標準モード")と400 kHz("ファストモード")でほぼすべてのセンサーをカバーできます。1 MHzも到達可能ですが、バス容量とプルアップのサイズ設定により多くを要求し始めます。SPIに比べて遅い。 数百キロビット毎秒を超える転送には、代わりにSPIが望ましいです。
アドレスの競合。 1つのバス上で同じアドレスを持つ2つのデバイスは、プロトコルでは回避できないハードウェア上の誤りです。