Baud
プロトコル一覧

I2C

共有の 2 本線、7 ビットアドレス、バイトごとの応答。

センサのレジスタを読む

定番のトランザクションです。MPU-6050 モーションセンサに WHO_AM_I レジスタを尋ねます。START、アドレス、ACK、リピーテッドスタート、返ってくるデータを追いましょう。

SCLSDA110100000011101010110100010011010001アドレス 0x68レジスタ 0x75(WHO_AM_I)リピ…アドレス 0x68データ 0x68(スレーブか…スト…区分1 バイト目: アドレス + R/W71615041302010000xD02082 バイト目: レジスタ番号70615141302110010x751173 バイト目: アドレス + R/W71615041302010010xD12094 バイト目: 読んだデータ70615140312010000x68104

フレーム全体

1 回のトランザクション: レジスタ番号を書き、リピーテッドスタートで向きを変え、1 バイト読んで STOP。有用なデータ 1 バイトのために約 36 クロックを使います。アドレスと応答を持つ代償です。

  1. スタートコンディション

    SCL が High のまま SDA が立ち下がります。通常 SDA は SCL が Low の間にしか変化しないので、この「ルール違反」のエッジが「転送の始まり」を示す唯一の合図になります。

  2. アドレス 0x68

    7 ビットのデバイスアドレス 0x68(MPU-6050)を MSB から送ります。バス上の全デバイスが聞いていて、このアドレスを持つ 1 台だけが応答します。0x68 の後ろに R/W ビットが付いて、バイトとしては 0xD0 になります。

  3. R/W = 0(書き込み)

    0 は書き込みの意味です。次のバイト(レジスタ番号)はマスタからスレーブへ流れます。

  4. ACK(スレーブ)

    9 クロック目で、スレーブが SDA を Low に引いて「はい、ここにいます」と答えます。ACK は 0 です。誰も応答しなければ SDA はプルアップで High のままになり、マスタはアドレス違いかデバイス不在だと分かります。

  5. レジスタ 0x75(WHO_AM_I)

    読みたいレジスタの番号を送ります。0x75 は MPU-6050 の WHO_AM_I レジスタで、チップ自身のアドレス 0x68 が入っています。チップはこれを内部ポインタとして覚えます。

  6. データ 0x68(スレーブから)

    今度は SDA を駆動するのがスレーブで、マスタはクロックを出すだけです。レジスタの中身は 0x68 で、チップは自分のアドレスを答えます。配線が正しいことを確かめる、おなじみの WHO_AM_I チェックです。

  7. 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

関連するプロトコル