I2C读挂起WAIT_FOR_RECEIVED_BYTE();

10个帖子/ 0个新
最后发表
戴夫。意甲首轮
离线
最后看到:2年9个月前
加入:2015-10-08 13:21
I2C读挂起WAIT_FOR_RECEIVED_BYTE();

嗨,支持,

我正在使用i2c总线将DA14580与传感器连接。时不时地,传感器不会响应读请求,我的代码在WAIT_FOR_RECEIVED_BYTE()上挂起;.因为我在ram中存储日志数据,我不想使用看门狗定时器从这种情况下恢复,因为重置将清除所有的日志数据。有什么办法能让我从这种情况中恢复过来吗?任何建议都将非常感激。谢谢。

设备:
MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
你好戴夫,

你好戴夫,

关于这一点,您是正确的,并且有一个内部罚单来改进i2c驱动程序。一种想法可能是使用硬件计时器实现超时处理,或者甚至使用一个普通变量作为计数器,如果从端没有活动,该变量将打破无条件的while循环。

由于MT_dialog

离线
最后看到:4年8个月前
加入:2016-06-01 06:05
嗨MT_dialog,

嗨MT_dialog,

在这个问题上有什么进展吗?

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
你好,

你好,

目前为止,我们还没有更新I2C驱动程序。请看看这篇文章,也许它会帮助你实现当I2C连接的另一端没有响应时的超时。

https://support.dialog-semiconductor.com/i2c-communication-flow-protecti..。

由于MT_dialog

caiziee
离线
最后看到:2年6个月前
加入:2016-07-29远
嗨,对话框中,

嗨,对话框中,
这个i2c驱动程序问题修复了吗?是否有新的驱动程序发布?我也面临着这个问题。

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
嗨caiziee,

嗨caiziee,

您可以查看最新的5.0.4 SDK的i2c_eeprom示例,该示例的驱动程序包含一个超时方案,如果没有活动设备返回一个错误代码。但是,如果在读取数据时使用的传感器没有响应,则必须实现一个自定义方案,即等待接收字节或类似内容的最大时间。

由于MT_dialog

DDDDragon
离线
最后看到:2年9个月前
加入:2017-08-11 05:55
嗨,对话框中,

嗨,对话框中,
我也面临着这个问题。根据现有的讨论,我没有找到一个可行的解决方案。你能帮我吗?

PM_Dialog
离线
最后看到:1周8小时前
工作人员
加入:2018-02-08 11:03
嗨DDDDragon

嗨DDDDragon

您的代码在WAIT_FOR_RECEIVED_BYTE中堆积的原因是,为什么I2C_RXFLR_REG寄存器没有从I2C接口接收数据。因此,您应该检查从属设备是否响应。此外,您可以探测信号,以检查这种情况发生的频率,如果您不希望在while(GetWord16(I2C_RXFLR_REG) == 0)中获得堆栈,您应该使用我们的类似实现,但使用超时。

谢谢,PM_Dialog

DDDDragon
离线
最后看到:2年9个月前
加入:2017-08-11 05:55
嗨,PM_Dialog,

嗨,PM_Dialog,
我有两个来自装置。根据我的测试,当您从设备获取数据时没有问题,但一旦我同时从设备读取两个数据,程序将保持WAIT_FOR_RECEIVED_BYTE大约一个小时。你能给我举个例子吗?

PM_Dialog
离线
最后看到:1周8小时前
工作人员
加入:2018-02-08 11:03
嗨DDDDragon,

嗨DDDDragon,

你能解释一下“two from the device”,同时读取两个数据是什么意思吗?对于WAIT_FOR_RECEIVE_BYTE(),宏检查I2C_RXFLR_REG寄存器,该寄存器对接收到的数据进行计数,如果您停留在那里,这意味着另一端还没有向您发送任何东西。设备进入等待状态,等待另一方发送它应该发送的数据,这样计数器就会增加,580就可以进入I2C FIFO获取实际数据。你是否尝试使用分析仪来检查你是否收到数据?如果您接收数据,I2C_RXFLR_REG的值应该是非零的。请核对一下好吗?一个简单的超时示例是使用for循环而不是while循环,这样您的代码将在进行一定数量的I2C_RXFLR_REG检查后继续运行。

谢谢,PM_Dialog