请问HAL库如何设置SPI2一直使能接收中断?

2019-07-14 18:26发布


利用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,有对应波形,串口也有数据发过来。

是不是调用中断接收函数,还需要做些其他操作?

主函数部分:
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
谦谦三君子
1楼-- · 2019-07-15 19:14
在HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)函数里,使中断接收函数指向static void SPI_RxISR(SPI_HandleTypeDef *hspi)函数,并且打开SPI,打开SPI中断,然后该函数结束。

SPI接收中断后,调用static void SPI_RxISR(SPI_HandleTypeDef *hspi)函数。在该函数里,接收够指定字节的数据后,调用SPI_RxCloseIRQHandler(hspi)函数。在该函数里,关闭SPI接收中断,调用接收完成回掉函数。接收回调函数处理完成后,依次结束以上两个函数及中断函数。

回调函数虽然在关闭中断后,但依然在中断函数里内部。
谦谦三君子
2楼-- · 2019-07-15 20:14
现在是将HAL_SPI_Receive_IT(&hspi2, (uint8_t *)&spi2RecvBuff[0],1)放在void SPI2_IRQHandler(void)内。
发现其实进中断2次才调用一次回调函数。

spi2RecvNum: 0
spi2RecvBuff[2]: 3a0c
1ms时间到

spi2 recive over.
spi2RecvNum: 3
spi2RecvBuff[3]: 3a0c
spi2RecvBuff[4]: 3a0c
1ms时间到

spi2 recive over.
spi2RecvNum: 5
spi2RecvBuff[5]: 3a0c
spi2RecvBuff[6]: 3a0c
1ms时间到

spi2 recive over.
spi2RecvNum: 7
spi2RecvBuff[7]: 3a0c
spi2RecvBuff[8]: 3a0c
1ms时间到

spi2 recive over.
spi2RecvNum: 9
spi2RecvBuff[9]: 3a0c
spi2RecvBuff[10]: 3a0c
易元空灭
3楼-- · 2019-07-16 01:33
 精彩回答 2  元偷偷看……
jerry181855
4楼-- · 2019-07-16 04:26
帮顶
谦谦三君子
5楼-- · 2019-07-16 04:31
易元空灭 发表于 2018-8-23 12:13
楼主,你自己顶了那么多。我也没时间看那么多。你调用的接收函数原型是HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)。这个跟标准库不一样的是,你调用这个函数,就会一直等待接收完Size个字节。你调用这个函数之后,再去while轮询访问接收寄存器当然读不到数据了。 ...

没有在while(1)里轮询访问接收寄存器,而是在接收完成回调函数里,想再次调用这个函数,结果却不行。现在是放到void SPI2_IRQHandler(void)里了,暂时能用了。但想不明白为什么放到回调函数里却不行,从串口发上来的数看,应该是中断了2次才调用了一次回调函数。可能我设置还是有问题。
wenxueshu
6楼-- · 2019-07-16 08:27
放到SPI2_IRQHandler

一周热门 更多>