我想更改 i2c 总线频率,以便允许稍长的电缆。
我正在使用 python-smbus 包,它工作得很好,但是,我无法找到如何设置总线频率。
我已经浏览了docs,但无法找到任何与设置总线参数相关的内容。
这是可以用 python 完成的事情还是我需要更低级别的东西?
我使用的是Raspberry PI,它是ARM架构。
在具有最新 Jessie 镜像的 Raspberry Pi 上,您可以使用它来检查当前的 I2C 频率:
sudo cat /sys/module/i2c_bcm2708/parameters/baudrate
。
要更改频率,您可以添加/更改此参数:
dtparam=i2c_baudrate=50000
(将 50000 替换为所需频率):
/boot/config.txt
然后重新启动以更改频率。
你必须做一些较低级别的事情。通常这些东西是由内核中的board file 设置的。除了分配资源之外,我没有看到 i2c 执行任何具体操作,因此它可能只是使用默认时钟除数。如果您查看数据表的第 28 页,您会发现默认值是 0x5dc。您需要将寄存器设置为不同的值(可能更大)以应对更长的电缆。
我现在花费了大量时间研究所有选项。事实证明,确实存在另一篇文章中指定的低杠杆寄存器,但是,Raspberry-Pi 的驱动程序在每次使用时都会重置它们的值,使得对它们的任何修改几乎毫无用处。解决方案是编写自定义 i2c 驱动程序或只是等待更新版本。
一些底层信息可以在byval论坛找到。
对于任何仍然感兴趣的人:
设置更高的总线速度是不够的。如果不是最低的,则 I2C 协议会发生变化,使用 100kHz。从机地址必须发送两次:首先通知从机更高速度的事务,然后让从机能够以更高的速度接收。
SMBUS 协议的总线频率固定为 100kHz。