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);
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐