完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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个回答
|
|
根据描述,问题可能出现在以下几个方面:
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总线故障。另外,如果问题仍然存在,可以进一步检查其他可能的原因,例如时序问题或硬件问题。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
460 浏览 0 评论
【敏矽微ME32G070开发板免费体验】+ADC测试与LED点亮
418 浏览 0 评论
飞凌嵌入式-ELFBOARD ELF 2的硬件知识分享--核心板
352 浏览 0 评论
【敏矽微ME32G070开发板免费体验】\\+Lora通信终端产品开发项目
514 浏览 0 评论
1576 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11969 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 09:52 , Processed in 0.530523 second(s), Total 76, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号