duo点 发表于 2025-2-22 10:00

[求助]M451的I2C通信问题

使用芯片:M452LG6AE
环境:通过I2C去读取电池管理芯片OZ9313,OZ9313支持SMBus。上拉电阻原为4.7K,因clock波形不好(tr时间长),后面改到1.2K。
故障现象:
M452芯片启动后能够正常通信获取电池信息,但是过一段时间(几小时)后就读取不到芯片上的信息,调试代码发现I2C读取超时,示波器抓取波形为SDA一直为高电平,SCL一直有正常的clock波形(波形还挺好~),


更改代码尝试在通信失败后调用I2C_STOP(I2C0)(代码如下),会卡死在while循环中,
static __INLINE void I2C_STOP(I2C_T *i2c)
{


    (i2c)->CTL |= (I2C_CTL_SI_Msk | I2C_CTL_STO_Msk);
    while(i2c->CTL & I2C_CTL_STO_Msk);
}

更改代码在通信失败后定时重新初始化I2C中断,结果还是读取超时,获取不到信息。

yhu1983 发表于 2025-7-11 15:17

I2C通讯,每一个步骤后都会产生一个状态。

你可以看一下接收函数里,最后一次产生的状态是什么?
是不是发生了没有处理的状态。

classroom 发表于 2025-7-30 16:28

上拉电阻过小。

flycamelaaa 发表于 2025-7-30 17:29

SDA 持续高电平,可能是从机未正确释放 SDA 线,或主机未正确发送 STOP 条件,导致总线仲裁失败。

stormwind123 发表于 2025-7-30 17:31

若总线高频噪声严重,可尝试在总线末端并联 100pF 电容。

flycamelaaa 发表于 2025-7-30 18:29

while(i2c->CTL & I2C_CTL_STO_Msk) 循环等待 STOP 完成,但若从机未响应,STO 标志可能***无法清除。

powerantone 发表于 2025-7-30 19:30

调整上拉电阻,恢复 4.7kΩ或尝试 2.2kΩ。

暖心小太阳 发表于 2025-7-31 12:32

看起来像是I2C总线上出现了问题,SDA线一直高电平可能意味着总线被某个设备锁定了。你可以尝试检查是否有设备在I2C总线上产生了冲突,或者是否有设备在不应该的时候拉高了SDA线。
页: [1]
查看完整版本: [求助]M451的I2C通信问题