请问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 02:48
又仔细观察了下串口发送上来的数据,接收回调函数,只执行了一次。没有再循环调用接收中断函数。
谦谦三君子
2楼-- · 2019-07-15 08:21
现在怀疑是没有满足spi2中断接收完成的条件,没有调用回调函数。
谦谦三君子
3楼-- · 2019-07-15 08:30
放到SPI2_IRQHandler(void)函数里,就可以正常再次调用了。
void SPI2_IRQHandler(void)
{
  /* USER CODE BEGIN SPI2_IRQn 0 */

  /* USER CODE END SPI2_IRQn 0 */
  HAL_SPI_IRQHandler(&hspi2);
        HAL_SPI_Receive_IT(&hspi2, (uint8_t *)&spi2RecvBuff[0],1);
  /* USER CODE BEGIN SPI2_IRQn 1 */

  /* USER CODE END SPI2_IRQn 1 */
}
谦谦三君子
4楼-- · 2019-07-15 13:01
 精彩回答 2  元偷偷看……
谦谦三君子
5楼-- · 2019-07-15 17:14
本帖最后由 any012 于 2016-11-24 14:48 编辑

HAL_SPI_Receive_IT(&hspi2, (uint8_t *)&spi2RecvBuff[0],1)放在回调函数里:

SPI_Receive_IT function is called.
SPI interrupt enable.
SPI enable.
1ms时间到

SPI_RxCloseIRQHandler function is called.
SPI RX interrupt disable.
SPI ERR interrupt disable.
SPI rx callback.
spi2 recive over.
SPI_Receive_IT function is called.
SPI interrupt enable.
1ms时间到

1ms时间到

1ms时间到

----------------------------------------

HAL_SPI_Receive_IT(&hspi2, (uint8_t *)&spi2RecvBuff[0],1)放在中断函数里:

SPI_RxCloseIRQHandler function is called.
SPI RX interrupt disable.
SPI ERR interrupt disable.
SPI rx callback.
spi2 recive over.
SPI_Receive_IT function is called.
SPI interrupt enable.
SPI_Receive_IT function is called.
SPI interrupt enable.
1ms时间到

SPI_RxCloseIRQHandler function is called.
SPI RX interrupt disable.
SPI ERR interrupt disable.
SPI rx callback.
spi2 recive over.
SPI_Receive_IT function is called.
SPI interrupt enable.
SPI_Receive_IT function is called.
SPI interrupt enable.
1ms时间到

SPI_RxCloseIRQHandler function is called.
SPI RX interrupt disable.
SPI ERR interrupt disable.
SPI rx callback.
spi2 recive over.
SPI_Receive_IT function is called.
SPI interrupt enable.
SPI_Receive_IT function is called.
SPI interrupt enable.
1ms时间到
谦谦三君子
6楼-- · 2019-07-15 18:04
刚才在某些地方加了些printf语句,结果能正常中断接收了。
然后又去掉了调试过程中用到的printf语句,又不行了...

一周热门 更多>