news 2026/7/7 20:51:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 17:13:38

LobeChat能否用于生成APP界面文案?UX写作助手

LobeChat能否用于生成APP界面文案?UX写作助手 在移动产品竞争日益激烈的今天,一句恰到好处的按钮文案,可能就是用户完成转化的关键。但现实是,很多团队仍在靠“拍脑袋”决定“确定吗?”还是“确认一下?”&a…

作者头像 李华
网站建设 2026/7/7 17:42:36

Docker安装最佳实践:配置清华源加速TensorFlow镜像构建

Docker安装最佳实践:配置清华源加速TensorFlow镜像构建 在人工智能项目开发中,一个常见的痛点是:当你兴致勃勃地准备启动一个基于 TensorFlow 的实验时,执行 docker pull tensorflow/tensorflow:latest 后,终端却卡在…

作者头像 李华
网站建设 2026/7/7 9:20:40

Dify智能体平台在未来AI生态中的定位展望

Dify智能体平台在未来AI生态中的定位展望 在企业纷纷拥抱“AI原生”转型的今天,一个现实问题摆在面前:如何让大模型的能力真正落地到具体业务中?我们早已见证了GPT类模型在生成文本、编写代码方面的惊艳表现,但这些能力若无法被系…

作者头像 李华
网站建设 2026/7/6 22:27:02

FaceFusion性能优化与生产部署实践

FaceFusion性能优化与生产部署实践 在AI换脸技术逐渐从实验室走向影视制作、内容创作乃至实时直播的今天,FaceFusion 凭借其高精度的人脸对齐、自然的图像融合效果和模块化架构,已成为开源社区中备受青睐的专业级工具。然而,随着输入分辨率提…

作者头像 李华
网站建设 2026/7/7 4:44:29

不同形貌银包铜粉体(组合),是如何显著提升导电油墨的电性能的?

“真正决定油墨导电性的,不只是银含量,而是粉体之间的‘搭接方式’。”在电子行业里,导电油墨早已不是“单纯的高导电材料”,而是一个微观结构工程的问题: 如何让粉体在树脂体系中构建 连续、稳定、低阻抗、耐环境的导…

作者头像 李华
网站建设 2026/7/7 17:43:22

UVa 12788 Smooth Factor

题目描述 给定一个整数数组 a1,a2,…,ana_1, a_2, \ldots, a_na1​,a2​,…,an​ &#xff0c;定义其 平滑因子 为&#xff1a;最长的连续子数组 ap,…,aqa_p, \ldots, a_qap​,…,aq​ 的长度&#xff0c;其中至多存在一个位置 iii &#xff08; p<i≤qp < i \leq qp<…

作者头像 李华