I2Cのアクセス方法

I2C のデバイスにアクセスできる UART コマンドの使用方法です。

TWE-Lite DIP

I2Cのアクセス方法:コマンド0x88、ステータス0x89

この機能で出来るのはI2C対応のセンサーから値を読む等の数バイトの送信、または数バイトの受信です。例えば温度センサーを起動して、温度データを取得することができます。

※複数の送受信により連続的に処理される複雑なコマンド群の処理には適していません。
※連続モードでのみ動作し、間欠モードには対応していません。

入力データフォーマット(外部マイコン→TWE)

 入力データフォーマット(外部マイコン→TWE)
   1: 1バイト: 無線デバイスのアドレス (0xDB: 自分自身, 0x00 ~ 0x7F, 0x00:親機, 0x78: 全子機)
   2: 1バイト: 0x88
   3: 1バイト: 要求番号(応答メッセージにそのまま出力される識別子)
   4: 1バイト: コマンド (0x1: 書き込み, 0x2: 読み出し, 0x4: 書き込み&読み出し)
   5: 1バイト: I2Cアドレス (1010100 なら 0x54)
   6: 1バイト: I2Cコマンド (最初のコマンドバイト)
   7: 1バイト: データサイズ (無い時は 0)
   8: Nバイト: データ (データサイズが0のときは、本フィールドは無し)
   9: 1バイト: チェックサム

:DB88010123230055
 ^1^2^3^4^5^6^7^9

コマンド=0x4は、指定のI2Cコマンド+データ無しの書き込みを実施した直後、データサイズ
分の読み出しを実施する複合コマンドです。

UART 接続したモジュールに対し (1)、I2C の処理を行う(2)。応答確認用の値(3)は
0x01 で、書き込み(4, 0x01) を実行する。スレーブデバイスのアドレス(5) は 0x23、
続くコマンド(6) も 0x23を送付する。追加的なデータ転送 (7, 8) は無し。
UART コマンドのチェックサム(9) は 0x55 である。

:78880101232300B8
 ^1^2^3^4^5^6^7^8

上記 I2C コマンドを 0x78 アドレスの子機に送付する。
※ 0x78 アドレスの場合複数子機が電波範囲にいる場合は、全子機が応答する。
  特定子機を指定したい場合は 1 ~ 100 のアドレスを設定にて割り付ける。

出力データフォーマット(TWE→外部マイコン)

 出力データフォーマット(TWE→外部マイコン)
   1: 1バイト: 無線デバイスのアドレス
   2: 1バイト: 0x89
   3: 1バイト: 要求番号
   4: 1バイト: コマンド (0x1: Write, 0x2: Read, 0x4: Write&Read)
   5: 1バイト: 0:FAIL, 1:SUCCESS
   6: 1バイト: データサイズ (無い時は 0)
   7: Nバイト: データ (データサイズが0のときは、本フィールドは無し)

送信と同様の応答が戻ります。

■実行例 (SHT21 温湿度センサー)
レジスタの読み込みコマンド(一括)
  E7コマンド後に読み出し
    :7888AB0440E70129
  レジスタ値は 0x3A
    :7889AB0401013A14

レジスタ書き込み
  E6コマンド+1バイト(0xBB)書き込み
    :7888AB0140E601BB72
  成功
    :7889AB01010052

温度測定
  温度測定開始
    :7888AB0140F30021
  応答(成功)
    :7889AB01010052

  3バイト読み出し
    :7888AB0240000310
  応答 6E107B --> (0x6E10*17572+32768)/65536-4685=2870=28.70℃
    :7889AB0201036E107B55

湿度測定
  湿度測定開始
    :7888AB0140F5001F
  応答(成功)
    :7889AB01010052

  3バイト読み出し
    :7888AB0240000310
  応答 829A18 --> (0x829A*12500+32768)/65536-600=5777=57.77%
    :7889AB020103829A181A

チェックサムの計算方法

データ部の各バイトの和を8ビット幅で計算し、2の補数をとります。つまりデータ部の各バイトの総和+チェックサムバイトを8ビット幅で計算すると0になります。チェックサムバイトをアスキー文字列2文字で表現します。

例えば 00A01301FF123456 では 0x00 + 0xA0 + ... + 0x56 = 0x4F となり、この2の補数は0xB1 です。(つまり 0x4F + 0xB1 = 0)

※ ver1.6.5 以降では、チェックサムを省略し替わりに X を入力できるようになりました。(例 :780100112233X)

使用例

使用例は遠隔制御 - I2C出力遠隔監視 - I2C入力をご参照下さい。