在Raspberry Pi上使用Python smbus-与语法混淆 [英] Using Python smbus on a Raspberry Pi - confused with syntax
问题描述
我正在尝试在Raspberry Pi上使用python-smbus与I2C进行MMA7660加速度计芯片通信.
I am trying to use python-smbus on a Raspberry Pi to communicate with an MMA7660 accelerometer chip using I2C.
在下面的代码中,我正在读取芯片的寄存器0x00、0x01、0x02和0x03,并且得到的值完全相同.查看这些值并倾斜芯片,我可以看到它们都对应于寄存器0x00,即X值寄存器.
In the code below, I am reading registers 0x00, 0x01, 0x02 and 0x03 of the chip, and I am getting the exact same values for all. Looking at the values, and tilting the chip, I can see that they all correspond to register 0x00, the X value register.
输出:
...
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语法上做错什么了吗?我确实在此处中查看了文档.
Am I doing something wrong with the smbus syntax? I did look at the documentation here.
我已经验证了芯片的工作原理-我可以使用Arduino与它进行良好的通信,并按照与上述相同的顺序设置寄存器.
I have verified that the chip works - I can communicate fine with it using an Arduino and setting the registers in the same order as above.
更新#1(2013年6月28日):
根据Sylvain的评论,我为以下代码附加了SDA/SCL行的示波器输出:
As per Sylvain's comment, I am attaching oscilloscope output for SDA/SCL lines for the following code:
bus.write_byte(addr, 0x01)
print bus.read_byte(addr)
更新#2:
我想Raspberry Pi上的I2C存在一个已知问题-没有重复启动".
I guess there is a known problem with I2C on Raspberry Pi - there is no "Repeated Start".
https://raspberrypi.stackexchange.com/questions/7138/mma8452-i2c-module
根据Linux SMBus规范:
According to the Linux SMBus spec:
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)之前清楚地显示了STOP(P).
But when I tried it, the osciiloscope clearly shows a STOP (P) before the Repeated Start (S).
所以我想我很不高兴在Pi上使用I2C硬件与MMA7760对话.
So I guess I am out of luck for using I2C hardware on the Pi to talk to the MMA7760.
推荐答案
如果您一次读取所有需要的寄存器,则可以正常工作:
if you read all the needed registers at once, it works fine:
import smbus
bus = smbus.SMBus(1)
Register = bus.read_i2c_block_data(0x4c, 0x99,4)
acc_x = Register[0]*1.0
acc_y = Register[1]*1.0
acc_z = Register[2]*1.0
acc_tilt = Register[3]
这篇关于在Raspberry Pi上使用Python smbus-与语法混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!