1)开发包全称:PHY6222_TuyaOS-3.10.0
2)问题现象:用这个开发包编写一个iic主机程序去读取PHY6222原厂提供的iic从机程序,过一段时间(有时候过很久,有时候很快)会打印I2C RD TO。都是用的硬件iic,并且用逻辑分析仪和示波器测波形也会马上打印I2C RD TO。
3)复现流程:P34 -> SDA P33 -> SCL 。主机每一秒读取一次,从机使用的是原厂的release_bbb_sdk-PHY62XX_SDK_3.1.5 的sbcMultiCon工程,硬件iic,一直读取,有时候会出现,有时候不会,属于概率性问题。
4)发生时间:2025.5.14
【求助】【TuyaOS OS】硬件iic读取数据异常失败
【求助】【TuyaOS OS】硬件iic读取数据异常失败
Re: 【求助】【TuyaOS OS】硬件iic读取数据异常失败
建议参考 PHY6222_TuyaOS-3.10.0 里面默认提供的 IIC 驱动 OLED 例程,例程里面包含有调用到 IIC 读取的逻辑,具体如下:
find_oled → tal_i2c_master_receive → tkl_i2c_master_receive → hal_i2c_read → _hal_i2c_read_s
涉及硬件如下:
IIC 功能 引脚
IIC0 SCL P24
IIC0 SDA P23
Re: 【求助】【TuyaOS OS】硬件iic读取数据异常失败
还是不行,间隔一秒一直读取从机数据,一段时间之后 ,SCL拉低 SDA被拉高,iic总线被锁死了
这是我用逻辑分析仪抓的波形,
Re: 【求助】【TuyaOS OS】硬件iic读取数据异常失败
这是正常的波形
Re: 【求助】【TuyaOS OS】硬件iic读取数据异常失败
您好,我基于PHY6222_TuyaOS-3.11.0版本SDK(当前最新发布版本),按照您描述的逻辑,仅修改如下接口做测试:
Code: Select all
STATIC OPERATE_RET find_oled(VOID_T)
{
OPERATE_RET ret = OPRT_OK;
UINT8_T sample_data[2];
for (UINT16_T address = 1; address <= 1000; address++) {
tal_watchdog_refresh();
tal_system_delay(100);
ret = tal_i2c_master_receive(sg_i2c_num, SLAVE_ADDRE, sample_data, 2);
TAL_PR_INFO("Find oled ret: %d", ret);
// if (ret == OPRT_OK && (address == SLAVE_ADDRE)) {
// TAL_PR_INFO("Find oled");
// return OPRT_OK;
// }
}
TAL_PR_INFO("Not find oled");
return OPRT_COM_ERROR;
}
并不会发生异常,测试的时候外部接OLED,引脚如前所述。
测试结果如下(100ms读取一次,比您描述的速度快10倍,共读取1000次):
Re: 【求助】【TuyaOS OS】硬件iic读取数据异常失败
下面是基于PHY6222_TuyaOS-3.10.0版本SDK(跟您一样的)使用同样的方法做的测试,结果也是正常的,设备log如下:
供对比参考。
Re: 【求助】【TuyaOS OS】硬件iic读取数据异常失败
另外,需要提醒的是,如果您外接的设备本身不会回复IIC的读取,是会出现“I2C RD TO”的提示的(不过这只是提醒您需要外接OLED或其他设备),例如我还是使用刚才的例程,但是把外接的OLED断开后,log如下: