Raspberry Pi で I2C の Repeated Start Condition を有効化する方法を紹介します.
はじめに
Raspberry Pi の I2C ドライバ(i2c_bcm2708)はデフォルトでは Repeated Start Condition (以下,リスタート)に対応していません.
リスタートを行う場合,下図で赤線で示したように,ACK の後に STOP コンディションにせず,続けて START を発行します.
デバイスによっては,レジスタの読み書きにリスタートを要求するものがあります.そういったデバイスを使う場合は,以下に記載する方法で I2C ドライバのリスタートを有効化する必要があります.
リスタートの有効化方法
「/etc/modprobe.d/i2c.conf」というファイルを作成し,下記の内容を書き込むだけです.
1 |
options i2c_bcm2708 combined=1 |
効果の確認
リスタートが必要な I2C デバイスで効果を確認してみます.
秋月電子で売られている I2C 温度計で使われている ADT7410 は,レジスタの読み出しの際,リスターを行う必要があります(下図).
そこで,このデバイスに対して,レジスタの読み書きを行ってみます.
設定前
1 2 3 |
$ sudo i2cset -y 1 0x48 0x03 0x80 b $ sudo /usr/sbin/i2cget -y 1 0x48 0x03 b 0x09 |
アドレス 0x03 の Configuration Register に対して 0x80 を書き込んだのに,読み出すと何故か 0x09 という値が返ってきてしまいました.
設定後
1 2 3 |
$ sudo i2cset -y 1 0x48 0x03 0x80 b $ sudo i2cget -y 1 0x48 0x03 b 0x80 |
書き込んだ 0x80 が正しく読み出せました.
ちなみに,上記のレジスタ書き込みは ADT7410 を 16bit 分解能で動かすための設定になります.巷ではデフォルトの 13bit のまま動かしてる人が多いですが,精度を上げたいかたは試してみてください.
参考文献
- THE I2C-BUS SPECIFICATION[キャッシュ]
- I2C プロトコルの仕様書です.I2C はシンプルなプロトコルなので,この文書読むだけで大体のことは理解できます.
コメント
[…] →ここのHPで説明されていた。Raspberry Pi で I2C の Repeated Start Condition を有効化 […]
[…] ってみた秋月で売っている、温湿度センサー(AE-HDD1000)、大気圧(温度)センサー(AE-LPS25H)。これも使えると思います。以下の設定が必要です。 Raspberry Pi で I2C の Repeated Start Condition を有効化 […]
[…] →ここのHPで説明されていた。Raspberry Pi で I2C の Repeated Start Condition を有効化 […]