I2C
共有の 2 本線、7 ビットアドレス、バイトごとの応答。
センサのレジスタを読む
定番のトランザクションです。MPU-6050 モーションセンサに WHO_AM_I レジスタを尋ねます。START、アドレス、ACK、リピーテッドスタート、返ってくるデータを追いましょう。
フレーム全体
1 回のトランザクション: レジスタ番号を書き、リピーテッドスタートで向きを変え、1 バイト読んで STOP。有用なデータ 1 バイトのために約 36 クロックを使います。アドレスと応答を持つ代償です。
スタートコンディション
SCL が High のまま SDA が立ち下がります。通常 SDA は SCL が Low の間にしか変化しないので、この「ルール違反」のエッジが「転送の始まり」を示す唯一の合図になります。
アドレス 0x68
7 ビットのデバイスアドレス 0x68(MPU-6050)を MSB から送ります。バス上の全デバイスが聞いていて、このアドレスを持つ 1 台だけが応答します。0x68 の後ろに R/W ビットが付いて、バイトとしては 0xD0 になります。
R/W = 0(書き込み)
0 は書き込みの意味です。次のバイト(レジスタ番号)はマスタからスレーブへ流れます。
ACK(スレーブ)
9 クロック目で、スレーブが SDA を Low に引いて「はい、ここにいます」と答えます。ACK は 0 です。誰も応答しなければ SDA はプルアップで High のままになり、マスタはアドレス違いかデバイス不在だと分かります。
レジスタ 0x75(WHO_AM_I)
読みたいレジスタの番号を送ります。0x75 は MPU-6050 の WHO_AM_I レジスタで、チップ自身のアドレス 0x68 が入っています。チップはこれを内部ポインタとして覚えます。
データ 0x68(スレーブから)
今度は SDA を駆動するのがスレーブで、マスタはクロックを出すだけです。レジスタの中身は 0x68 で、チップは自分のアドレスを答えます。配線が正しいことを確かめる、おなじみの WHO_AM_I チェックです。
NACK(マスタ)
最後のバイトのあと、マスタは SDA を High のままにします。NACK は「もう十分、続きは要らない」という意味です。ここで ACK を返すと、スレーブは次のレジスタを送り続けます。
概要
I2C(Inter-Integrated Circuit)は、SCL(クロック)と SDA(データ)の 2 本だけで多数のチップをつなぎます。各デバイスは 7 ビットのアドレスを持ち、マスタが転送を始めてアドレスを送ると、一致した 1 台だけが応答します。1 バイトごとに、受信側が ACK を 1 ビット返します。
2 本ともオープンドレインで、プルアップ抵抗によって High になります。これが多数のデバイスで安全に共有できる理由です。データのビットは SCL が Low の間に変化し、SCL が High の間に読まれます。唯一の例外が START と STOP で、転送の始まりと終わりを示します。
基本情報
- 信号線
- SCL, SDA
- クロック
- マスタが SCL を出力
- よくある速度
- 100 kHz / 400 kHz / 1 MHz
- アドレス
- 7 ビット(10 ビットも可)
- ビット順
- MSB first
- 接続形態
- マルチマスタ・マルチスレーブのバス
使われる場面
- センサ類: 温度・IMU・気圧・照度
- 小型 OLED、RTC、EEPROM、GPIO エキスパンダ
- 電源管理の PMBus・SMBus は近縁のプロトコル
つまずきやすい点
- プルアップ抵抗は必須です(目安 2.2〜10 kΩ)。ないと線が High にならず、何も動きません。
- データシートは 8 ビット表記(0xD0)と 7 ビット表記(0x68)が混在します。取り違えると「デバイスが見つからない」になります。
- クロックストレッチ(スレーブが SCL を Low に保つ)にマスタが対応していないと、バスが固まります。
- 同じバス上のアドレスは重複できません。同じセンサを 2 つ使うなら、アドレスピンか I2C マルチプレクサが要ります。
出典・規格
- NXP UM10204: I2C-bus specification and user manual
- InvenSense MPU-6000/6050 register map