当前位置: 首页 > news >正文

GD32 SPI驱动代码

1.0 软件驱动NOR FLASH

MOSI:主机发送,从机接收

MISO:主机接收,从机发送

CS:表示的是片选信号


 2.0 宏定义各个引脚

// 片选
#define SET_SPI_NSS()		gpio_bit_set(GPIOE,GPIO_PIN_2)
#define CLR_SPI_NSS()		gpio_bit_reset(GPIOE_GPIO_PIN_2)// SPI引脚电平
#define SET_SPI_SCK()		gpio_bit_set(GPIOB,GPIO_PIN_13)
#define CLR_SPI_SCK()		gpio_bit_reset(GPIOB,GPIO_PIN_13)// 主机输出从机输出
#define READ_SPI_MISO() 	gpio_input_bit_get(GPIOB,CPIO_PIN_14)// 主机输出从机输入
#define SET_SPI_MOSI()		gpio_bit_set(GPIOB,GPIO_PIN_15)
#define CLR_SPI_MOSI()		gpio_bit_reset(GPIOB,GPIO_PIN_15)

3.0 SPI 初始化

static void SPI_Init(void)
{// GPIO 初始化GPIO_Init();// 片选信号设置为高电平SET_SPI_NSS();// 时钟信号设置为低电平CLR_SPI_SCK();}

NOR FLASH支持两种模式,此处使用的是模式0

4.0 SPI 起始信号和结束信号

// 起始信号:片选信号从高电平变为低电平
static void SPIStart(void)
{CLR_SPI_NSS();
}// 结束信号:片选信号从低电平变为高电平
static void SPIStop(void)
{SET_SPI_NSS();
}

5.0 SPI 读写字节

此处并没有使用延时,SPI总线的时钟频率是很快的,并且不需要额外的增加延时的函数

// SPI读写一个字节的数据
static uint8_t SPIReadWriteByte(uint8_t sendData)
{uint8_t rcvData = 0;uint8_t i = 0;for(i = 0; i < 8; i++){if((sendData & 0x80)){SET_SPI_MOSI();}else{CLR_SPI_MOSI();}sendData <<= 1;SET_SPI_SCK();rcvData <<= 1;rcvData |= READ_SPI_MISO();CLR_SPI_SCK();}return rcvData;
}

6.0 完整代码

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include "gd32f30x.h"
#include "delay.h"#define SET_SPI_NSS()		gpio_bit_set(GPIOE,GPIO_PIN_2)
#define CLR_SPI_NSS()		gpio_bit_reset(GPIOE,GPIO_PIN_2)#define SET_SPI_SCK()		gpio_bit_set(GPIOB,GPIO_PIN_13)
#define CLR_SPI_SCK()		gpio_bit_reset(GPIOB,GPIO_PIN_13)#define READ_SPI_MISO()     gpio_input_bit_get(GPIOB, GPIO_PIN_14) #define SET_SPI_MOSI()		gpio_bit_set(GPIOB,GPIO_PIN_15)
#define CLR_SPI_MOSI()		gpio_bit_reset(GPIOB,GPIO_PIN_15)static void GPIO_Init()
{// PE2片选SSrcu_periph_clock_enable(RCU_GPIOE);gpio_init(GPIOE,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);gpio_bit_set(GPIOE,GPIO_PIN_2);// PB13作为SCKrcu_periph_clock_enable(RCU_GPIOB);gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);gpio_bit_set(GPIOE,GPIO_PIN_2);// PB14作为MISOgpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_14);// PB15作为MOSIgpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_15);gpio_bit_set(GPIOB,GPIO_PIN_15);};static void SPI_Init(void)
{// GPIO 初始化GPIO_Init();// 片选信号设置为高电平SET_SPI_NSS();// 时钟信号设置为低电平CLR_SPI_SCK();	
}// 起始信号:片选信号从高电平变为低电平
static void SPIStart(void)
{CLR_SPI_NSS();
}// 结束信号:片选信号从低电平变为高电平
static void SPIStop(void)
{SET_SPI_NSS();
}// SPI读写一个字节的数据
static uint8_t SPIReadWriteByte(uint8_t sendData)
{uint8_t rcvData = 0;uint8_t i = 0;for(i = 0; i < 8; i++){if((sendData & 0x80)){SET_SPI_MOSI();}else{CLR_SPI_MOSI();}sendData <<= 1;SET_SPI_SCK();rcvData <<= 1;rcvData |= READ_SPI_MISO();CLR_SPI_SCK();}return rcvData;
}

http://www.lryc.cn/news/419715.html

相关文章:

  • Qgis 开发初级 《数据库和图层》
  • 三大机器学习框架对比:TensorFlow、PyTorch与Scikit-Learn
  • Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE
  • SpringCloud 微服务nacos和eureka
  • Java学习篇(一)| 如何生成分布式全局唯一ID
  • c++ 弹窗办法
  • 小程序使用this.animate实现3维动画切换
  • 【区块链+社会公益】第一反应互助急救链 | FISCO BCOS应用案例
  • leetcode 136. 只出现一次的数字
  • 可扩展架构设计:策略与最佳实践
  • 一图胜千言|图解Pandas常用操作!
  • ue5正确导入资源 content(内容),content只能有一个
  • HTTP协议基础知识【后端 4】
  • 2024/8/10 英语每日一段
  • 深入探索 Wireshark——网络封包分析的利器
  • VS2022使用.Net Framework4.0方法
  • 创建一个简单的贪吃蛇游戏:HTML、CSS和JavaScript教程
  • 全面讲解电子齿轮比与脉冲数计算
  • 音频进阶学习一——模拟信号和数字信号
  • SpringBoot企业人事管理系统-附源码与配套论文
  • 用window计算器实现定点数的十进制和二进制之间相互转换
  • 搬砖人2024年的智能工作伙伴 —— 4款思维导图软件种草集!
  • 【Python第三方库】Requests全面解析
  • 基于CNN的医学X-Ray图像分类全程解析
  • C++初学者指南-5.标准库(第二部分)--排序序列操作
  • matplotlib库学习之绘图透明度设置(精炼准确)
  • select多路复用(tcp通信)
  • STM32IIC与SPI详解
  • K8s第三节:k8s1.23.1升级为k8s1.30.0
  • .gitignore不生效的解决方案