spi DMA 复位后主机接收上一帧数据

由于硬件接口有限,需要用spi总线进行设备之间进行通信,我使用的HAL库,对于实现spi主从通信我将在另一篇文章里描述一下配置。该文章主要说明SPI复位问题。

问题1:由于spi在进行通信时,有时会受到干扰,或者clock错位,之后便一直无法复位,此时需要软件进行复位。

错误示例

 

软件复位也比较简单就是重新初始化:

/*************************************************************************************/
	

	HAL_SPI_DeInit(&hspi2);
	
	HAL_SPI_Init(&hspi2);
	
	HAL_SPI_TransmitReceive_DMA(&hspi2,spi_send_buf,(uint8_t *)spi_recv_buf,BUF_MAX_LEN);

/*************************************************************************************/

问题2:spi复位后,主机接收第一个字节是上一帧数据的最后一个字节。下图中0XFF是上一帧最后一个字节。

导致这个问题的原因是:使用__HAL_DMA_GET_FLAG或者__HAL_DMA_GET_COUNTER来查看DMA是否传输完成,如果传输完成就进行复位。但是实际上,SPI数据寄存器DR并没有被读走。手册上有关于spi复位说明。应该使用__HAL_SPI_GET_FLAG判断发送缓冲区是否为空,再进行复位。

理论上来说,进行复位后,SPI数据寄存器里的值应该为空或者是最新加载进去的值,不应该是上一帧数据的最后一个字节。对于该情况手册上也有说明:在从发送模式下,如果在软件尚未将任何值加载到 SPI_DR 之前出现第一个数据发送时钟, 此标志将置 1

另外:SPI DMA配置成DMA_NORMAL模式,进行复位要在数据传输完成后进行。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值