STM32 SPI DMA和阻塞方式混合发送数据

本文介绍了在STM32系统中,SPI结合阻塞和DMA方式传输数据的场景与问题。对于大量数据写入,使用SPI+DMA能显著减少时间,如1700字节只需0.68ms。但在实现过程中遇到如DMA发送停止、SPI状态管理及中断冲突等问题,并给出了解决方案,包括使用HAL_SPI_Abort()函数和通过查询BSY标志判断传输结束。同时强调了在DMA模式下需要谨慎处理中断设置。
摘要由CSDN通过智能技术生成

因为SPI+阻塞方式可以使得字节间有大约0.4us的间隔(示波器查看得出),可适应从设备的数据准备时间,故用来做数据读取;

但此种方法对于向从设备写入大量数据来说,所需时间较长,比如写1700字节大约需要1.3ms左右。该时间超出RTOS的节拍,担心因此引入中断打断传输,或使用临界区保护又会干扰其他任务的实时调度。于是采用SPI+DMA的方式,实测1700字节写入大约需要0.68ms左右。

于是同一个系统中存在两种SPI使用方式:“SPI+阻塞(循环等待寄存器变化)”以及“SPI+DMA”;调试过程中也遇到了不少问题:

1、SPI+DMA只发送了一次就不发了。查看是因为没有打开SPI中断,未调用HAL库的SPI IRQhander来恢复hspi1.state为“ready”状态。因为使用HAL_SPI_Transmit_DMA()会将hspi1.state置为“BUSY”;

2、打开SPI中断,使中断处理程序调用SPI IRQhander来恢复hspi1.state为“ready”状态。但又出现在“SPI+阻塞“中一直卡在等待SPI RXNE为1好返回DR值上(此时SPI RXNE确实一直为0)。猜想可能是中断处理程序调用SPI IRQhander在中断中清除了RXNE或者其他操作影响了RXNE(时间所限,未经证实!);

3、取消SPI中断,自己强制将hspi1.state置为“ready”状态,可以跑了,但持续发送数据时卡顿,且用“SPI+阻塞“读取的数据也会周期性出错!加上SPI取消TXDMAEN位也不起作用;

4、搜了下看到有人说需要用HAL_S

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值