我试图在一个树莓Pi上使用python smbus与使用I2C的MMA7660加速度计芯片通信
在下面的代码中,我正在读取芯片的寄存器0x00、0x01、0x02和0x03,得到的值完全相同。看看这些值,然后倾斜芯片,我可以看到它们都对应于寄存器0x00,即X值寄存器。
输出:
...
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在覆盆子Pi上有一个已知的问题-没有“重复启动”。
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
但当我尝试时,示波器在重复的开始之前清楚地显示了停止(p)。
所以我想我是运气不好,使用I2C硬件在Pi上与MMA7760交谈。
如果您一次读取所有需要的寄存器,它可以正常工作:
在查看了您的示例以及为MMA7455编写的类之后,我能够编写以下内容:
这应该能达到目的。
我绝对不确定这是问题所在,但根据规范p22:
据我所知,要“读取”寄存器,你必须从写入寄存器地址开始,然后盲目地读取一个字节。我不知道
SMBus.read_byte_data
是否能帮你解决这个问题,但你可以手动尝试一下:也许甚至可以:
相关问题 更多 >
编程相关推荐