M-V*_*M-V 5 python i2c raspberry-pi
我正在尝试在 Raspberry 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
...
Run Code Online (Sandbox Code Playgroud)
代码:
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
Run Code Online (Sandbox Code Playgroud)
我的 smbus 语法有问题吗?我确实看过这里的文档。
我已经验证该芯片工作正常 - 我可以使用 Arduino 与它进行良好的通信,并按照与上述相同的顺序设置寄存器。
更新 #1(2013 年 6 月 28 日):
根据 Sylvain 的评论,我为以下代码附加了 SDA/SCL 线的示波器输出:
bus.write_byte(addr, 0x01)
print bus.read_byte(addr)
Run Code Online (Sandbox Code Playgroud)

更新#2:
我猜想 Raspberry Pi 上的 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
Run Code Online (Sandbox Code Playgroud)
但当我尝试时,示波器在重复启动(S)之前清楚地显示了停止(P)。
所以我想我不太幸运在 Pi 上使用 I2C 硬件与 MMA7760 通信。
我绝对这是问题所在,但根据规范 p22:
\n\n\n\n\nMMA7660FC 的读取使用其内部存储的寄存器地址作为地址指针,与存储的寄存器地址作为地址指针进行写入的方式相同。使用与写入相同的规则读取每个数据字节后,指针通常会自动递增(表 5)。因此,首先通过执行写入配置 device\xe2\x80\x99s 寄存器地址来启动读取然后重复启动。主设备现在可以从中读取“n”个连续字节,第一个数据字节是从初始化寄存器地址所寻址的寄存器中读取的。
\n
据我了解,要从寄存器“读取”,您必须首先写入寄存器地址,然后盲目读取一个字节。我不知道是否会SMBus.read_byte_data为您解决这个问题,但您可以手动尝试尝试:
bus.write_byte(addr,0x00)\n x = bus.read_byte(addr)\n\n bus.write_byte(addr,0x01)\n y = bus.read_byte_data(addr)\n\n bus.write_byte(addr,0x02)\n z = bus.read_byte(addr)\n\n bus.write_byte(addr,0x03)\n tr = bus.read_byte(addr)\nRun Code Online (Sandbox Code Playgroud)\n\n或许这甚至会起作用:
\n\n bus.write_byte(addr,0x00)\n\n x = bus.read_byte(addr)\n y = bus.read_byte_data(addr)\n z = bus.read_byte(addr)\n tr = bus.read_byte(addr)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
73295 次 |
| 最近记录: |