I2Cバスは,フィリップスが開発した2線式双方向のシリアル通信バスです。
マスターから,バスに並列に接続された複数のスレーブに対して,読み取りと書き込み操作を行うことができる。
マスター,スレーブともに,入力兼オープンドレイン出力のシリアルクロック(SCL),シリアルデータ(SDA)の2つのラインを持っていて,これを並列に接続する。
スレーブは,7bitのスレーブアドレスによって選択できる。
この7bitのスレーブアドレスに,Read/Writeフラグを追加して,スレーブの選択の読み書きの方向を変更している。
同じ基板内などのように,比較的近距離で直結したデバイスと,100kbpsまたは400kbpsの低速度でシリアル通信を行うように使われるように規定されている。
シリアルクロック(SCL)は,マスターから出力される。スレーブは,このマスターからのSCLに合わせて,SDAの入出力を行う。すなわち,SCLに合わせてSDAからデータを読み取り,あるいはSCLに合わせてSDAにデータを出力する。
バス上の通信は,マスター側からのSTARTコンディション(SCLが1の間にSDAが1→0に変化)で始まり,STOPコンディション(SCLが1の間にSDAが0→1に変化)で終了します。 データビットは,SCLが1レベルの間に確定されます。*1 データビットでは,SCLが1の間はSDAは変化してはいけません。SDAのレベルの変更,入出力の切り替えは,SCLが0の間に行います。
データの単位は,1byte(8bit)で,上位bitから順に転送される。1byteごとに受信側は送信側にACK(1bitの0)を返します。
1byte受信後に,NAK(1bitの1)を返すこともできます。通常これは,スレーブからマスターへのデータ転送において,マスターがデータ転送終了をスレーブに伝える時に使います。
SPIと大きく違うのは,個々のスレーブがアドレスを持っていて,データの中にアドレスが含まれていることと,1bute転送毎に受信側からACK信号を返信して,互いに確認を取りながらデータ転送を行っている。
一連の通信は,必ずマスターからのSTARTコンディションを送ることで始る。
STARTコンディションの直後の1byteは,7bitのスレーブアドレスと,1bitのRead/Writeフラグです。
Read/Writeフラグには,マスターからスレーブに転送する場合は0を,スレーブからマスターへ転送する場合は1を設定します。
接続されている全スレーブは,この時のSCLのクロックを元にSDAのデータを受信するが,自分のアドレスと一致したデバイスだけが,その後の送受信を行うようになっている。
スレーブアドレスを受信したスレーブが,マスターに対してACKを返すことで,マスター・スレーブ間の通信が確立される。
マスターからスレーブへの転送(書き込み)では,スレーブがスレーブアドレスに対してACKを返した後,そのままマスターからスレーブへデータを送信していきます。1バイトごとにスレーブがACKを返す。
データを送り終わったら,マスターからSTOPコンディションを送り,通信を終了する。
スレーブからマスターへの転送(読み取り)では,スレーブがスレーブアドレスに対してACKを返した後,スレーブからマスターへデータが送信される。マスターはこれに対してACKを返すが,最後のバイトの場合のみ,NAKを返すことで,スレーブに対してデータ転送の終了を伝える。
例えば,EEPROMのように,読み取る前に読み取るROM上のアドレスを指定する必要があるような場合は,書き込みと読み取りを複合して通信します。
この場合では,一旦書き込みで開始し,読み取りたいアドレスなどの情報をスレーブに送信した後,STOPコンディションを送らずに,再度STARTコンディションを送って,読み取りに移行します。
新しくコメントをつける