完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
5个回答
|
|
现在觉得问题还是出在中断处理函数里.
以下为串口打印出来的数据.上电后,前两秒数据是正确的.然后就出错了.好像接受了第一帧的数据后,判断为帧首,然后可能由于某种原因该帧的余下部分没有接收,然后接收到下一帧信息,由于接收数组的第一个位置已被放置数据,那么就从第二个位置开始放置接收到的数据.这样帧首就重复接收了两次,帧尾没被放到接收数组里. 不过按说接收超过5个数据后,会将spi2Num清零的,重新从接收数组的第一个数据开始存放数据.但问题是,以后每次出现的都是重复两个帧首... 这就不理解了. 1s定时到。 spi2recvBuff[0]: 3a05 spi2recvBuff[1]: 10a spi2recvBuff[2]: 100 spi2recvBuff[3]: 0 spi2recvBuff[4]: 9d76 spi2Recive[4]: 9d76 crc: 9d76 CRC校验Ok. spi2SendBuff[0]: 3a05 spi2SendBuff[1]: 10a spi2SendBuff[2]: 100 spi2SendBuff[3]: 5556 spi2SendBuff[4]: 289 发送结束 ****************************************************** 1s定时到。 spi2recvBuff[0]: 3a05 spi2recvBuff[1]: 10a spi2recvBuff[2]: 100 spi2recvBuff[3]: 0 spi2recvBuff[4]: 9d76 spi2Recive[4]: 9d76 crc: 9d76 CRC校验Ok. spi2SendBuff[0]: 3a05 spi2SendBuff[1]: 10a spi2SendBuff[2]: 100 spi2SendBuff[3]: 5557 spi2SendBuff[4]: 9288 发送结束 ****************************************************** 1s定时到。 spi2recvBuff[0]: 3a05 spi2recvBuff[1]: 3a05 spi2recvBuff[2]: 10a spi2recvBuff[3]: 100 spi2recvBuff[4]: 0 spi2Recive[4]: 0 crc: bf51 CRC校验失败. ****************************************************** 1s定时到。 spi2recvBuff[0]: 3a05 spi2recvBuff[1]: 3a05 spi2recvBuff[2]: 10a spi2recvBuff[3]: 100 spi2recvBuff[4]: 0 spi2Recive[4]: 0 crc: bf51 CRC校验失败. |
|
|
|
重复回复了,编辑掉。
|
|
|
|
改成下面这样就没事了。主要是进入SPI中断后,SPI发送数据尽量靠前一点。也不知道为什么会这样。
在接收完帧首以后的中断处理里,就是else语句,需要将SPI发送语句放在紧靠else语句的位置。 这样的话,原来想只用spi2RecvNum这个变量控制接收和发送的数据位,现在不那么好实现了,于是又加了个变量spi2SendNum。 [mw_shl_code=c,true]void SPI2_IRQHandler(void) { static u8 n; static u16 spi2Temp; spi2Temp = SPI_I2S_ReceiveData(SPI2); if(spi2RecvOk == 0) { if(spi2RecvNum == 0) { if((spi2Temp & 0xff00)== 0x3a00) { SPI_I2S_SendData(SPI2, spi2SendBuff[1]); spi2RecvBuff[0] = spi2Temp; spi2RecvNum = 1; spi2SendNum = 2; } } else { SPI_I2S_SendData(SPI2, spi2SendBuff[spi2SendNum]); spi2RecvBuff[spi2RecvNum] = spi2Temp; spi2RecvNum++; if(spi2RecvNum > 4) spi2RecvOk = 1; spi2SendNum += 1; spi2SendNum %= 5; } } }[/mw_shl_code] |
|
|
|
楼主找到答案了吗
|
|
|
|
楼主还是仿真一下看看spi2Num的值,我怀疑是这里出的问题,定义到全局试试。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1967 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1823 浏览 3 评论
4403 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1970 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2477 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 00:01 , Processed in 0.853891 second(s), Total 52, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号