在线时间447 小时
UID3267972
ST金币1822
蝴蝶豆17
注册时间2016-5-3
该用户从未签到
论坛元老
- 最后登录
- 2022-5-20
|
楼主 |
发表于 2017-5-18 09:40:27
|
显示全部楼层
本帖最后由 any012 于 2017-5-18 09:47 编辑
找到问题了。
接收的时候,出现异常时,接收数据溢出,中断处理函数里,判断溢出错误后,就清掉溢出错误标志,然后转到错误处理部分。
错误处理部分里关闭了接收中断,但是在关闭接收中断之前,又有新的数据到来,结果又溢出错误了。
最后的结果就是下次开启接收中断时,直接就溢出错误了。以上,周而复始。
在错误处理部分,关闭接收中断后,再清一次溢出错误标志即可。
或者,开启SPI接收的时候,是否应该先把各标志位清一遍?
- /* SPI Overrun error interrupt occurred -----------------------------------*/
- if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR) != RESET)
- {
- if (hspi->State != HAL_SPI_STATE_BUSY_TX)
- {
- SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR);
- __HAL_SPI_CLEAR_OVRFLAG(hspi);
- printf("spi ovr err.");
- }
- }
- /* Call the Error call Back in case of Errors */
- if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
- {
- __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR);
- __HAL_SPI_CLEAR_OVRFLAG(hspi); //关闭中断后,再清一次溢出错误标志。
- hspi->State = HAL_SPI_STATE_READY;
- HAL_SPI_ErrorCallback(hspi);
- }
复制代码
|
|