I2Cの基本データフォーマット


【基本の通信の信号シーケンス】

I2C通信における信号はクロックSCLとデータSDAの2本の信号線で行われますので、
その信号の同期をとるために信号ライン上のタイミングなどで区別され、下図のように
なっています。

(1) Start Condition
  通信の最初を示す信号で、SCL、SDA両方がHighの時に、マスタがSDAをLowに
  することで区別します。 マルチマスタの時にも、両方のラインがHigh状態であれば
  衝突は起きていないこととなります。
(2) データ送信とACK返信
  SCLのクロックがLowの時にデータを遷移させることで順次、高位ビットから送信され
  ます。1バイトの送信が完了すると、受信側が正常受信であったらACKを返送します。
  異常受信の時には何も返しません。
(3) Stop Condition
  クロックが終了してSCLがHighになったときに、SDAをHighに変化させると、そこで終了
  ということでStop Conditionとなります。
(4) Clock Stretch
  スレーブ側から送信するとき処理時間が間に合わないときには、クロックラインをLow
  に強制的にすることで、マスタ側がクロックを送信するのを待たせることができます。
  本来はいつでもクロックストレッチは可能で、スレーブ側がSCLラインをLowにすれば
  マスタ側からのクロックの送信を抑制することができます。
  さらに、速度の異なるデバイスが同じラインに接続されている場合には、デバイスが
  特定されるまでは、クロックストレッチにより、もっとも遅いデバイスの速度に全体が
  抑制されます。デバイスがアドレスにより特定されたあとは、そのデバイスの速度で
  通信することができます。
  これは、ラインがワイアードANDになっているため、すべてのデバイスがSCLラインを
  アイドルにしないとHighにならないためです。





【通信手順とデータフォーマット】

I2Cで通信を行うときの信号フォーマットは下図のようになっています。
まずスレーブのアドレス指定方法に7ビットと10ビットの2種類があります。現状では
大部分が7ビットアドレスです。

(1) 7ビットアドレスの場合
  この場合にはアドレスが1バイトで送信できるため、手順としては簡単になっています。
  最初にマスタからアドレスとRead/Writeを指定するデータが送信され、あとはReadか
  Writeかによって手順が分かれますが、データ8ビット送受信後、受信側がACKを返す
  という手順で進行します。そして通信の最後はStop Conditionで終了します。
  スレーブ側から送信する場合には、処理時間を確保するために、クロックストレッチに
  よってマスタを待たせることができます。
  さらにマスタ側は、送信終了のStop Conditionを発行する代わりに、Repeated Start
  Conditionを発行することで、連続して別のスレーブとの通信を行うことができます。
  このときにはI2Cバスを開放しないので、マルチマスタの時にも連続通信となります。
  






 (2) 10ビットアドレスの場合
   アドレスが10ビットの場合にはアドレスを送信するのに2バイトが必要となるため、通信
   の開始手順が複雑となります。
   まず受信の場合には、単純にアドレスの1バイト目を受信要求で送り、続いてアドレスの
   2バイト目を送ります。特に異常もなくACKが返ってくれば、そのまま続いてデータを送信
   します。スレーブ側では、アドレスが一致したスレーブだけが、以降のデータ受信動作を
   行います。
   マスタが送信要求を出す場合には、複雑になります。まず2バイトのアドレスを送信します。
   これで特定のスレーブだけが指定されます。続いて Repeated Start Conditionとして
   再スタートをします。この時にRead/WriteビットにRead要求を出力します。すでにアドレス
   指定されていたスレーブがこれに対応してデータを出力しマスタがそれを受信して正常な
   らACKを返送します。最後はマスタはACKを返送せずにStop Conditionを発行して終了と
   なります。このときにもスレーブ側がクロックストレッチをすることで処理時間を確保できる
   のは同じです。









  トップページへ