STM32 DMA SPI 自发自收 数据错位问题

用STM32F4系列,SPI1做主机,SPI2做从机

SPI1 设置

SPI2从机

经验分享1:

SPI2 不能主动发送,必须被动发送,即SPI 1请求,SPI2才能发送

经验分享2:

数据错位问题,SP1发送 {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};

SPI2接收总是发生错位

偶然发现是因为初始化的时候,把SPI1的接收DMA打开影响了

把HAL_SPI_Receive_DMA(&hspi1, spi1_rxdata, 8); 屏蔽后,SPI2接收正常

没有深入分析原因,有知道的大神可以告知一下哈~

7.29

我后面把主机和从机分开两块板做实验,但是现象原因分析是一样的。

分析上面原因,是因为SPI的协议

实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

这里有篇文章写得很好

参考链接:

【STM32笔记】两块STM32之间的SPI主从通信实例(附代码工程)-腾讯云开发者社区-腾讯云

对于从机而言,调用HAL_SPI_TransmitReceive_DMA只是把要发送的内容放在待发送区,并不是真正的发送。而真正的发送是从机接收到主机的消息,这时同一时刻从机才会把spi_txdata的内容发送出去。

数据的错位分析

*******************************错误操作************************************

主机在while 1里循环发送

从机在接收中断应答

另外我这边很容易出错的地方就是从机接收中断里调用HAL_SPI_TransmitReceive_DMA,从机会因为状态busy而不没有执行向发送区填充数据,导致主机接收数据不对。

原因是DMA1_Stream3的中断,SPI还没接收完成,所以此时让SPI发送,它BUSY

*******************************错误操作************************************

↓下面是正确操作

解决方法是在从机接收完成中断记录一个标记位。

从机while 当识别到接收完成,回复信息

参考链接:STM32-SPI详解_stm32 spi-CSDN博客

基于stm32的spi从机实验HAL库编程_stm32 硬件spi hal库-CSDN博客

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值