STM32F4与STM32L4,SPI DMA HAL 关闭片选 时机探讨

我使用STM32F407,标准库 + SPI + DMA 通信,发送接收数据。
当我们配置好SPI,DMA发送模式后,首先开启 SPI-NSS(片选端子),然后使能SPI ,使能DMA,就可以进行发送数据了,但是往往都会遇到,对方所接收的数据最后会错一个字节的数据,或者少一个自己的数据,其实就是由于DMA发送完成(只是代表DMA控制器已经将最后一个数据传给了SPI-DR寄存器,如果开启了DMA中断,这时就将进入DMA发送完成中断),其实SPI并未完全将最后一个字节发送出去,还应该做如下判断,才能确保DMA完全发送了数据,不应该在DMA中断里面直接关闭SPI-NSS片选。
if ( DMA_GetFlagStatus(DMA1_Stream0,DMA_FLAG_TCIF0) == 1 ) //DMA接收完成,SPI还没发送完成
while(…);//继续等待
if ( SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE) == 1 ) //SPI->DR寄存器传至移位寄存器完成,移位寄存器可能还没发送完成
while(…);//继续等待
if ( SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_BSY) == 1) //SPI发送未完成
while(…);//继续等待
通过逻辑分析仪发下,如果在DMA中,关闭片选,可以明显看到最后一个字节数据并未发送完成,片选就关闭了。所以必须做上述判断,才能再关闭片选。

在我使用STM32L452时,时钟频率为80MHZ,我需要用到 HAL库 + SPI + DMA ,发送接收数据。
我使用DMA中断,SPI不中断。
使用 HAL_SPI_TransmitReceive_DMA(&hspi2, tx_buf, rx_buf, length)函数,使能SPI,使能DMA,DMA开始发送数据。
当发送完成,进入DMA中断,中断处理后,将调用HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)函数(本函数需要用户自己编写),我在该回调函数中,直接关闭SPI-NSS片选。
使用逻辑分析仪测试,最后一个字节发送完成,再到关闭片选,需要6us。这样在回调函数中直接关闭SPI-NSS片选,是完全可行的,不用再去判断SPI外设的标志位了。
如果仅在回调函数中设置标志位(自己设个标志位),再到主程序判断,然后关闭片选,需要10us。

结论::::
在STM32F407中,使用标准库,在DMA中断中关闭片选,可以通过逻辑分析仪明显发现,最后一个字节没有发送完成,就关闭了片选。
在STM32L452中,使用HAL库,在DMA中断的回调函数中关闭片选,可以通过逻辑分析仪发现,最后一个字节已经完成,才会关闭片选。

可能二款MCU,主频差异、或者标准库 和HAL库的效率差异(或编程差异)、还是 二款MCU的 SPI+DMA外设的机制差异,使他们编程方法出现差异,希望共同探讨。

STM32F4与STM32L4,SPI DMA HAL 关闭片选 时机探讨相关推荐

  1. W5100S SPI+DMA 中的片选信号处理

    最近在玩W5100S-L这个芯片. 使用SPI+DMA时,CPU在执行完DMA函数调用后会继续执行后续代码,而DMA的TC中断也并不是数据完全传完的时刻(而是最后一个数据放入缓存区后就TC中断),同时 ...

  2. STM32F4 SPI DMA

    文章目录 STM32F4 SPI DMA 自己整理(存储器到外设模式) SPI结构体 SPI引脚编号 SPI配置 DMA结构体 DMA请求映射 DMA传输模式 SPI 发送DMA配置 DMA发送中断服 ...

  3. stm32f4 SPI DMA FLASH 传输调试

    来源:项目中需要用stm32对外部spi flash(m25p16  2MB)进行快速读取,主要是图像数据. 平台:stm32f407---168MHz,FreeRTOS V7.3.0 主要参考:ht ...

  4. STM32 SPI+DMA 驱动 SRAM LY68L6400SLIT 应用笔记

    关键词:库函数,STM32F407,SPI+DMA ,SPI-DMA,SRAM , LY68L6400SLIT,STM32CubeMX 编 辑:大黄蜂 说明:本笔记记录 基于 STM32F407 + ...

  5. 两块STM32之间 SPI DMA通信

    @[两块STM32之间 SPI DMA通信] 这里讲的是两块STM32F407板子的互相通讯,折腾了3天,终于比较清楚了,特此记录. 两块板子互相通讯,除了SPI的接线,肯定还有其他信号线,必须注意这 ...

  6. SPI + DMA

    说一说DMA是什么东西,DMA本身的意思是Direct Memory Access,直接存取访问,可以看到这只是一种存取方式,或者说读写方式,或是直白点来说,就是直接读取,说的太直白了,感觉这个DMA ...

  7. GD32F303调试小记(二)之SPI(软件SPI、硬件SPI、硬件SPI+DMA)

    前言 目前有一个项目中用到了TFT-LCD,其驱动芯片为ILI9341.为更好的达到显示效果,在最终的代码中我们会使用单片机自带的硬件SPI+DMA模块(由于调试过程中SPI+DMA输出的波形没能驱屏 ...

  8. STM32 SPI+DMA驱动WS2812

    [举报再看养成习惯,噢 不对,点赞再看养成习惯.感谢支持] 开头不多叨叨,直接进入主题: WS2812的驱动原理: 首先明白高低电平的表示方法: 低电平(0 code): 0.35us的高电平+0.8 ...

  9. 基于STM32F411使用SPI+DMA驱动LCD

    先看效果 F411CE 硬件SPI+DMA驱动LCD 基于HAL库 其实HAL库我用不太习惯,一直也是用的标准库 但HAL库确实是好上手一些,就迅速创建一个新的template 这次就当尝试一下吧,因 ...

最新文章

  1. DeepMind论文:深度压缩感知,新框架提升GAN性能(附链接)
  2. 「杂谈」为什么你学了AI,企业却不要你
  3. [转]Display PDF within web browser using MVC3
  4. 从“小”培养AI安全意识:OpenAI开源最新强化学习训练工具,安全约束自由定制,开箱即用...
  5. VC++下命名管道编程的原理及实现
  6. ODI中web service介绍
  7. 使用Zapier将应用程序与Neo4j集成
  8. 数据库笔记2:SQL运算符
  9. 一台linux上运行多个mysql_linux下同时运行多个mysql
  10. 955. 删列造序 II
  11. Python面向对象编程扑克牌发牌程序,另含大量Python代码!
  12. [机器学习-sklearn]鸢尾花Iris数据集
  13. 广工 2013 c语言 试卷,广工2013-5-30、6-25概率论c试卷答案.doc
  14. WCF分布式安全开发实践(1):传输安全模式之匿名客户端:Transport_None_WSHttpBinding
  15. 浏览器设置(除了页面百分比之外,还有“字体大小”)
  16. 贺利坚老师汇编课程27笔记(二):loop和[bx]访问连续内存单元
  17. c语言 数据结构面试题及答案,数据结构c语言版试题大全(含答案).docx
  18. Trojan Killer(木马查杀工具)官方版
  19. 饭谈:盘点六种错误的技术问题提问
  20. SView三维轻量化浏览器

热门文章

  1. cad中lisp文件给恶作剧_[软件心得]我用的CAD,LISP加载文件
  2. NS3 仿真系列资料大全
  3. 解决AXmath公式编号从0开始的问题
  4. 从面向对象编程转为面向接口编程
  5. 有趣的马氏链及其平稳分布
  6. c语言的链表实验总结,链表实现集合实验报告_相关文章专题_写写帮文库
  7. 融资担保系统-助力企业的可持续发展
  8. 薛建儒:无人车的场景理解与自主运动
  9. 跨越平台桌面应用开发框架electron使用的心路历程
  10. 六、网络加速原理-CDN