发 帖  
原厂入驻New
[问答] 使用MCC PIC24F进行I2C故障恢复
123 I2C 传感器
分享
你好!我有APIC24FV16KM204 I2C主控器,它通过通过滑环的导线与I2C从机通信。I2C是一个激光雷达传感器,它安装在头上,在轴上旋转。如果我把头运行在200RPM以下,这个系统会工作一段时间。如果我走得更快,I2C线中的尖峰会导致I2C通信失败。如果我硬重置PIC24,一切又恢复正常。我知道让i2c通过嘈杂的滑环是不好的选择,但我想看看我是否能从偶尔发生的类似事件中恢复。我正在使用MCC自动生成的I2C函数。这里是故障事件的一个镜头:[参见附带的1-DS1Z_QuickPrint3.png]我认为正在发生的事情是设备在电磁脉冲尖峰之后保持SDA信号低。[参见附带的2-DS1Z_QuickPrint7.png]上面是放大后的一个镜头。我在代码中检测到这个故障,然后对从设备进行电源循环(我可以访问重置线,并且白色光标线处的SDA线在从重置之后变高)并运行MSSP2_Init()。这并不能修复通信,而且在SCL和SDA上我从来没有看到任何东西被切换。UEIF(MSSP2I2CYObjut.TrStUST.S.Purn!这个检查失败,队列永远不会空。因此,在检测到这一点之后,I幂循环从属设备,并运行MSSPIGIN()并尝试进行通信。电源周期使SDA线路的从机放行,这很好,但是没有进一步的通信发生。当我查看调试器时,我发现消息总是挂起的。当我在PIC上按下重置按钮时,一切都正常。关于如何让系统从此恢复有什么想法吗?谢谢!我也希望通过拥有一个将I2C数据中继到CAN的芯片来重新设计这一切,所以可以通过滑环而不是I2C来运行。
0
2020-4-21 09:31:50   评论 分享淘帖 邀请回答

相关问题

6个回答
谢谢你的提示!好的,所以我试着实现你的解决方案,但是我遇到了一个问题。在禁用I2C外围设备之后,我似乎无法控制SCL和SDA引脚。以下是我到目前为止拥有的。我有一个函数,每当出现I2C错误时就会调用它。在这个函数中,我执行以下操作:禁用SSPEN,设置SDA的TRIS位,SCL pinstry切换槽LAT无论什么原因,这些行在SPEN禁用后都不会被切换。这是我的代码:不管什么原因,引脚都没有切换!见附件范围拍摄。紫色通道是调试PIN输出,以确保调用该函数。我不认为这是硬件问题,因为我做了一个空项目,在那里,我只用相同的硬件切换SDA和SCL管脚,它们切换得很好。在禁用SSPEN之后,我还需要做其他事情来控制SDL SCL管脚吗?谢谢您!!
2020-4-21 09:57:49 评论

举报

好的,试着把SSP2CON1寄存器和其他与电源相关的值,通常是0x000…
2020-4-21 10:15:39 评论

举报

SSP2CON1&=0xFFEF;//.SSPEN为什么,SSP2CON1只禁用启用位。设置SDA的TRIS位,设置SCL引脚为InputsSet Lat for SDA,设置SCL引脚为0try切换通过TRIS
2020-4-21 10:22:00 评论

举报

你们是最好的女孩!Mysil,当我可以使用它们定义的名称时,我再也不会用这样的位标志来设置位。好的,所以我的恢复例程成功地修复了I2C总线,并将其恢复到空闲状态。见附件。这是新问题。在检测到错误后,我试着修复它,并运行MSSP2_Initialize(),然后重置从设备,运行在中断上的MSSP2引擎似乎被破坏。在调试模式下运行时,我意识到,在恢复函数运行之后,执行实际位推送的中断函数永远不会被调用。是否有需要清除的中断标志?这里是I2C的自动生成的MCC中断块。附加的是一个示波器轨迹,显示在故障之后没有I2C COMs尝试。
2020-4-21 10:48:21 评论

举报

你真是太棒了,谢谢你的帮助。Mysil,听从你的劝告,我能把它修好!我现在有一个I2C总线,它可以容忍我拔线,它恢复在10ms以下!当我试图搔痒中断标志以获得I2C ISR的时候,我一直在捕获陷阱地址错误。这是因为MSSP I2C状态机使用了很多MCC生成的指针,我必须正确地重置每个指针。此外,正如您在Mysil中所暗示的,何时启用I2C外围设备的时机至关重要。最后,我只能修改MSSP2_Initialize()函数,并添加了一些重置,实际正确地重置了系统。下面是新的MSSP2IILIALIZE()函数,非常感谢大家!!!!!!!
2020-4-21 11:04:52 评论

举报

*update:在意识到语法是多么混乱之后,我编辑了我的帖子。感谢大家的帮助,我在桌子上捶了一会儿头,不明白为什么清除SCL行不能解决问题。最后,我自己的修复是:1)禁用I2CEN2)切换SCL直到SDA变为High3)从初始化函数中清除总线的状态,如@paulnotpaul.BTW所示,我不需要清除中断标志,因为来自MCC的初始化函数通过以下方式清除中断标志违约。此外,我不需要禁用中断。但是,在调用I2C初始化()函数之前,我必须设置I2C使能位为0。然后,i2c Intialize()函数默认将i2c启用位设置为1。SCL线上的输出锁存器没有遵守控制,直到我禁用模块,当然SCL tris位输出。在恢复完成之后,您需要重置ddr设置.4)Call Initialize()函数,该函数具有上面从@paulnotpaul添加的值。清除缓冲区并重置状态是我成功的关键。在进一步查看了MCC提供的代码之后,我注意到它保持无限循环,因为它会将缓冲区标记为满,但是在重新同步时钟之后不会发送任何东西。这种行为的发生可能是因为它在等待从设备的确认。如果有人能想出一种方法来找到不需要修改i2c驱动程序API的另一个解决方案,我将非常感激。在我的当前项目中,我的目标是禁止对自动生成的MCC API驱动程序(在MCC应用程序之外)进行更改,以使程序代码更加可重用和稳定。
2020-4-21 11:18:18 评论

举报

只有小组成员才能发言,加入小组>>

113个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表