STMCU小助手
发布时间:2025-11-17 10:22
|
最近不止一个人聊起如何使用GPIO结合DMA模拟串行通信方面的话题,并咨询有无相关参考例程或文档。我这里使用STM32G474芯片的GPIO,结合DMA与TIMER来模拟SPI通信,做下快速演示以供参考。 被模拟出的SPI采用全双工通信方式。被模拟的SPI做主,选择PA0做发送脚,PA1做接收脚,PC7做片选控制脚。时钟使用TIM3 CH1的PWM输出来提供。片内SPI1做从,也工作在全双工模式。
上图左边代表被模拟的主SPI,右边是从SPI1。 下图是做测试验证时的连线示意。红线是两根通信线,其它两根分别是片选线和时钟线。
有关SPI的极性与相位配置,选择下面模式:
现在要演示的就是,主SPI【即GPIO模拟的】在定时器提供时钟和相应定时器事件触发下,通过DMA访**PIO进行数据收发。它接收的数据来自从SPI1发送的,发送的就是内存数据。显然,对于主SPI而言,1个字节的串行数据要通过DMA发送8次才能完成。 现在主SPI发送2个字节【0xaaaa】数据给SPI1,同时从SPI1也发送2个字节【0x5555】过来。 对于模拟的主SPI来说,基于SPI方式发送2个字节过去,意味着要发送16次数据到GPIOA,其中真正有效位就是PA0。同时,也要从GPIOA接收16个数据,具体接收的有效位就是PA1。 下面是我演示代码中涉及到的几个用户变量和函数。
函数CalRXdata16( )是用来将主SPI接收到的16个数据中的有效位提取出来并重新组成最终的2字节数据。 GPIOTxData【】数组就是主SPI要发送出去的16个数据,显然,每次真正发送的就是bit0,通过PA0发送出去。把这16bit连起来就是0xaaaa。这里配置为高位先发。 GPIORxData【】数组就是主SPI要接收回来的16个数据,每次真正有效接收的是bit1,通过PA1接收回来。再经函数CalRXdata16( )将真正的2字节数据提取出来。 SPITxData[]存放SPI1要发送给主SPI的两个数据,即0x55,0x55。 SPIRxData[]存放SPI1从主SPI接收到的数据。按理就是0xaa,0xaa。 大致原理及要做的事情就介绍到这里。现在基于前面要求开始做编程准备。先使用STM32CubeMx进行配置。 PA0配置为输出,模拟主SPI的串行信号的输出脚,连接SPI1的MOSI脚。 PA1配置为输入,模拟主SPI的串行信号的输入脚,接SPI1的MISO脚。 PC7配置为输出,模拟主SPI的片选控制脚,接SPI1的NSS脚。 PC6作为TIM3 CH1的pwm输出,模拟主SPI的输出时钟,接SPI1的时钟脚。 现在简单看看TIM3的配置,输出占空比50%的一定频率的方波。开启定时器比较事件和更新事件的DMA请求。
我们再来看看 SPI1的配置,它的收发也采用DMA方式。
测试过程中,上面所有DMA配置在Normal模式。 配置很简单,基本就是这些了。创建工程后,添加一些用户代码即可测试验证。 下面主用户代码里涉及的函数原型均为库定义好了的,我们只需给合适的参数即可。
上面的用户代码都比较简单,直观明了,在此不多做解释。最好结合前面的配置一起理解这些代码。 整理、编译、调试,下面就是最后的验证结果:
图中开头的16个16位数据就是借助DMA从GPIOA接收到原始数据,红色箭头所指就是从这16个数据中提取出来的最终结果,即0x5555,也就是SPI1发送过来的。 SPIRxData就是主SPI以串行方式发送给SPI1的数据0xaaaa,即SPI1收到的数据。 前面的演示只是模拟了主SPI,使用到SPI 4种通信模式中的一种。其它角色和模式,如果读者有兴趣可以自行验证体验。不难看出,这里用到的都是些常用的基础外设,说实话,上面用法平常也并不算普遍。毕竟对于STM32而言,片内现有外设够丰富的了。不过,话说回来,如果你对这些常用的基础外设把握得比较透彻,在需要做些定制性的应用需求或因资源问题做些应急性处理时就可以小试身手了。 OK,今天的分享就到这里。此处分享算是抛砖引玉吧,希望给合适的人以参考和信心。下次再聊~! 文章出处:茶话MCU |
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 多个SPI的DMA传输为何仅1个有效?
经验分享 | STM32 DMAMUX应用示例
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | 基于STM32H7 UART 空闲事件及DMA传输示例
经验分享 | 关于STM32 DMA传输的两个问题释疑
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32 TIMER+DMA输出PWM异常二案例
经验分享 | STM32H7 EXTI + SPI +DMA 双缓冲应用演示
微信公众号
手机版