ぼくだってブログ書くねん

意識向上を目指した意識高い系ブログです。本業はなんちゃって電気設計業務です。

【ラズベリーパイ】i2cで2バイトのレジスタアドレスの読込みについて

仕事でラズベリーパイで基板上のICとi2c通信するときに困ったメモ。

目次

1. python-smbusで2byteのレジスタアドレスを読み込むことはできない

仕事上、基板のICをイジることが多いのですが、ICのセンサー情報などステータスをi2cで読むには以下画像のようなやりとりを行う。

f:id:nbk01409:20180804211316p:plain

画像に書いたようにRegisterアドレスは1 byteで呼ぶことが多いのである。
したがってpython-smbusの例えば、
read_byte_data(int addr,char cmd)

というICのレジスタを読む関数だと、
read_byte_data(0x64, 0x01)

のようにすればスレーブアドレス0x64で0x01コマンドを実行して返してくれるのである。
しかし、このchar cmd は1 byteまでしか対応していないのである。(そもそも何故char型?)

意地の悪いことに 2byteアドレス(例えば0x2345)を指定して、 read_byte_data(0x64, 0x2345)

と打ってもエラーが出ないでナチュラルに下位1byteだけ認識して
read_byte_data(0x64, 0x45)

を実行してやがる(波形を見て確認しました)。

結論としてはpython-smbusでは2byte レジスタを指定できないことがわかった。

2. 応急処置と対策

ラズベリーパイで2byteレジスタを指定したいときはシェルスクリプトで一応解決可能。 read_byte_data(0x64, 0x2345)

のようなことしたい場合は、
sudo i2cset -y 1 0x64 0x23 0x45 b
sudo i2cget -y 1 0x64

とやってやれば一応は解決できる(もはやpythonじゃないけど)

あとはpython-smbusを2byteレジスターを指定できるように書き換えるしかないように思います。
それができれば、いいんだけど今の私の技術では難しいですね。。。

3. まとめ

  • python-smbusでは2byte レジスタを指定できない
  • シェルで i2cse tと i2cget を組み合わせれば可能

だれか2byteレジスタの指定方法知っていれば教えてください。。。