Cの特徴

どのような考え方で構成されているか

通信プロトコル

バスフリーフェーズ

バススタートフェーズ

アドレスフェーズ

アクノロジビット

データバイトの切れ目

データフェーズ

バス終了フェーズ

バスの競合調停方法
 
データフェーズ

 アドレスの指定データの最後のビット(アクノロジの前のビット)は規約によりデータフェーズの方向を示しています。 そのビットに従ってデータフェーズではデータラインをどちらが駆動するのかきめます。 ただしクロックは必ずマスタが駆動します。 出力側が8ビットのデータを送りだした後、受け側はアクノロジビットを返すことになります。 手順はアクノロジで説明した手順と同じです。 このデータフェーズを繰り返すことにより複数バイトの転送を行うわけです。 このときの疑問はどのようにしてデータの転送を終了するかと言うことです。 これには2種類があります。

  • マスタがデータを出力しているとき
    •  このときはスレーブがアクノロジを返さなかったときそれ以上のデータフェーズをスレーブが受けられないことを意味しているのでデータフェーズを終わります。
    •  またマスターが送り出すデータがなくなったときアクノロジを受け取ってもマスタの都合でデータフェーズを終わります
  • スレーブがデータを出しているとき
    •  マスタがアクノロジを返しても良し、返さなくても良くてマスターの都合でデータフェーズを終えます。 

 データフェーズが正しく終了できるコンディションでマスタはバス終了コンディションに移行します。

バス終了フェーズ

 バス終了はスタートコンディションと同じように通常状態では起こらない信号組み合わせとしてクロックが’H’の時のデータラインの’L’から’H’への立ち上がりエッジがある時をバスの終了とします。 これでクロックもデータも’H’になり通信ラインはバスフリー状態に戻るわけです。 手順は次の通りです。 クロックは当然アクノロジビットで’H’になった後再び次のフェーズのために’L’なっています。 このときマスタはデータラインを’L’にして一時クロック、データとも’L’の状態を作ります。 その後クロックの方を先に’H’にし、後でデータを’H’にする事による終了状態を実現します。 

バス再スタートフェーズ

 バスを使用して通信をしているときデータの送り出し方向を変えようと思うとバスの性格上、アドレスフェーズからやり直さなければなりません。 そのためにはバスを一旦終了することが考えられますが、終了すると他のノードがバスを使用しようと競合が起こるかもしれませんI2Cでは連続してバスを使用状態に保つため終了コンディションなくスタートコンディションを発生することを許しています。 これは再スタートフェーズとして別に考えていますがスタートコンディションと同じです。データフェーズの最後のアクノロジビットの終了でマスタがデータをドライブしなければデータは’H’になります。 この時点でクロック’L’、データ’H’の状態です。 その後クロックを’H’にしたあと、データを’L’にドライブしてスタートコンディションを強制的に起こすことにより再スタートになります。 このとき先のクロックの’H’への立ち上がりは次のデータの最初のビットと同じコンディションになりますから、スレーブから見たらビット数が合わなくなるようになりますが、クロックが’H’のときデータが’L’になることは通信の始まりと規定されていますので、その時点でスレーブはアドレス待ち状態に移行しなければなりません。 この再スタートでももう一度先と同じアドレスを送る必要があります。 それではなぜ再スタートがあるかというと、他のマスターにバスを引き渡さないで連続処理する目的です。

バスの競合調停方法

 バスの競合調整はとても簡単です。 2つのノードが同時にスタートコンディションを起こしても競合は発見できません。 しかしアドレスフェーズでスレーブをアドレスしているときスレーブアドレスがそれぞれ違うものを指していれば、バスがワイアードORなので’L’を出したマスタのビットが優先されることになります。 マスタは自分が出しているアドレスをモニターして、意図したバス状態でなければもう一つ以上のマスタがほかに同じタイミングでバスを使用しているとわかるわけです。 この時点でそれを検出した方が競合負けとなり、アドレス受信側にきりかえます。 勝ち残ったマスタは通信を続け終了フェーズになるまで他のノードは待つことになります。