記事  TOPに戻る

I2Cインターフェースのセンサを接続する(4)I2Cのタイミング

■I2Cの送受信データ

 前回は、I2Cのバスに流れる信号の電圧レベルの確認を行い、テスト回路ではそれらの条件を満たされていることを確認しました。
 今回は、信号がどのような仕組みになっているか、仕様とテスト回路の波形とで確認します。I2Cの仕様の確認はNXPの「I2Cバス仕様およびユーザーマニュアル」を参考にし、図を引用しています。詳細な説明がありますので詳しく知りたい方はこちらも参考にしてください。
    https://www.nxp.com/docs/ja/user-guide/UM10204.pdf 

(※)2018/10/25 ドキュメントのURLが変更されているので、修正した。

●処理の手順の原則
◆SCLの出力
 クロックのSCLはサーバが原則出力します。スレーブは次の処理が間に合わない場合、マスタからのACKのクロックのSCLを引き延ばすために、SCLバスにLOWを出力します。それ以外はSCLの制御はサーバが行います。
◆SDAとSCLの関係
 データはSDAの信号のHIGH、LOWでシリアル・データの1、0を示します。このSDAのHIGH、LOWの期間は、次に示すようにSCLのパルスの立ち上がりから元のLOWになるまでの期間、安定に保つ必要があります。HIGH、LOWの変化は、SCLのLOWの間に完了しなければなりません。

●マスタが通信を制御する
 SCLがHIGHのとき、SDAがHIGHからLOWになると、次に示すようにスタート・コンディションと呼ばれるデータ転送の開始の状態になります。同様にSCLがHIGHのとき、SDAがLOWからHIGHになるとストップ・コンディションと呼ばれるデータ転送の終了となります。マスタによりこの制御を行います。

●転送データのフォーマット
 マスタは、データの転送の初めに必ず通信相手のアドレスをD1~D7の7ビットにセットし、D0にR/Wを示すビットをセットした1バイト(8ビット)のデータをI2Cバスに流します。D0が1のとき、スレーブからのデータをマスタが読み取り、D0が0のときはマスタがスレーブに書き込むデータを送信し、スレーブはそのデータを読み込みます。

 受信データを受信すると、SCLのクロックの9番目に合わせてSDAをLOWにしたACKをバスに流します。

●マスタからスレーブへデータを書き込むとき
 次に示すのは、I2C接続のキャラクタLCDディスプレイに「8」の文字を表示するためのデータを、I2C接続のキャラクタLCDディスプレイ・モジュールに書き込んでいる波形です。

スタート・コンディション
 1  D7  1  
 D6  
 D5  
 D4  
 D3  
 D2  
 D1  
 D0  書き込み処理
 ACK LOW   スレーブより



 ここまではアドレスと書き込み指定のバイト

書き込みデータ1バイト目
 1  D7  1  データを示すビット 次のバイトは書き込みデータ
 D6  
 D5 0  
 D4  
 D3  
 D2  
 D1  
 D0  
 ACK LOW   スレーブより

書き込みデータ2バイト目 表示する文字データ 0x38を送信
 1  D7 0  
 D6  
 D5 1  
 D4 1  
 D3 1  
 D2  
 D1  
 D0  
 ACK LOW   スレーブより



 このデータを送信後、マスタはSCLをHIGHにして、SDAをLOWからHIGHにするストップ・コンディションを設定しています。


●スレーブからデータを読み取る場合
 次に示すのは、TMP102からの温度データを読み取るための最初のバイト

スタート・コンディション
1 D7 1  
2 D6 0  
3 D5 0 D7からD1でスレーブアドレス 0x50を指定
4 D4 1  
5 D3 0  
6 D2 0  
7 D1 0  
8 D0 1  読み込みの処理
9 ACK LOW  スレーブより

  ここまではアドレスと書き込み指定のバイト

TMP102から読み込まれた1バイト目のデータ

 1  D7  0  
 D6  
 D5 0  
 D4 1  
 D3 1  
 D2  
 D1  
 D0  
 ACK LOW   マスタより

TMP102から読み込まれたデータ2バイト目

 1  D7  0  
 D6 1  
 D5 1  
 D4 1  
 D3 0  
 D2  
 D1  
 D0  
 NACK HIGH  マスタよりデータ転送の終了が示される

 このデータを送信後、マスタはSCLをHIGHにして、SDAをLOWからHIGHにするストップ・コンディションを設定しています。
 その後、スタート・コンディション、0x00、ACK、ストップ・コンディションの波形が記録されていますが、今のところ何を表しているか不明です。引き続き調べてみます。
 読み取った1バイト目と2バイト目の上位4ビットで、次のような測定データが得られました。

     00011100111=455
     455×0.0625=28.32375


 28.3℃の測定結果が得られました。

(2016/10/9 V1.0)

<神崎康宏>

バックグラウンド

NXP;I2Cはフィリップスが作ったシリアル通信の規格です。フィリップスの半導体部門が分離独立したのがNXPです。

I2Cの転送速度; Standard-mode では最大100kbit/s、Fast-mode では最大400kbit/s、Fast-mode Plus では最大 1Mbit/s、High-speedでは最大 3.4Mbit/s のデータ転送が可能。

連載メニュー ArduinoにI2Cインターフェースのセンサを接続する

(1) I2Cインターフェースの温度センサTMP102を接続

(2) I2Cインターフェースの温度センサTMP102を接続(2)

(3) I2Cインターフェースの温度センサTMP102を接続(3)I2Cバスの負荷抵抗

(4) I2Cインターフェースの温度センサTMP102を接続(4)I2Cの送受信データ