【问题标题】:Raspberry Pi SMBus support combined data transmission?树莓派 SMBus 支持组合数据传输吗?
【发布时间】:2016-07-12 04:02:18
【问题描述】:

我正在尝试将 ACS764 霍尔效应电流传感器与 Raspberry Pi 一起使用。该传感器将感应电流并通过芯片内置的 I2C 接口返回其值。我已经按照规范连接了电路。在我的 Raspberry Pi Python 代码中,我可以向传感器写入数据和从传感器读取数据,但是我读取的数据始终是相同的值。

下面是我读取传感器的简单代码:

import datetime
import smbus
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.OUT) #Connected to the ACS764 Freeze pin

bus=smbus.SMBus(1)

#Freeze the data
GPIO.output(37, True)

#Read the values
bus.write_byte(0x60, 0x00) #Simulate the combined data transmission format
data=bus.read_i2c_block_data(0x60, 0x00)
print data

#Unfreeze the data
GPIO.output(37, False)

GPIO.cleanup()

但是,当我运行脚本时,即使我更改了要检测的电流值,该值也始终显示相同。

pi@Raspberry:~ $ python i2cAcs764.py 
[0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0]

根据ACS764规范,要读取传感器值,我需要使用“组合数据传输”格式。但是,我在 Python SMBus 库中没有找到任何允许我使用组合数据传输的函数,因此我现在使用“bus.write_byte”函数来模拟“组合数据传输”。以下是规范的屏幕截图。

ACS764 Datasheet Snapshoot

我现在的问题是如何使用Python SMBus I2C库来执行ACS764芯片的“组合数据传输”读取?

请指教,谢谢。

【问题讨论】:

  • 数据表屏幕截图中指定的协议似乎比您在 python 脚本中所做的要复杂得多
  • 我不确定我是否完全理解它,但这就是我阅读它的方式... MASTER:发送起始位+从地址+写入位(零)+源寄存器地址的序列。 MASTER:发送另一个序列,但这次是起始位 + 从地址 + 读取位 (1)。 SLAVE:发送数据字节 1。 MASTER:将 SDA 拉低。 SLAVE:发送数据字节 2。 MASTER:将 SDA 拉低。 SLAVE:发送数据字节 3。 MASTER:发送停止位。这是来自 MASTER/python 的 5 个单独传输和来自 SLAVE/霍尔传感器的 3 个响应。很多来回(命令、数据和 ACK)。我敢肯定,使用库会容易得多

标签: python i2c


【解决方案1】:

在google了几天后,我终于找到了解决上述问题的方法。答案是 Raspberry I2C 接口确实支持“组合数据传输”(又名重复启动),但默认情况下不启用。您需要通过以下命令启用该设置。

sudo su -
echo -n 1 > /sys/module/i2c_bcm2708/parameters/combined
exit

更多信息请参考i2c repeated start transactions

基于smbus规范支持重复启动的函数是i2c_smbus_read_i2c_block_data(),在Python库中是调用read_i2c_block_data()。

详情请咨询SMBus Protocol Summary

下面是我的示例代码,它从需要重复启动的 ACS764 霍尔效应传感器芯片读取数据。

import datetime
import smbus
import time

bus=smbus.SMBus(1)

# Write setting parameter to the chip
data = [0x02, 0x02, 0x02]
bus.write_i2c_block_data(0x60, 0x04, data)

# Read the data out of the chip that require Repeated Start
data=bus.read_i2c_block_data(0x60, 0x00)
print data

我很高兴找到解决方案,并希望那些面临同样问题的人可以从这篇文章中获得帮助。谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多