GD32学习笔记:标准库SPI配置
·
1.头文件
#include "gd32e50x_rcu.h"
#include "gd32e50x_gpio.h"
#include "gd32e50x_spi.h"
2.SPI初始化函数
- 注意:在DG32 SPI头文件里面 spi定义为0.1.2
/* SPI0初始化函数 */
void SPI0_Init(void)
{
spi_parameter_struct spi_init_struct;
/* 1. 使能时钟 */
rcu_periph_clock_enable(RCU_GPIOA); // SPI1引脚时钟
rcu_periph_clock_enable(RCU_SPI0); // SPI1外设时钟
/* 2. 配置GPIO */
// SCK(PA5)和MOSI(PA7): 复用推挽输出
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
// MISO(PA6): 浮空输入
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
/* 3. 配置SPI参数 */
spi_struct_para_init(&spi_init_struct);
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; // 全双工模式
spi_init_struct.device_mode = SPI_MASTER; // 主机模式
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; // 8位数据
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; // 时钟模式0
spi_init_struct.nss = SPI_NSS_SOFT; // 软件NSS
spi_init_struct.prescale = SPI_PSC_2; // 2分频
spi_init_struct.endian = SPI_ENDIAN_MSB; // MSB优先
spi_init(SPI0, &spi_init_struct);
/* 4. 禁用TI模式 */
spi_ti_mode_disable(SPI0);
/* 5. 禁用CRC */
spi_crc_polynomial_set(SPI0, 10);
spi_crc_off(SPI0);
/* 6. 使能SPI */
spi_enable(SPI0);
}
/* SPI1初始化函数 */
void SPI1_Init(void)
{
spi_parameter_struct spi_init_struct;
/* 1. 使能时钟 */
rcu_periph_clock_enable(RCU_GPIOB); // SPI2引脚时钟
rcu_periph_clock_enable(RCU_SPI2); // SPI2外设时钟
/* 2. 配置GPIO */
// SCK(PB13)和MOSI(PB15): 复用推挽输出
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);
// MISO(PB14): 浮空输入
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
/* 3. 配置SPI参数 */
spi_struct_para_init(&spi_init_struct);
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_1EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_2;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI1, &spi_init_struct);
/* 4. 禁用TI模式 */
spi_ti_mode_disable(SPI1);
/* 5. 禁用CRC */
spi_crc_polynomial_set(SPI1, 10);
spi_crc_off(SPI1);
/* 6. 使能SPI */
spi_enable(SPI1);
}
/* SPI2初始化函数 */
void SPI2_Init(void)
{
spi_parameter_struct spi_init_struct;
/* 1. 使能时钟 */
rcu_periph_clock_enable(RCU_GPIOB); // SPI3引脚时钟
rcu_periph_clock_enable(RCU_SPI2); // SPI3外设时钟
/* 2. 配置GPIO */
// SCK(PB3)和MOSI(PB5): 复用推挽输出
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_5);
// MISO(PB4): 浮空输入
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
/* 3. 配置SPI参数 */
spi_struct_para_init(&spi_init_struct);
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_1EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_2;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI2, &spi_init_struct);
/* 4. 禁用TI模式 */
spi_ti_mode_disable(SPI2);
/* 5. 禁用CRC */
spi_crc_polynomial_set(SPI2, 10);
spi_crc_off(SPI2);
/* 6. 使能SPI */
spi_enable(SPI2);
}
/* SPI0反初始化 */
void SPI0_DeInit(void)
{
/* 禁用SPI */
spi_disable(SPI0);
/* 禁用时钟 */
rcu_periph_clock_disable(RCU_SPI0);
/* 复位GPIO */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,
GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
}
/* SPI1反初始化 */
void SPI1_DeInit(void)
{
spi_disable(SPI1);
rcu_periph_clock_disable(RCU_SPI1);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,
GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
}
/* SPI2反初始化 */
void SPI2_DeInit(void)
{
spi_disable(SPI2);
rcu_periph_clock_disable(RCU_SPI2);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,
GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
}
3.反初始化函数
/* SPI1反初始化 */
void SPI1_DeInit(void)
{
/* 禁用SPI */
spi_disable(SPI1);
/* 禁用时钟 */
rcu_periph_clock_disable(RCU_SPI1);
/* 复位GPIO */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,
GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
}
/* SPI2反初始化 */
void SPI2_DeInit(void)
{
spi_disable(SPI2);
rcu_periph_clock_disable(RCU_SPI2);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,
GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
}
/* SPI3反初始化 */
void SPI3_DeInit(void)
{
spi_disable(SPI3);
rcu_periph_clock_disable(RCU_SPI3);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,
GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
}
4.通用数据传输函数 (通用SPI传输函数)
/* SPI数据传输函数 */
uint8_t SPI_Transfer(SPI_TypeDef* spi, uint8_t tx_data)
{
/* 等待发送缓冲区空 */
while(spi_i2s_flag_get(spi, SPI_FLAG_TBE) == RESET);
/* 发送数据 */
spi_i2s_data_transmit(spi, tx_data);
/* 等待接收完成 */
while(spi_i2s_flag_get(spi, SPI_FLAG_RBNE) == RESET);
/* 返回接收数据 */
return spi_i2s_data_receive(spi);
}
更多推荐

所有评论(0)