衔胆栖冰 发表于 2016-11-25 17:14:32

any012 发表于 2016-11-25 16:58
接收是固定长度,且有帧头的;发送同样是固定长度且有帧头,并且,还需要接收帧头时,发送的也是发送帧的帧 ...

我推测你的逻辑是这样的:收到第一个字节判断是否是包头,是的话继续读取一定长度的数据作为数据包的长度,然后接收一定长度的数据,最后还有检验位和结束位。这样的话,你觉得DMA不好处理:D

any012 发表于 2016-11-26 08:38:54

逻辑是这样的,但接收了一帧的同时,也要发送一帧出去。所以我觉得需要在接收的时候做处理,而不是接收完一堆数据后再处理。所以我觉得用DMA方式的话,无从下手。

海迹天涯 发表于 2016-12-30 09:19:26

楼主要养成追踪代码的习惯啊,在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次了。好了这下你也应该知道怎么改了吧

modu8888 发表于 2016-12-30 09:45:12

我也遇到过一个片子!
也许那个片子压根没SPI2啊!

any012 发表于 2016-12-30 10:19:09

海迹天涯 发表于 2016-12-30 09:19
楼主要养成追踪代码的习惯啊,在HAL_SPI_Receive_IT函数中调用了__HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | ...

后来改成类似于库函数那样的操作了。

在串口接收的时候也遇到了类似的问题,不确定原因是否一样。当时想串口中断接收1个数据,然后在接收完成回调函数里再次打开中断接收。实际调试的时候,只能接收到第一个数据,然后就溢出错误了。原因应该是数据间隔太短,用HAL中断方式来不及处理这个字节下个字节就来到了,从而造成数据溢出。
现在回头想想,SPI这里可能也是由于这个问题。
串口那里,最后用的DMA+空闲中断解决了,参考论坛里的例子。

海迹天涯 发表于 2016-12-30 10:31:46

any012 发表于 2016-12-30 10:19
后来改成类似于库函数那样的操作了。

在串口接收的时候也遇到了类似的问题,不确定原因是否一样。当时想 ...

对,串口也是这样处理的,不过你说的溢出错误我没遇到过,最大使用过115200没出错,虽然HAL库的效率确实低了点,但是对于强大m3核的处理器来说这点延迟不影响的

hpdell 发表于 2016-12-30 10:33:43

any012 发表于 2016-12-30 10:19
后来改成类似于库函数那样的操作了。

在串口接收的时候也遇到了类似的问题,不确定原因是否一样。当时想 ...

SPI 貌似没有空闲中断啊 ??

any012 发表于 2016-12-30 13:39:17

hpdell 发表于 2016-12-30 10:33
SPI 貌似没有空闲中断啊 ??

额,我说的是串口。

韩教授 发表于 2017-7-24 10:35:05

楼主你好,请问你最后怎么解决的?您的帖子我看了好几遍,还是没明白怎么解决的!太郁闷了,一直头疼这个问题!:'(

any012 发表于 2017-7-24 14:07:11

本帖最后由 any012 于 2017-7-24 14:12 编辑

韩教授 发表于 2017-7-24 10:35
楼主你好,请问你最后怎么解决的?您的帖子我看了好几遍,还是没明白怎么解决的!太郁闷了,一直头疼这个问 ...
用HAL库的话,用中断方式接收的话,在中断函数里做太多的判断或其它操作,有可能还没处理完下个数据就来了,结果造成接收数据溢出错误,从而无法继续下去。
当时我改成类似于标准库那样的操作了,就是用那些带__前缀的宏和函数去实现的,挺麻烦的,不过总算能即使处理完数据。
现在想想,可以在错误处理回掉函数里做错误处理,重启SPI接收也许能解决这个问题。

后来我又重做了一般这个程序,改用DMA方式接收。由于我这个板子有个特点,相当于有个类似于片选的信号过来,我就在片选信号有效的那个沿,调用DMA接收函数,接收固定长度。接收完成回调函数里再对数据进行判断处理。
不过也有问题,又干扰时数据错位后就会一直错位。我试着在片选信号无效的那个沿,重新初始化SPI。有一点效果,但偶尔还是出错。
页: 1 2 [3] 4
查看完整版本: HAL库如何设置SPI2一直使能接收中断?