HAL库 SPI+DMA接收 通讯速率高就读取失败

embedded/2025/1/16 6:46:30/

    最近在写一个读取ad7691数据的驱动时,SPI2设置为Receive only master模式,此时发现用SPI+DMA的HAL库函数HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)接收数据时(DMA为normal模式,以字节单位传输),通讯速率在300K以下时能够正常接收数据,而高于这个速率接收的数据就很乱,甚至收不到数据;如果不用DMA,用HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData)函数轮询接收数据时,通讯速率在600K以下时能够正常接收数据,而高于这个速率同样无法正常接收数据。拿示波器看了SPI的波形都是正常的,百思不得其解,后面去网上看到有人说要配置成全双工才能正常工作。

STM32 HAL库SPI+DMA接收数据的配置和使用方法_isyefeng-开放原子开发者工作坊

    于是我将SPI设置成了Full-Duplex Master模式,调用 HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)和HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData)仍然不行,但是神奇之处在于,调用HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)读写DMA函数,数据接收一下子就正常了,通讯速率轻轻松松跑到20M。此时好像只会进入发送完成中断而不会进入接收完成中断。

    至于为什么会这样,具体原因我也不清楚,而且更让人疑惑的时,我的另一路SPI1设置为Transmit only master模式,DMA为normal模式,以字节单位传输,使用HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size)发送数据,通讯速率40M都没有问题;只能说以后使用SPI还是老老实实用全双工模式吧。


http://www.ppmy.cn/embedded/154327.html

相关文章

vim使用指南

🏝️专栏:计算机操作系统 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 一、Vim 的基本概念 1.1普通模式 (Normal Mode) 1.2插入模式 (Insert Mode) 1.3命令模…

Vue3使用vue-count-to数字滚动模块报错解决方案

小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下: TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因,排查还得去看源码,所以我们来解决&a…

hot100_240. 搜索二维矩阵 II

hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,1…

【精选】基于EfficientViT优化YOLOv8的智能车辆识别系统设计 车辆颜色分类与车牌检测、深度学习目标检测系统开发

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

(12)springMVC文件的上传

SpringMVC文件上传 首先是快速搭建一个springMVC项目 新建项目mvn依赖导入添加webMoudle添加Tomcat运行环境.在配置tomcat时ApplicationContext置为"/"配置Artfact的lib配置WEB-INF配置文件(记得添加乱码过滤)配置springmvc-servlet文件&…

Vue2+OpenLayers给标点Feature添加信息窗体(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 3.1、信息窗体DOM元素 3.2、创建Overlay 3.3、创建一个点 3.4、给点初始化点击事件 3.5、完整代码 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 初始化变量: d…

【漫话机器学习系列】046.弹性网络(Elastic Net)

弹性网络(Elastic Net) 弹性网络(Elastic Net) 是一种线性回归模型正则化方法,结合了L1正则化(Lasso)和L2正则化(Ridge)的优点,解决了它们各自的缺点&#x…

什么是IDE,新手如何选择IDE?

IDE 是 Integrated Development Environment(集成开发环境)的缩写,它是一种软件应用程序,为程序员提供了一站式的开发环境,整合了多种工具和服务,以便高效地创建、修改、编译、调试和运行软件程序。IDE 集成…