单片机/MCU论坛
直播中

钱一辰

7年用户 953经验值
私信 关注

TC275操作I2C读操作时陷入while循环无法退出怎么解决?

TC275作为主芯片,通过I2C读取EEPROM芯片数据,在调用iLLD库的IfxI2c_I2c_read函数时,偶发程序卡在以下while循环中无法退出。

发现是PIRQSS寄存器的RX位一直保持为1,无法退出循环。然后修改了此段代码,增加了超时退出while循环的操作,修改后发现退出while循环后,进入了下面的ERRIRQSS分支,RXF_OFL位被置为1。并且在下一次操作I2C,把数据写入TXD寄存器时,触发了SPB总线故障。
触发SPB总线故障的原因应该是手册里写的,FIFO还处于接收状态时写入TXD寄存器。

最终排查发现,由于在操作I2C时已经使能了CPU中断,当I2C以下红框内的操作被中断函数打断超过一个字节数据时间时,就会引起while循环无法退出、触发RXF_OFL置位、FIFO处于接收状态无法退出等问题。

很显然这应该是iLLD的代码问题。目前我能做的临时解决方案就是在进行这段操作前临时关闭中断,完成操作后再恢复中断,以保证底层操作的时序正确。




                                                                                                                                                                                                                                                                                                                                                                                                

回帖(1)

木頭瓶子

2024-2-2 17:20:34
根据描述,问题可能出现在以下几个方面:

1. I2C读操作超时问题:为了解决陷入while循环无法退出的问题,你修改了代码增加了超时退出while循环的操作。然而,退出循环后进入ERRIRQSS分支并且触发了SPB总线故障。这可能是因为超时机制触发后没有正确处理错误,导致后续操作出现问题。建议检查超时退出的逻辑,确保在超时情况下正确处理错误并恢复I2C的正常操作。

2. PIRQSS寄存器的RX位持续保持为1:在你的描述中提到PIRQSS寄存器的RX位一直为1,这可能是导致循环无法退出的原因。你可以先检查是否正确设置了中断使能位,并且在正确的时机清除中断标志位。另外,还可以尝试使用其他的方式检测I2C的接收完成状态,例如使用数据位的状态或者通过发送停止条件来确认接收完成。

3. SPB总线故障:触发SPB总线故障可能是由于在FIFO还处于接收状态时写入了TXD寄存器。为了避免这种情况,你可以在操作I2C的时候考虑一下以下几个方面:
   - 在写入TXD寄存器之前,先检查FIFO的状态,确保FIFO为空或者不处于接收状态。
   - 确保在写入TXD寄存器之后,FIFO正确地被配置为发送状态,并且使能发送请求。

4. CPU中断的使能问题:你提到在操作I2C时已经使能了CPU中断,并且在红框内的操作中可能存在问题。在确保中断处理函数正确配置和实现的情况下,建议检查中断处理函数内的代码是否正确处理了中断触发的情况,并及时清除中断标志位。

综上所述,建议检查超时退出逻辑、中断配置、中断处理函数以及FIFO状态的设置和操作,以解决陷入while循环无法退出的问题,并避免出现SPB总线故障。另外,如果问题仍然存在,可以进一步检查其他可能的原因,例如时序问题或硬件问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分