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

目录

  • 一、SPI初始化
  • 二、DMA配置
  • 三、读取数据

一、SPI初始化

/************************************************
函数名称 : rcu_config
功    能 : RCU时钟配置
参    数 : 无
返 回 值 : 无
作    者 : Mico
*************************************************/
void rcu_config(void)
{rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_DMA);rcu_periph_clock_enable(RCU_SPI0);
}
/************************************************
函数名称 : gpio_config
功    能 : SPI映射GPIO初始化
参    数 : 无
返 回 值 : 无
作    者 : Mico
*************************************************/
void gpio_config(void)
{rcu_config();/* SPI0 GPIO config: SCK/PA5, MISO/PA6, MOSI/PA7 */gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);gpio_bit_reset(GPIOB,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);gpio_bit_set(GPIOA,GPIO_PIN_15);//拉低片选
}
/************************************************
函数名称 : spi_config
功    能 : SPI 初始化
参    数 : 无
返 回 值 : 无
作    者 : Mico
*************************************************/
void spi_config(void)
{spi_parameter_struct spi_init_struct;/* deinitilize SPI and the parameters */spi_i2s_deinit(SPI0);spi_struct_para_init(&spi_init_struct);/* SPI0 parameter config */spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;spi_init_struct.device_mode          = SPI_MASTER;spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;spi_init_struct.nss                  = SPI_NSS_SOFT;spi_init_struct.prescale             = SPI_PSC_8;spi_init_struct.endian               = SPI_ENDIAN_MSB;spi_init(SPI0, &spi_init_struct);}

GD32的SPI配置和ST的方式差不多,区别就在于库函数的封装方式不同。

二、DMA配置

/************************************************
函数名称 : dma_config
功    能 : SPI DMA初始化
参    数 : 无
返 回 值 : 无
作    者 : Mico
*************************************************/
void dma_config(void)
{dma_parameter_struct  dma_init_struct;dma_struct_para_init(&dma_init_struct);/* SPI0 transmit dma config */dma_deinit(DMA_CH2);   dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);//外设基地址dma_init_struct.memory_addr = (uint32_t)SPI_TX_BUF ;//内存基地址dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;   //数据传输方向:内存到外设dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;//外设数据宽度8位dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;   //内存数据宽度8位dma_init_struct.priority = DMA_PRIORITY_HIGH;           //DMA通道传输软件优先级dma_init_struct.number = ARRAYSIZE;                     //DMA通道数据传输数量dma_init_struct.periph_inc =  DMA_PERIPH_INCREASE_DISABLE;//外设地址生成算法模式使能dma_init_struct.memory_inc =  DMA_MEMORY_INCREASE_ENABLE;//存储器地址生成算法模式失能dma_init(DMA_CH2, &dma_init_struct);                     //初始化DMA通道2
//  dma_circulation_enable(DMA_CH2);                         //DMA循环模式使能/* SPI0 receive dma config */dma_deinit(DMA_CH1);dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);dma_init_struct.memory_addr = (uint32_t)spi0_receive_array;dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;dma_init_struct.priority = DMA_PRIORITY_MEDIUM;dma_init(DMA_CH1, &dma_init_struct);
//    dma_circulation_enable(DMA_CH1);
}

三、读取数据

/************************************************
函数名称 : SPI_DMA_WriteReadByte
功    能 : SPI DMA读取角度
参    数 : 无
返 回 值 : 无
作    者 : Mico
*************************************************/
void SPI_DMA_WriteReadByte(void)
{   GPIO_BC (GPIOA) = (uint32_t)GPIO_PIN_15;SPI_CTL1(SPI0) |= (uint32_t)SPI_CTL1_DMATEN; /*SPI DMA发送使能*/SPI_CTL1(SPI0) |= (uint32_t)SPI_CTL1_DMAREN;/*SPI DMA接收使能*/DMA_CHCTL(DMA_CH2) &= ~DMA_CHXCTL_CHEN;     /*失能DMA通道2*/DMA_CHCNT(DMA_CH2) = ARRAYSIZE ;            /*传输长度*/DMA_CHCTL(DMA_CH2) |= DMA_CHXCTL_CHEN;      /*使能DMA通道2*/dma_channel_disable(DMA_CH1);               /*失能DMA通道2*/
//  DMA_CHCTL(DMA_CH1) &= ~DMA_CHXCTL_CHEN;DMA_CHCNT(DMA_CH1) = ARRAYSIZE ;            /*传输长度*/
//  DMA_CHCTL(DMA_CH1) |= DMA_CHXCTL_CHEN;dma_channel_enable(DMA_CH1);                /*使能DMA通道2*/while(RESET == dma_flag_get(DMA_CH2,DMA_FLAG_FTF));while(RESET == dma_flag_get(DMA_CH1,DMA_FLAG_FTF));GPIO_BOP(GPIOA) = (uint32_t)GPIO_PIN_15;}

依旧是ST的那个味道,一开始我用GD给的例程写的SPI通信,发现数据只能读取一次。最后还是用ST的那个思想,先失能DMA通道,再重新定义数据长度,再使能DMA通道。因为我SPI的发送和接收都是使用DMA方式,所以使用了两个通道。通道2的发送和通道1的接收。PA15是SPI的使能引脚。

GD32E230 SPI DMA通信(读取传感器数据)相关推荐

  1. 两块STM32之间 SPI DMA通信

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

  2. SPI中断方式读取MPU6500数据

    学习背景 MPU6500是MPU6050的升级版同时支持IIC和SPI通讯协议:IIC协议相对于SPI协议读取速率更低,并且在STM32的平台下硬件IIC存在更多地不确定性.因此选择采用SPI的方式读 ...

  3. arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据

    撑腰会儿:I2C通信协议介绍​zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...

  4. 多传感器融合定位(GPS+Wheel+camera)(1)-读取传感器数据

    多传感器融合定位(GPS+Wheel+camera)(1)-读取传感器数据 文章目录 1.读取Kaist数据集到融合系统中 1.读取Kaist数据集到融合系统中 int main(int argc, ...

  5. WebServer应用示例2:Siri语音识别读取传感器数据 | ESP32轻松学(Arduino版)

    本系列历史文章目录: ESP32 概述与 Arduino 软件准备 ESP32与掌控板IO接口编程入门 蓝牙翻页笔(PPT 控制器) B 站粉丝计数器 Siri 语音识别控制 LED 灯 Siri 语 ...

  6. 用Arduino玩转掌控板(ESP32):Siri语音识别读取传感器数据→WebServer应用示例2

    众所周知,掌控板在创客教育中用的非常广泛,它是一块基于 ESP32 的学习开发板.大家对掌控板编程,用的比较多的都是图形化编程的方式,比如 mPython.Mind+ 等.但是,既然掌控板是基于 ES ...

  7. 用GPIO模拟SPI接口读取传感器数据

    本文基于平头哥开发板RVB2601,简要介绍了用GPIO模拟SPI时序逻辑,实现SPI协议,按照特定温度传感器的时序,读取其数据,及示例程序 一.概述 SPI(Serial Peripheral In ...

  8. STM32F4对使用rs485通信的传感器数据读取

    一.目的 最近在基于stm32f407的项目中应用了很多使用RS485进行通信的传感器设备,连接成485组网后需要进行数据的读写,在这里将一些过程写下,希望有需要的人能有个借鉴. 二.传感器说明 本次 ...

  9. 基于uFUN开发板的心率计(一)DMA方式获取传感器数据

    前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...

最新文章

  1. 一篇论文摘要计算机英语,推荐:计算机毕业论文英文摘要的写作方法
  2. 新能源汽车:大变革催生十万亿市场空间
  3. IOS上路_07-简单示例-电子书
  4. node环境下express路由,
  5. webpack window 添加第三方库
  6. 进制问题:m进制转n进制,m进制转十进制,十进制转n进制
  7. CG-CTF-Web-单身一百年
  8. 原生态基于OpenCV图像处理软件开发
  9. 七牛云php20m文件上传不了,七牛云存储 - 用php上传图片,我在本地测试,用php 接口,不成功...
  10. 如何在Global.asax中判断是否是ajax请求
  11. WebStorm 预览时把浏览器地址localhost 改成IP
  12. 6-9 统计个位数字 (15 分)
  13. FFmpeg之yuv镜像(十八)
  14. 批处理(bat)choice命令详解
  15. Jave_erhui
  16. 树莓派安装OpenCV - 亲测可用
  17. 科学计算机r系数的操作,R语言实现Fleiss’ Kappa系数处理多个观察者一致性检验...
  18. Be For Web
  19. 记:《洛克菲勒留给儿子的38封信》-- 8
  20. vue 中 vue-print-nb 表格打印不全的问题

热门文章

  1. onDestroy 延时10s调用
  2. mysql驱动源码解析_mysql驱动源码分析
  3. 天猫5月都有哪些大活动? 我们抢先看
  4. selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cooki
  5. 11.Go语言干货-结构体
  6. echarts入门 堆叠折线图
  7. python中type,dtype,asdtype的作用与使用
  8. matlab矩阵与数组的应用
  9. BUUCTF Misc 黑客帝国 [MRCTF2020]你能看懂音符吗 [HBNIS2018]caesar [HBNIS2018]低个头
  10. OPC UA技术通俗理解、案例体验