DEBUG日记:SPI作从机数据移位问题,基于STM32F407

stm32f407做spi从机的时候,开启dma接受后即等待主机的时钟以完成接受。如接受16个字节,则需要16个跳变沿(根据配置决定上升沿或下降沿)。由于在stm32f407的spi传输中并没有对时钟的脉宽限制,所以在此过程中,如果在时钟上产生干扰(额外的跳变沿),则会发生数据移位的bug,即下次采样时,寄存器中还有几位上次留下来的数据,导致数据移位。

看了很多帖子,有说可以通过SPI_CR1->SPE置高再置低来解决,有说在传输完成时关闭dma(HAL库中有HAL_SPI_DMAStop()这个函数。这样也许就算时钟多出来几位,也不会发成传输),然而以上两个方法实测并没有解决问题。

解决方式是先切换成主模式再切换成从模式,即SPI_CR1->SSI & MSTR先置高再置低,此时寄存器随之重置,问题解决。每次传输前都进行一次“从-主-从”的切换,就算一次传输中时钟线引入干扰,此次数据失效,依然不影响下一次的传输。

时钟线引入干扰后,极端情况下数据大小变为原数据的两倍(0x80->0xFF),如果干扰信号出现的不频繁,可以通过多次数据的掐头去尾来去除影响。若是干扰信号频繁出现,也可通过均值滤波降低对数据的干扰。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SPI(Serial Peripheral Interface)是一种串行外设接口协议,用于在主机(通常是微控制器或处理器)和外设之间进行通信。SPI支持一种主机模式,其中主机控制通信并发送数据给外设。下面是SPI主机模式发送数据的基本步骤: 1. 确定SPI通信参数:包括数据位宽、时钟极性、时钟相位和时钟速率等。这些参数需要与外设进行匹配才能正确通信。 2. 配置主机硬件:根据具体的硬件平台和开发环境,配置相关的寄存器或引脚,以使其支持SPI主机模式。 3. 启动SPI传输:启动SPI传输前,确保外设已经处于可用状态。发送一个特殊的启动命令或设置相关寄存器来启动SPI传输。 4. 准备数据:准备要发送的数据,并将其存储在适当的寄存器或变量中。 5. 发送数据:将数据按照指定的数据位宽和传输顺序逐位发送给外设。通常是从最高位开始,通过SPI接口的数据引脚发送,直到所有数据位都发送完成。 6. 等待传输完成:在数据发送完毕后,等待外设处理数据并完成回应。具体的等待时间取决于外设的响应时间。 7. 结束传输:传输完成后,根据需要可以发送一些特殊的结束命令或配置相关寄存器来结束SPI传输。 以上是SPI主机模式发送数据的基本步骤,具体的实现方式和代码可能会因硬件平台和开发环境而有所不同。在具体的开发中,可以参考相关的开发文档或示例代码来实现SPI主机模式的数据发送。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值