尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

HC32F460 DMA的链式传输(SPI主机+DMA发送/接收)
📅 发布时间:2026/6/20 5:33:16

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); }

相关新闻

  • 23、网络基础:IP地址、子网掩码与FreeBSD网络配置
  • 电机控制器程序就是新能源汽车的“灵魂操纵师“,这玩意儿直接决定了车子加速时是窜得像猎豹还是肉得像乌龟。今天咱们扒开控制器的外壳,看看代码层到底在搞什么飞机
  • 3天内搭建可商用的开源AI

最新新闻

  • 南京靠谱宠物店合集,买宠前建议多对比 - 园友3800037
  • CentOS7/欧拉系统 Systemd 管控双Tomcat+MariaDB+Nginx联动启动运维指南
  • 7步掌握Deeplearning4j深度学习框架:从入门到生产部署
  • 影刀RPA子流程设计:让复杂流程变清晰
  • 2026年阿里云618 Hermes Agent/OpenClaw配置Token Plan详细步骤一文讲清
  • 2026年6月脉冲除尘滚振清理筛供货厂家怎么选择,脉冲除尘滚振清理筛/滚振组合清理筛,脉冲除尘滚振清理筛制造企业哪家专业 - 品牌推荐师

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号