Raspberry Pi で python-smbus を使用して、I2C を使用して MMA7660 加速度計チップと通信しようとしています。
以下のコードでは、チップのレジスタ 0x00、0x01、0x02、および 0x03 を読み取っており、すべてに対してまったく同じ値を取得しています。値を見て、チップを傾けると、それらはすべて X 値レジスタであるレジスタ 0x00 に対応していることがわかります。
出力:
...
1 1 1 2
3 3 3 3
1 1 1 1
59 60 60 60
51 51 51 51
58 58 58 58
3 3 3 3
62 62 62 62
58 58 58 58
62 62 62 62
...
コード:
import smbus
import time
bus = smbus.SMBus(1)
# I2C address for MMA7660
addr = 0x4C
try:
bus.write_byte_data(addr, 0x07, 0x00)
bus.write_byte_data(addr, 0x06, 0x10)
bus.write_byte_data(addr, 0x08, 0x00)
bus.write_byte_data(addr, 0x07, 0x01)
except IOError, err:
print err
while True:
try:
x = bus.read_byte_data(addr,0x00)
y = bus.read_byte_data(addr,0x01)
z = bus.read_byte_data(addr,0x02)
tr = bus.read_byte_data(addr,0x03)
print x, y, z, tr
time.sleep(0.25)
except:
print 'exiting...'
break
smbus 構文で何か間違っていますか? ドキュメントhereを見ました。
チップが動作することを確認しました。Arduino を使用し、上記と同じ順序でレジスタを設定して、正常に通信できます。
更新 #1 (2013 年 6 月 28 日) :
Sylvain のコメントに従って、次のコードの SDA/SCL ラインのオシロスコープ出力を添付しています。
bus.write_byte(addr, 0x01)
print bus.read_byte(addr)
更新 #2:
ラズベリーパイのI2Cには既知の問題があると思います-「繰り返し開始」はありません。
https://raspberrypi.stackexchange.com/questions/7138/mma8452-i2c-module
Linux SMBus 仕様によると:
SMBus Read Byte: i2c_smbus_read_byte_data()
============================================
This reads a single byte from a device, from a designated register.
The register is specified through the Comm byte.
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P
しかし、試してみると、オシロスコープはリピートスタート (S) の前にストップ (P) を明確に示しています。
したがって、Pi で I2C ハードウェアを使用して MMA7760 と通信するのは運が悪いと思います。