HC32F460 DMA的链式传输(SPI主机+DMA发送/接收)

1、SPI主机+DMA发送

SPI的发送操作在实现上与串口发送非常相似,尤其在使用DMA进行数据传输时,其配置流程和数据搬运机制是基本一致的,因此在此不再重复介绍DMA的具体配置细节。

唯一需要特别注意的是,在SPI发送过程中,主设备通过片选信号(CS)来控制通信时序。需要正确的输出片选信号。

发送部分代码如下

1. //SPI1主机 只发送 2. void SPI1_SendData(uint8_t *pu8Data, uint16_t u16Len) 3. { 4. uint32_t Timeout = 0xfffffff0; 5. while(SPI_GetStatus(CM_SPI1,SPI_FLAG_IDLE) == 0) //等待总线空闲 6. { 7. Timeout--; 8. if (Timeout-- == 0) 9. { 10. return; 11. } 12. }; 13. Wait_DMA_Ready(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, (uint32_t)(&CM_SPI1->DR)); // 等待DMA准备就绪 14. GPIO_ResetPins(SPI1_SS0_PORT, SPI1_SS0_PIN); //拉低片选 15. if (u16Len == 1) //如果只有一个数据,直接发送 16. { 17. SPI_WriteData(CM_SPI1, *pu8Data); 18. while(SPI_GetStatus(CM_SPI1,SPI_FLAG_IDLE) == 0) //等待发送完成 19. { 20. Timeout--; 21. if (Timeout-- == 0) 22. { 23. return; 24. } 25. }; 26. 27. GPIO_SetPins(SPI1_SS0_PORT, SPI1_SS0_PIN); //拉高片选 28. return; 29. } 30. 31. //多个数据传输 32. DMA_SetTransCount(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, u16Len - 1); // 设置DMA传输长度 33. DMA_SetSrcAddr(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, (uint32_t)(pu8Data + 1)); // 设置DMA源地址跳过第一个字节 34. DMA_SetDestAddr(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, (uint32_t)(&CM_SPI1->DR)); // 设置DMA目的地址 35. SPI_WriteData(CM_SPI1, *pu8Data); // 发送第一个字节 36. while(SPI_GetStatus(CM_SPI1,SPI_FLAG_IDLE) == 0) //等待总线空闲 37. { 38. Timeout--; 39. if (Timeout-- == 0) 40. { 41. return; 42. } 43. }; 44. GPIO_SetPins(SPI1_SS0_PORT, SPI1_SS0_PIN); //拉高片选 45. }

2、SPI主机+DMA接收

SPI主机的接收机制与串口接收存在一定差异。在SPI通信中,主机的接收操作总是伴随着发送操作进行的,也就是说,数据的接收是通过发送过程中的时钟同步完成的。因此,接收到的数据长度在通信开始前就是已知的,这一点为接收流程的简化提供了便利。

基于这一特点,可以在SPI主机发送逻辑的基础上,直接整合接收处理代码,实现发送与接收的同步控制。具体来说:

  • 在启动SPI传输之前,预先配置好接收DMA的起始地址和接收数据长度;
  • 随后启动SPI主机传输,整个接收过程将由DMA自动完成;
  • 由于接收长度已知,且接收与发送同步进行,因此在整个数据传输过程中,无需手动干预DMA通道的使能状态(CHEN),即可保证接收数据的完整性和正确性。

代码如下

//SPI1发送&接收数据 void SPI1_Send_Receive_Data(uint8_t *SendData, uint8_t *RevData,uint16_t u16Len) { uint32_t Timeout = 0xfffffff0; while(SPI_GetStatus(CM_SPI1,SPI_FLAG_IDLE) == 0) //等待总线空闲 { Timeout--; if (Timeout-- == 0) { return; } }; Timeout = 0; Wait_DMA_Ready(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, (uint32_t)(&CM_SPI1->DR));//等待DMA就绪 GPIO_ResetPins(SPI1_SS0_PORT, SPI1_SS0_PIN); //拉低片选 if (u16Len == 1) //如果只有一个数据,直接发送 { SPI_WriteData(CM_SPI1, *SendData); while(SPI_GetStatus(CM_SPI1,SPI_FLAG_IDLE) == 0) //等待发送完成 { Timeout--; if (Timeout-- == 0) { return; } }; //拉高片选 GPIO_SetPins(SPI1_SS0_PORT, SPI1_SS0_PIN); return; } //设置发送DMA参数 DMA_SetTransCount(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, u16Len - 1); // 设置DMA传输长度 DMA_SetSrcAddr(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, (uint32_t)(SendData + 1)); // 设置DMA源地址(跳过第一个字节) DMA_SetDestAddr(SPI1_TX_DMA_UNIT, SPI1_TX_DMA_CH, (uint32_t)(&CM_SPI1->DR)); // 设置DMA目的地址 //设置接收DMA参数 DMA_SetDestAddr(SPI1_RX_DMA_UNIT, SPI1_RX_DMA_CH, (uint32_t)RevData); // 设置DMA目的地址 DMA_SetTransCount(SPI1_RX_DMA_UNIT, SPI1_RX_DMA_CH, u16Len); // 设置DMA传输长度 SPI_WriteData(CM_SPI1, *SendData); // 发送第一个字节 while(SPI_GetStatus(CM_SPI1,SPI_FLAG_IDLE) == 0) // { Timeout--; if (Timeout-- == 0) { return; } }; GPIO_SetPins(SPI1_SS0_PORT, SPI1_SS0_PIN); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1026239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见安全设备理解

按照个人理解对常见安全设备进行分类和介绍 隔离类 传统防火墙 FIrewall 最早的边界防护设备,静态规则过滤流量,允许或阻断特定网络连接,核心是“网络层访问控制” 下一代防火墙 NGFW Firewall增加深度包检测(DPI)、应…

Transformer模型完全指南:从零开始学习大模型架构【收藏必学】

Transformer是谷歌2017年提出的神经网络架构,通过自注意力机制捕捉单词间依赖关系。以翻译任务为例,其工作流程包括:1)文本编码为嵌入向量(含位置信息);2)线性变换生成查询、键、值向量;3)Softmax归一化计算权重&#…

Windows下部署EmotiVoice语音合成全指南

Windows下部署EmotiVoice语音合成全指南 在智能家居设备日益复杂的今天,确保无线连接的稳定性已成为一大设计挑战。而当我们将目光转向音频体验时,类似的“基础但关键”的问题也在浮现:如何让机器发出的声音不只是清晰可辨,而是真…

电机控制器程序就是新能源汽车的“灵魂操纵师“,这玩意儿直接决定了车子加速时是窜得像猎豹还是肉得像乌龟。今天咱们扒开控制器的外壳,看看代码层到底在搞什么飞机

新能源汽车电机控制器程序先看一段真实的电流环控制代码片段: void CurrentControlLoop(void) {// 读取三相电流Iabc GetPhaseCurrents(); // Clarke变换:三相转两相Iα Iabc.a;Iβ (Iabc.b - Iabc.c) * ONE_BY_SQRT3;// Park变换:静止坐标…

23、网络基础:IP地址、子网掩码与FreeBSD网络配置

网络基础:IP地址、子网掩码与FreeBSD网络配置 1. IP地址概述 IP地址是用于在互联网上标识特定计算机的一种方式,其含义比“每台机器一个IP地址”更为灵活。通常,它是一种逻辑标识,目的是在互联网上定位一台机器,以便IP路由器能够引导它与其他任何机器之间的流量。 IP地…

3天内搭建可商用的开源AI

通过以下方案,你可以在3天内搭建一个功能完整、性能可靠、成本可控的AI写作工作流。一体化平台,降低AI应用的开发和部署门槛,让每个组织都能快速拥有自己的AI能力。 一、业务痛点 需要一个能快速上线、具备商业闭环、支持私有化部署的AI写作…

AI纪元2025终章:开源革命、监管铁幕与人类主体性的觉醒

序章:2025 年末的三重惊雷2025 年12月12日至16日,短短五天内,全球 AI 领域接连爆发足以改写历史的重大事件:OpenAI GPT-5.2 仓促登场却遭全网差评,谷歌 Gemini 3 Pro 凭技术硬实力登顶;英伟达突然发布 Nemo…

LobeChat能否支持AR/VR交互?三维空间对话界面畅想

LobeChat 能否支持 AR/VR 交互?三维空间对话界面畅想 在 Meta Quest 头显中维修一台虚拟发动机,你抬起视线,轻声问:“这个故障码 P0301 是什么意思?”几乎瞬间,一个半透明的蓝色面板从空中浮现&#xff0c…

Excalidraw:开源手绘风白板绘图工具

Excalidraw:像在纸上涂鸦一样自由表达的技术绘图工具 你有没有过这样的经历?打开 Visio 或 draw.io 准备画个架构图,结果先花了十分钟找合适的图标库;想快速和同事对齐一个系统设计思路,却因为工具太“正式”而不敢轻…

国产大模型横评:从Kimi到Qwen,哪款最适合程序员?

文章详细介绍了多个国产开源大模型的发展与特点,包括Kimi的线性注意力机制模型、DeepSeek的视觉压缩模型、清华Glyph、MiniMax的M2、快手KAT编程大模型以及智谱GLM系列等。通过对阿里Qwen3-Max的多项测试,评估了其在SVG生成、3D动画、数据可视化等场景下…

腾讯混元HunyuanVideo-Foley:声画合一的视频音效革命

腾讯混元HunyuanVideo-Foley:声画合一的视频音效革命 在短视频日更、影视工业化加速、游戏沉浸感不断升级的今天,一个常被忽视却至关重要的环节正悄然成为内容体验的“最后一公里”——音效。再精美的画面,若配上错位的脚步声或突兀的背景音乐…

自动紧急制动系统仿真实战手记

自动紧急制动AEB控制策略仿真模型与课程设计文档说明参考,整个AEB仿真模型包含AEB策略算法模型和车辆环境模型,AEB策略算法模型由两个主要子系统组成,其中包含传感器融合算法和AEB控制器。 车辆与环境模型包含对自我车辆动力学和环境、驾驶场…

Gradle配置groovy增量编译

首先需要开启预览特性 在settings.gradle中添加配置enableFeaturePreview(GROOVY_COMPILATION_AVOIDANCE)以启动增量编译配置 然后在task中配置groovy增量编译 在build.gradle中添加如下配置 tasks.withType(GroovyCompile).configureEach {// 启用groovy的增量编译!// 注意…

腾讯云国际站代理商的TAPD有什么优势呢?

腾讯云国际站的 TAPD(腾讯敏捷产品研发平台)本身就具备适配跨境研发协作的全周期管理、智能化协作等核心能力,通过国际站代理商合作使用该服务,还能在成本支出、落地适配、技术支持等方面获得额外优势,具体如下&#x…

AI模型训练入门指南:手把手教你构建自己的智能模型

本文是AI模型训练的初学者指南,系统介绍了从定义用例到部署维护的完整流程。文章详细解释了数据集、算法和训练过程三大核心要素,提供了七个关键步骤:确定应用场景、数据收集准备、选择模型算法、配置环境、训练模型、验证测试以及部署维护。…

EmotiVoice开源TTS项目结构与配置详解

EmotiVoice开源TTS项目结构与配置详解 在语音合成技术飞速发展的今天,用户不再满足于“能说话”的机械音,而是期待更自然、更有情绪的表达。EmotiVoice 正是在这一背景下脱颖而出的开源项目——它不仅支持多情感语音生成,还能通过短短几秒音频…

数据访问:MyBatisMybatis-Plus

Spring Boot集成MyBatisSpring Boot集成MyBatis的步骤添加依赖 在pom.xml文件中添加MyBatis和数据库驱动依赖。以MySQL为例&#xff1a;<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifact…

中小企业的营销“暖心伙伴”——北京易美之尚,让增长不再难

“深夜改完的营销方案&#xff0c;投出去却石沉大海&#xff1b;花大价钱引的流量&#xff0c;转头就成了‘一次性过客’”——这大概是很多中小企业主的日常焦虑。在互联网营销的浪潮里&#xff0c;不是不想冲&#xff0c;而是怕方向错&#xff1b;不是没投入&#xff0c;而是…

openFuyao AI推理加速方案深度解析

算力时代的新挑战 在AI大模型爆发的时代&#xff0c;企业面临着前所未有的算力需求&#xff1a; 模型规模爆炸&#xff1a;从GPT-3的1750亿参数到DeepSeek的671亿参数&#xff0c;大模型已成为AI应用的标配 推理需求激增&#xff1a;实时AI应用&#xff08;智能客服、搜索推荐…

2025年安徽靠谱交通事故律师事务所排行榜,口碑好的交通事故 - mypinpai

为帮当事人高效锁定适配自身需求的交通事故法律服务合作伙伴,避免维权走弯路,我们从专业能力(如事故责任研判、赔偿金额核算)、服务效率(含全流程协同、资源整合速度)、案件胜诉率(覆盖调解与诉讼成果)及真实客…