【ラズベリーパイ】i2cで2バイトのレジスタアドレスの読込みについて
仕事でラズベリーパイで基板上のICとi2c通信するときに困ったメモ。
目次
1. python-smbusで2byteのレジスタアドレスを読み込むことはできない
仕事上、基板のICをイジることが多いのですが、ICのセンサー情報などステータスをi2cで読むには以下画像のようなやりとりを行う。
画像に書いたように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. まとめ
だれか2byteレジスタの指定方法知っていれば教えてください。。。