完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在为一对基于PIC32MX795F512L的自定义板开发固件。这些板通过UART1/Serial0上的全双工RS485接口以250kbps的速度连接在一起。固件是在MPIDE中开发的,我使用HardwareSerial库中的.Inter.()函数将ISR链接到UART RX中断(这基本上通过跳出它的ISR到您的函数来替换HardwareSerial循环接收缓冲函数)。HardwareSerial库没有明确地设置URXISEL中断模式,但我假设它默认为0x00(RX FIFO上的中断不是空的)。串行链路上的消息总是2个固定长度(21或37字节)之一,消息的最后一个字节是CRC8。接收器用来验证消息的校验和。串行RX ISR是一个非常简单的状态机——有10个64字节的消息缓冲区,它们都初始化为0x00,并在使用后重置为0x00。消息的第一个字节是长度(n),因此它保存在一个静态变量中,并且当调用ISR时,n个字节逐个字节地复制到当前消息缓冲区中。当接收到最后一个字节(即CRC8校验和)时,将长度写入缓冲区的第一个字节,以告诉应用程序缓冲区已经准备好,并且索引被递增以指向链中的下一个缓冲区以获得下一条消息。然后,应用程序计算校验和,并进一步处理消息,如果它是有效的。如下所示:固件运行良好,我正在进行测试,通过串行链接来回发送数百万条消息。但是,很少(48小时运行一次或两次,包含1000多万条消息)我在接收方收到校验和失败。固件中的诊断将打印出消息,计算出校验和应该是什么,接收到什么。我注意到在错误的消息中有一个字节插入到消息的某个地方,它也不是一个随机字节——它是以前收到的8个字节的重复。这里有几个例子:它总是一个插入的字节(后面的内容看起来是有效的,但是被替换了1个字节)和之前8个字节的重复,这让我觉得它正在读取上一次使用FIFO的单元格时的旧数据。这也需要触发UART RX中断,即使实际上没有收到任何字节。就好像UART接收中断被快速连续触发了两次,我的程序在被重写之前正在从FIFO单元读取旧数据。我已经检查了设备的错误表,它没有提到UART模块接收中断的任何具体问题。E.有人以前见过这样的事情,或者对可能发生的事情有进一步的了解吗?
|
|
相关推荐
2个回答
|
|
我敢肯定这是你的密码。会有一些我没有点缀在某处。首先,如果有一个串行错误,它将按照你写的方式继续。在MX上,你必须检查标志。另外,学习永远不要使用XBIT扩展。它们不是中断安全的。使用XSET和XCLR与位字段。
|
|
|
|
CPU运行的速度是多少?如何执行缓冲区数据的检查?几年前,我在速度为70MIPS的PIC24H CPU上发现了一个错误。当CPU从UART缓冲器读取一个字节,然后立即检查缓冲器空虚时,它可能会失败。缓冲区可能实际上是空的,但是状态标志更改太晚了。CPU认为它不是空的(错误地)并再次读取缓冲区。在我的情况下,它是额外的零Irc。但是PIC32是不同的。无论如何,代码中可能有一个错误,例如非原子访问。
|
|
|
|
只有小组成员才能发言,加入小组>>
5237 浏览 9 评论
2026 浏览 8 评论
1950 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3201 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2253 浏览 5 评论
771浏览 1评论
659浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
589浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
671浏览 0评论
571浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 03:32 , Processed in 1.762710 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号