C++ 使用dev适配器重置冻结的I2C总线

C++ 使用dev适配器重置冻结的I2C总线,c++,c,linux,embedded,C++,C,Linux,Embedded,我使用kontron嵌入式计算机通过I2C与ST微控制器通信。我使用dev适配器与I2C接口,使用上面描述的简单read()和write()函数 问题是,如果从机由于任何原因未能确认一个字节,I2C总线将冻结,主机无法发送或接收任何信息(即使程序关闭并重新启动!)。目前,我唯一可以重置I2C总线的方法是重新启动,这远远不够理想 有人对我能做什么有什么建议吗?是否有一种通过I2C进行通信的方法,可以使用其他方法优雅地处理通信故障,而无需释放空间?或者以任何方式重置I2C?最近的内核支持驱动程序级别

我使用kontron嵌入式计算机通过I2C与ST微控制器通信。我使用dev适配器与I2C接口,使用上面描述的简单read()和write()函数

问题是,如果从机由于任何原因未能确认一个字节,I2C总线将冻结,主机无法发送或接收任何信息(即使程序关闭并重新启动!)。目前,我唯一可以重置I2C总线的方法是重新启动,这远远不够理想


有人对我能做什么有什么建议吗?是否有一种通过I2C进行通信的方法,可以使用其他方法优雅地处理通信故障,而无需释放空间?或者以任何方式重置I2C?

最近的内核支持驱动程序级别的I2C恢复(请参阅),此恢复应自动触发。您可能必须为内核实现恢复方法和/或将所需的scl/sda gpios定义添加到devicetree。

最常见的I2C总线错误是从设备,其“数据线”处于低电平状态。要恢复总线,主设备应生成时钟,直到“数据线”变高。

诀窍是发送九个时钟。只需搜索“重置I2C设备”即可获得多个链接。例如:我们的问题是,我们正在使用linux系统读取和写入一个开放的文件句柄。既然我们不能控制特殊状态,比如6毫秒的线路上升或线路下降电压,我们怎么发送复位信号呢。有些设备需要重置。例如,i2c路由器被卡在一个模式中,在重置它们之前,您无法更改它们的输出。从本质上说,这个装置消失了,变成了“看不见的”。非常抱歉地球的一面消失了一会儿。我想问的是,你是如何单独控制时钟线的?dev适配器不提供这种功能,而且我以前从未在linux环境中控制过一个管脚,只有在微控制器上,通过写入寄存器来设置管脚。是否也存在类似的特定于设备的寄存器?或者linux操作系统是否提供了另一层抽象,在i2c开发适配器下面,可以用来单独控制线路?