STM32F4与STM32L4,SPI DMA HAL 关闭片选 时机探讨
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 关闭片选 时机探讨相关推荐
- W5100S SPI+DMA 中的片选信号处理
最近在玩W5100S-L这个芯片. 使用SPI+DMA时,CPU在执行完DMA函数调用后会继续执行后续代码,而DMA的TC中断也并不是数据完全传完的时刻(而是最后一个数据放入缓存区后就TC中断),同时 ...
- STM32F4 SPI DMA
文章目录 STM32F4 SPI DMA 自己整理(存储器到外设模式) SPI结构体 SPI引脚编号 SPI配置 DMA结构体 DMA请求映射 DMA传输模式 SPI 发送DMA配置 DMA发送中断服 ...
- stm32f4 SPI DMA FLASH 传输调试
来源:项目中需要用stm32对外部spi flash(m25p16 2MB)进行快速读取,主要是图像数据. 平台:stm32f407---168MHz,FreeRTOS V7.3.0 主要参考:ht ...
- STM32 SPI+DMA 驱动 SRAM LY68L6400SLIT 应用笔记
关键词:库函数,STM32F407,SPI+DMA ,SPI-DMA,SRAM , LY68L6400SLIT,STM32CubeMX 编 辑:大黄蜂 说明:本笔记记录 基于 STM32F407 + ...
- 两块STM32之间 SPI DMA通信
@[两块STM32之间 SPI DMA通信] 这里讲的是两块STM32F407板子的互相通讯,折腾了3天,终于比较清楚了,特此记录. 两块板子互相通讯,除了SPI的接线,肯定还有其他信号线,必须注意这 ...
- SPI + DMA
说一说DMA是什么东西,DMA本身的意思是Direct Memory Access,直接存取访问,可以看到这只是一种存取方式,或者说读写方式,或是直白点来说,就是直接读取,说的太直白了,感觉这个DMA ...
- GD32F303调试小记(二)之SPI(软件SPI、硬件SPI、硬件SPI+DMA)
前言 目前有一个项目中用到了TFT-LCD,其驱动芯片为ILI9341.为更好的达到显示效果,在最终的代码中我们会使用单片机自带的硬件SPI+DMA模块(由于调试过程中SPI+DMA输出的波形没能驱屏 ...
- STM32 SPI+DMA驱动WS2812
[举报再看养成习惯,噢 不对,点赞再看养成习惯.感谢支持] 开头不多叨叨,直接进入主题: WS2812的驱动原理: 首先明白高低电平的表示方法: 低电平(0 code): 0.35us的高电平+0.8 ...
- 基于STM32F411使用SPI+DMA驱动LCD
先看效果 F411CE 硬件SPI+DMA驱动LCD 基于HAL库 其实HAL库我用不太习惯,一直也是用的标准库 但HAL库确实是好上手一些,就迅速创建一个新的template 这次就当尝试一下吧,因 ...
最新文章
- DeepMind论文:深度压缩感知,新框架提升GAN性能(附链接)
- 「杂谈」为什么你学了AI,企业却不要你
- [转]Display PDF within web browser using MVC3
- 从“小”培养AI安全意识:OpenAI开源最新强化学习训练工具,安全约束自由定制,开箱即用...
- VC++下命名管道编程的原理及实现
- ODI中web service介绍
- 使用Zapier将应用程序与Neo4j集成
- 数据库笔记2:SQL运算符
- 一台linux上运行多个mysql_linux下同时运行多个mysql
- 955. 删列造序 II
- Python面向对象编程扑克牌发牌程序,另含大量Python代码!
- [机器学习-sklearn]鸢尾花Iris数据集
- 广工 2013 c语言 试卷,广工2013-5-30、6-25概率论c试卷答案.doc
- WCF分布式安全开发实践(1):传输安全模式之匿名客户端:Transport_None_WSHttpBinding
- 浏览器设置(除了页面百分比之外,还有“字体大小”)
- 贺利坚老师汇编课程27笔记(二):loop和[bx]访问连续内存单元
- c语言 数据结构面试题及答案,数据结构c语言版试题大全(含答案).docx
- Trojan Killer(木马查杀工具)官方版
- 饭谈:盘点六种错误的技术问题提问
- SView三维轻量化浏览器