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 | |
2 | D6 | 0 | |
3 | D5 | 1 | |
4 | D4 | 0 | |
5 | D3 | 0 | |
6 | D2 | 0 | |
7 | D1 | 0 | |
8 | D0 | 0 | 書き込み処理 |
9 | ACK | LOW | スレーブより |
ここまではアドレスと書き込み指定のバイト
書き込みデータ1バイト目 | |||
---|---|---|---|
1 | D7 | 1 | データを示すビット 次のバイトは書き込みデータ |
2 | D6 | 0 | |
3 | D5 | 0 | |
4 | D4 | 0 | |
5 | D3 | 0 | |
6 | D2 | 0 | |
7 | D1 | 0 | |
8 | D0 | 0 | |
9 | ACK | LOW | スレーブより |
書き込みデータ2バイト目 表示する文字データ 0x38を送信 | |||
---|---|---|---|
1 | D7 | 0 | |
2 | D6 | 0 | |
3 | D5 | 1 | |
4 | D4 | 1 | |
5 | D3 | 1 | |
6 | D2 | 0 | |
7 | D1 | 0 | |
8 | D0 | 0 | |
9 | 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 | |
2 | D6 | 0 | |
3 | D5 | 0 | |
4 | D4 | 1 | |
5 | D3 | 1 | |
6 | D2 | 1 | |
7 | D1 | 0 | |
8 | D0 | 0 | |
9 | ACK | LOW | マスタより |
TMP102から読み込まれたデータ2バイト目 |
|||
---|---|---|---|
1 | D7 | 0 | |
2 | D6 | 1 | |
3 | D5 | 1 | |
4 | D4 | 1 | |
5 | D3 | 0 | |
6 | D2 | 0 | |
7 | D1 | 0 | |
8 | D0 | 0 | |
9 | 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 のデータ転送が可能。