ch582硬件I2C卡死要怎么解决?

代码通过TMOS任务,每隔500ms读一次从机I2C数据。现在测试结果就是,跑了几分钟或者十几分钟后就会卡死在I2C,数据线拉低。

1708342357115884.png

1708342357178864.png


您好,卡死时可以调用以下接口复位一下硬件IIC模块。

I2C_SoftwareResetCmd(ENABLE);

I2C_SoftwareResetCmd(DISABLE);

排查①外围电路是否有5~10K的上拉电阻上拉到V33

②出故障时打印一下IIC状态寄存器R16_I2C_STAR1和R16_I2C_STAR2,查看哪些标志位异常

③可以尝试提高IIC的中断优先级,接口函数:PFIC_SetPriority

image.png


上拉电阻是10K,中断也只有I2C中断开着。

目前发现,只要一出现I2C卡死,电流会莫名的高5mA。我现在是一个任务里多次读I2C,这个是否会有影响呢?

R16_I2C_STAR2状态如图

1708409048116108.png

1708409048111043.png



把编译器中的代码优化改成无优化貌似就不会死掉了,现在挂着让它跑了三小时都还正常,取而代之的是内存暴涨= =。优化程度怎么还会影响这个的?


挂了一晚上,无优化也还是会死,不过无优化可以运行3,4个小时才会死,全优化最多半小时。

而且无优化死的时候是报的错是总线忙,没有数据线拉低的动作。

    while(wait && (i2c_state == I2C_MTX)) {

        continue;

    }

会一直卡在这个地方。

这个问题有点神奇,导致我想优化都无从下手= =


您发送联系方式到邮箱zhaiyw@wch.cn,交流更多信息以协助您排查。


只有登录才能回复,可以选择微信账号登录