完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
利用STM32的SPI2作为从设备,想中断接收数据,一直没调通。 现在使这样的,再主函数while(1)循环前,调用一次 HAL_SPI_Receive_IT(&hspi2, (uint8_t *)&spi2RecvBuff[0],2); 主循环里,现在基本清空了。SPI的接收回调函数里,通过串口发送一组数据,然后再调用 HAL_SPI_Receive_IT(&hspi2, (uint8_t *)&spi2RecvBuff[0],2); 想通过这种方法,使SPI2一直处于中断接收使能状态。 结果串口一直没有数据发送过来。用示波器测量SCK和MOSI,是有波形的,和主设备发过来的数据一致。 然后将以上的接收中断函数改成,发送中断函数,使设备不停的发送。 结果测量SCK和MISO,有对应波形,串口也有数据发过来。 是不是调用中断接收函数,还需要做些其他操作? 主函数部分: |
|
相关推荐
34个回答
|
|
|
我推测你的逻辑是这样的:收到第一个字节判断是否是包头,是的话继续读取一定长度的数据作为数据包的长度,然后接收一定长度的数据,最后还有检验位和结束位。这样的话,你觉得DMA不好处理 |
|
|
|
|
|
逻辑是这样的,但接收了一帧的同时,也要发送一帧出去。所以我觉得需要在接收的时候做处理,而不是接收完一堆数据后再处理。所以我觉得用DMA方式的话,无从下手。
|
|
|
|
|
|
楼主要养成追踪代码的习惯啊,在HAL_SPI_Receive_IT函数中调用了__HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR))开中断 -> hspi->RxISR = SPI_RxISR_8BIT; 连接接收指针函数 -> 追踪这个指针函数发现在接收完成后调用了 SPI_CloseRx_ISR(hspi); -> 再追踪 SPI_CloseRx_ISR(hspi);函数,发现这个函数 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));此时此刻我相信你已经明白为啥每次只能中断1次了。好了这下你也应该知道怎么改了吧
|
|
|
|
|
|
|
|
|
|
|
5616asaqwq 发表于 2018-8-23 14:57 后来改成类似于库函数那样的操作了。 在串口接收的时候也遇到了类似的问题,不确定原因是否一样。当时想串口中断接收1个数据,然后在接收完成回调函数里再次打开中断接收。实际调试的时候,只能接收到第一个数据,然后就溢出错误了。原因应该是数据间隔太短,用HAL中断方式来不及处理这个字节下个字节就来到了,从而造成数据溢出。 现在回头想想,SPI这里可能也是由于这个问题。 串口那里,最后用的DMA+空闲中断解决了,参考论坛里的例子。 |
|
|
|
|
谦谦三君子 发表于 2018-8-23 15:36 对,串口也是这样处理的,不过你说的溢出错误我没遇到过,最大使用过115200没出错,虽然HAL库的效率确实低了点,但是对于强大m3核的处理器来说这点延迟不影响的 |
|
|
|
|
谦谦三君子 发表于 2018-8-23 15:36 SPI 貌似没有空闲中断啊 ?? |
|
|
|
|
|
|
|
|
|
|
|
楼主你好,请问你最后怎么解决的?您的帖子我看了好几遍,还是没明白怎么解决的!太郁闷了,一直头疼这个问题!
|
|
|
|
|
|
本帖最后由 any012 于 2017-7-24 14:12 编辑 用HAL库的话,用中断方式接收的话,在中断函数里做太多的判断或其它操作,有可能还没处理完下个数据就来了,结果造成接收数据溢出错误,从而无法继续下去。 当时我改成类似于标准库那样的操作了,就是用那些带__前缀的宏和函数去实现的,挺麻烦的,不过总算能即使处理完数据。 现在想想,可以在错误处理回掉函数里做错误处理,重启SPI接收也许能解决这个问题。 后来我又重做了一般这个程序,改用DMA方式接收。由于我这个板子有个特点,相当于有个类似于片选的信号过来,我就在片选信号有效的那个沿,调用DMA接收函数,接收固定长度。接收完成回调函数里再对数据进行判断处理。 不过也有问题,又干扰时数据错位后就会一直错位。我试着在片选信号无效的那个沿,重新初始化SPI。有一点效果,但偶尔还是出错。 |
|
|
|
|
|
首先非常感谢楼主的精心回复,没想到一年前的帖子楼主也能及时回复,真是什么感谢。我现在不开启接收中断模式,直接HAL_SPI_Receive()读,不过也同样遇到接收数据错位问题。就是在重启主机或从机后,接收数据偶尔会发生右移移位的问题。我怀疑是我的从机Cs信号没起作用,一直是低电平信号。可能是我没有很好理解透彻NSS的作用吧。
|
|
|
|
|
|
今天测试了一下,个人认为 1:从机在接收主机发来数据之前,从机应先与主机开机,从机开机后一段时间,主机在开机,可避免接收数据错位问题。2:接收数据过程中,若有一方关机了,再次再次开机后,会偶尔存在接收数据存在错位现象。这种情况下,应将两方都关机,重复情况1操作,这样就可以避免接收数据错位现象。 具体怎么从根本上解决接收数据错位问题,我还在苦恼中,哎呀。。。。。。。。。。。。
|
|
|
|
|
请叫我杰西卡 发表于 2018-8-23 16:54 谢谢你的总结。 也做过这样的实验,接收数据错误后,在spi错误处理回调函数里,软件复位单片机。但总觉得复位单片机不是太好的办法。能在合适的时候只复位SPI就好了,不过我重新初始化SPI,感觉仍是会出现错位的现象。 |
|
|
|
|
谦谦三君子 发表于 2018-8-23 17:00 在搜问题的时候 看到了好多楼主发的帖子 感觉跟我遇到的问题类似。。请问你现在解决了么 我在while(1)前调用了HAL_SPI_Receive_IT while(1)里为空。。然后在回调函数了再次调用了中断接收。。我用示波器测过片选 SCK 是对的。。但是接收到的信号时钟是0。。请问你知道这是怎么回事么 |
|
|
|
|
|
mark
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
651 浏览 0 评论
712 浏览 0 评论
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
4375 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
3176 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2629 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-10 05:04 , Processed in 1.035273 second(s), Total 69, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
8633