【问题标题】:Resetting frozen I2C bus using dev adapter使用开发适配器重置冻结的 I2C 总线
【发布时间】:2018-02-19 17:08:09
【问题描述】:

我正在使用控创嵌入式计算机通过 I2C 与 ST 微控制器通信。我正在使用开发适配器与 I2C 接口,使用here 中描述的简单 read() 和 write() 函数。

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

有人对我能做什么有任何建议吗?有没有一种方法可以通过 I2C 进行通信,使用其他方法可以优雅地处理通信失败而不冻结?或者任何可以重置 I2C 的方式?

【问题讨论】:

  • “诀窍”是发送九个时钟。对“重置 I2C 设备”的简单搜索将为您提供多个链接。例如:community.nxp.com/thread/316813
  • 我们遇到的问题是我们正在使用 linux 系统读写一个打开的文件句柄。那么,鉴于我们无法控制特殊状态,例如 6 ms 内的线路上行或线路下行电压或其他什么,我们如何发送复位。有些设备需要重置。例如 i2c 路由器,卡在某个模式中,并且在重置它们之前无法更改它们的输出。本质上,该设备消失并变得“不可见”。

标签: c++ c linux embedded


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常抱歉地球的一侧消失了一会儿。不过我想问一下,你如何单独控制时钟线?开发适配器不提供该功能,而且我以前从未在 linux 环境中控制过单个引脚,只是在通过写入寄存器来设置引脚的微控制器上。是否也有类似的设备特定寄存器可以正确?还是linux操作系统提供的另一层抽象,在i2c dev适配器下面,可以用来单独控制线路?
    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多