由于需求用到GD32 SPI,

故做相关实验记录分享,本实验为 SPI DMA 发送与接收 16bit 数据, GD32 相关配置如下

GD32 F30x系列 DMA配置如下

SPI DMA 发:使用SPI0,对应的DMA为0 Channel 2。

注意打开 对应 DMA 与 SPI 相关时钟, DMA write 使用时需要先拉低 NSS,发送结束,拉高NSS

void SPI0_config(void)
{rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_SPI0);rcu_periph_clock_enable(RCU_DMA0);/* SPI0 GPIO config: SCK/PA5, MISO/PA6, MOSI/PA7 */gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 |GPIO_PIN_6 | GPIO_PIN_7);/* PA3 as NSS */gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);/* SPI0 parameter config */spi_parameter_struct  spi_init_struct;spi_init_struct.trans_mode           = SPI_TRANSMODE_BDTRANSMIT;spi_init_struct.device_mode          = SPI_MASTER;spi_init_struct.frame_size           = SPI_FRAMESIZE_16BIT;spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;spi_init_struct.nss                  = SPI_NSS_SOFT;spi_init_struct.prescale             = SPI_PSC_256;spi_init_struct.endian               = SPI_ENDIAN_MSB;spi_init(SPI0, &spi_init_struct);spi_enable(SPI0);
}void DMASPI0_config(void)  //DMA
{dma_parameter_struct dma_init_struct;/* SPI0 transmit dma config:DMA0-DMA_CH2  */dma_deinit(DMA0, DMA_CH2);dma_init_struct.periph_addr  = (uint32_t)(&SPI_DATA(SPI0));dma_init_struct.memory_addr  = (uint32_t)TestData;dma_init_struct.direction    = DMA_MEMORY_TO_PERIPHERAL;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;dma_init_struct.priority     = DMA_PRIORITY_LOW;dma_init_struct.number       = 6;dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init(DMA0, DMA_CH2, &dma_init_struct);/* configure DMA mode */dma_circulation_disable(DMA0, DMA_CH2);dma_memory_to_memory_disable(DMA0, DMA_CH2);dma_channel_disable(DMA0,DMA_CH2); }void DMASPI0_write(uint16_t *buf, uint16_t len)  //DMA write
{dma_deinit(DMA0, DMA_CH2);dma_parameter_struct dma_init_struct;dma_init_struct.periph_addr  = (uint32_t)(&SPI_DATA(SPI0));dma_init_struct.memory_addr  = (uint32_t)buf;dma_init_struct.direction    = DMA_MEMORY_TO_PERIPHERAL;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;dma_init_struct.priority     = DMA_PRIORITY_LOW;dma_init_struct.number       = len;dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init(DMA0, DMA_CH2, &dma_init_struct);/* configure DMA mode */dma_circulation_disable(DMA0, DMA_CH2);dma_memory_to_memory_disable(DMA0, DMA_CH2);spi_dma_enable(SPI0, SPI_DMA_TRANSMIT);dma_channel_enable(DMA0, DMA_CH2);while(!dma_flag_get(DMA0,DMA_CH2, DMA_FLAG_FTF));}

SPI DMA 收: 使用SPI2    DMA1 Channel 0

void SPI2_config(void)  //slave
{   rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_DMA1);rcu_periph_clock_enable(RCU_SPI2); /* SPI2 GPIO config: NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5  DMA */gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_5);gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_15);/* SPI2 parameter config */spi_parameter_struct spi_init_struct;spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;spi_init_struct.device_mode          = SPI_SLAVE;spi_init_struct.frame_size           = SPI_FRAMESIZE_16BIT;spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;spi_init_struct.nss                  = SPI_NSS_SOFT;spi_init_struct.prescale             = SPI_PSC_256;spi_init_struct.endian               = SPI_ENDIAN_MSB;spi_init(SPI2, &spi_init_struct);/* enable SPI2 */spi_enable(SPI2);
}void SPI2DMA1_config(void)  //DMA SLAVE
{rcu_periph_clock_enable(RCU_DMA1);  dma_parameter_struct dma_init_struct;/* SPI0 transmit dma config:DMA0-DMA_CH2  */dma_deinit(DMA1, DMA_CH0);dma_init_struct.periph_addr  = (uint32_t)(&SPI_DATA(SPI2));dma_init_struct.memory_addr  = (uint32_t)RECV;dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;dma_init_struct.priority     = DMA_PRIORITY_HIGH;dma_init_struct.number       = 6;dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init(DMA1, DMA_CH0, &dma_init_struct);/* configure DMA mode */dma_circulation_disable(DMA1, DMA_CH0);dma_memory_to_memory_disable(DMA1, DMA_CH0);dma_channel_disable(DMA1,DMA_CH0);
}void SPI2DMA1_read(uint16_t *buf, uint16_t len)
{dma_parameter_struct dma_init_struct;/* SPI0 transmit dma config:DMA0-DMA_CH2  */dma_deinit(DMA1, DMA_CH0);dma_init_struct.periph_addr  = (uint32_t)(&SPI_DATA(SPI2));dma_init_struct.memory_addr  = (uint32_t)buf;dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;dma_init_struct.priority     = DMA_PRIORITY_HIGH;dma_init_struct.number       = len;dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init(DMA1, DMA_CH0, &dma_init_struct);/* configure DMA mode */dma_circulation_disable(DMA1, DMA_CH0);dma_memory_to_memory_disable(DMA1, DMA_CH0);spi_dma_enable(SPI2, SPI_DMA_RECEIVE);dma_channel_enable(DMA1, DMA_CH0);while(!dma_flag_get(DMA1,DMA_CH0, DMA_FLAG_FTF));
//  for(int i=0;i<6;i++){
//      printf("%04x ",buf[i]);
//  }
//  printf("\r\n");
//  memset(buf,0,sizeof(buf));
}

GD32 SPI DMA收发相关推荐

  1. GD32F103配置SPI+DMA收发数据

      GD32是国产的32位单片机,它和STM32非常非常像,就连以前的库函数都差不多(现在从GD官网下载的库函数换了一种风格).配置SPI和DMA的方法和STM32差不多.   上图是DMA0各通道请 ...

  2. STM32F413 SPI+DMA接收错误(SCK时钟接收后一直存在)【后参考网上论坛及F4官方例程:收发同时进行】

    1:平台 STM32F413 + GD5F4(spi nand flash)(没开启DMA中断,读写操作NAND 都是单片机发起,所以知道什么时候读,什么时候写) 2: 问题(STM32 SPI+DM ...

  3. STM32 SPI+DMA 驱动 SRAM LY68L6400SLIT 应用笔记

    关键词:库函数,STM32F407,SPI+DMA ,SPI-DMA,SRAM , LY68L6400SLIT,STM32CubeMX 编 辑:大黄蜂 说明:本笔记记录 基于 STM32F407 + ...

  4. 两块STM32之间 SPI DMA通信

    @[两块STM32之间 SPI DMA通信] 这里讲的是两块STM32F407板子的互相通讯,折腾了3天,终于比较清楚了,特此记录. 两块板子互相通讯,除了SPI的接线,肯定还有其他信号线,必须注意这 ...

  5. W5100S SPI+DMA 中的片选信号处理

    最近在玩W5100S-L这个芯片. 使用SPI+DMA时,CPU在执行完DMA函数调用后会继续执行后续代码,而DMA的TC中断也并不是数据完全传完的时刻(而是最后一个数据放入缓存区后就TC中断),同时 ...

  6. stm32H7 SPI和SPI DMA时间差异对比

    偶然发现spi dma如果在单个字节速度会比spi模式慢很多, 因此做一个对比 SPI速度设置为16M 1 单个字节收发 SPI模式 可以看到每个字节的数据之间有不是连续的, 中间会有一段时间没有数据 ...

  7. GD32F303调试小记(二)之SPI(软件SPI、硬件SPI、硬件SPI+DMA)

    前言 目前有一个项目中用到了TFT-LCD,其驱动芯片为ILI9341.为更好的达到显示效果,在最终的代码中我们会使用单片机自带的硬件SPI+DMA模块(由于调试过程中SPI+DMA输出的波形没能驱屏 ...

  8. GD32E230 SPI DMA通信(读取传感器数据)

    一场疫情让公司的生意越来越好,忙得不可开交,产品大卖特卖.结果ST的单片机开始出现交期不稳定,供货慢,价格翻倍.无奈之下只好从国产单片机下手.于是就有了我的ST-GD的代码移植. 目录 一.SPI初始 ...

  9. STM32f407与STM32F103 串口采用DMA收发数据配置方法的异同

    最近有个项目需要用到STM32F407ZET6这款芯片,其中有一个串口收发数据的应用.因为之前有用过STMF32F103ZET6通过DMA收发数据的方案,所以我打算移植之前的代码实现这个功能,STM3 ...

最新文章

  1. python期末考试试题
  2. jsp分割字符串并遍历
  3. Linux的JVM可以从SUN网站上下载
  4. 数据智能知多少?(超大礼包等你拿)
  5. graph slam tutorial : 从推导到应用1
  6. android studio创建第一个安卓程序加载html5页面(一)
  7. 【kafka】kafka 查看 topic 详情的 几种 方法
  8. 如何用 Python 写 Excel 中 Vlookup 函数?
  9. IDEA 手动导入本地依赖包
  10. web文件上传(一)--文件上传与json上传区别及方法
  11. php中绘制长方体,php代码将常见的长方形图片修改为正方形的图片
  12. Linux中断函数堆栈,Linux在执行信号处理的过程中对堆栈的处理
  13. 适合 Java 新手的开源项目集合——在 GitHub 学编程
  14. font-style字体设置
  15. Excel 绘制正态概率图-正态性检验
  16. JAVA高并发学习笔记(二) 多线程基础
  17. 计算机与打印机未连接,win7系统无法打印提示似乎未连接打印机的恢复步骤
  18. python地产成本_Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(二)...
  19. 四象限运行模式_双向可控硅四象限触发方式介 - 双向可控硅四象限触发方式介绍_双向可控硅触发电路的设计...
  20. [数据结构与算法]输出1~10000中的对称数

热门文章

  1. ORACLE ERP的词汇表(ZT)
  2. C语言 | 函数实现比较大小
  3. Linux命令之中英文对照
  4. 最好的C#教程和参考书
  5. wps文档打不开该怎么修复呢?
  6. 搞笑类视频动画怎么制作?这个工具一定用得上 | 万彩动画大师
  7. LANG和NLS_LANG的区别
  8. 美国阿拉斯加大学Jeffrey T. Freymueller教授
  9. python数据分析案例(四):共享单车租用分析
  10. HTML基础学习笔记合集