根据描述,问题可能出现在以下几个方面:
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总线故障。另外,如果问题仍然存在,可以进一步检查其他可能的原因,例如时序问题或硬件问题。
根据描述,问题可能出现在以下几个方面:
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总线故障。另外,如果问题仍然存在,可以进一步检查其他可能的原因,例如时序问题或硬件问题。
举报