单片机GD32F303RCT6 (Macos环境)开发 (三十一)—— GD32 SPI主从实验 轮询模式

文章描述了一个使用GD32微控制器进行SPI接口的主从设备配置和全双工通信的实验。通过接线设置,SPI0作为主设备,SPI1作为从设备,采用硬件模式和SPI_PSC_16的时钟预分频率。在轮询模式下,主从设备交互发送和接收16字节的数据,并检查收发数据的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GD32 SPI主从实验 轮询模式

1、接线

  SPI0 PA4  PA5   PA6   PA7
  SPI1 PB12 PB14  PB14  PB15
  采用全双工模式
              SPI0               SPI1
      CS      PA4----------------PB12
      CLK	  PA5----------------PB13
      MISO    PA6----------------PB14
      MOSI    PA7----------------PB15

2、spi0 主设备设置

cs采用硬件模式,初始化代码如下:
void spi0_master_config(void)
{
    spi_parameter_struct spi_init_struct;

    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SPI0);
    rcu_periph_clock_enable(RCU_AF);

    /* SPI0 GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    /* PA4 as NSS */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);


    /* SPI 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_1EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_16; //速率
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);
    spi_enable(SPI0);
}

3、SPI1从设备设置

void spi1_slave_config(void)
{
	spi_parameter_struct spi_init_struct;
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_SPI1);
    rcu_periph_clock_enable(RCU_AF);

    /* SPI1 GPIO config:SCK/PB13, MISO/PB14, MOSI/PB15 */
    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
    /* PB12 as NSS */
    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12);

    /* SPI1 parameter config */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_SLAVE;
    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_HARD;
    spi_init_struct.prescale             = SPI_PSC_16; //速率
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI1, &spi_init_struct);

    //nvic_irq_enable(SPI1_IRQn,2,0);
    /* SPI int enable */
    // spi_i2s_interrupt_enable(SPI1, SPI_I2S_INT_TBE);
    //spi_i2s_interrupt_enable(SPI1, SPI_I2S_INT_RBNE);
    spi_enable(SPI1);
}

4、主设备跟从设备收发数据

void spi_master_slave_fullduplex_poll(void)
{
    uint8_t master_tx_buf[16] = {0};
    uint8_t master_rx_buf[16] = {0};
    uint8_t slave_tx_buf[16] = {0};
    uint8_t slave_rx_buf[16] = {0};
    
    for(uint8_t i = 0; i < 16; ++i)
    {
        master_tx_buf[i] = 0x20 + i;
        slave_tx_buf[i] = 0x10 + i;
    }
    
    printf("Master have sended : ");
    for(uint8_t i = 0; i < 16; ++i)
    {
        printf("%x ", master_tx_buf[i]);
    }
    printf("\r\n");
    
    printf("Slave have sended : ");
    for(uint8_t i = 0; i < 16; ++i)
    {
        printf("%x ", slave_tx_buf[i]);
    }
    printf("\r\n");

    for(uint8_t i = 0; i < 16; ++i)
    {
        while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
        spi_i2s_data_transmit(SPI1, slave_tx_buf[i]);
        while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
        spi_i2s_data_transmit(SPI0, master_tx_buf[i]);
        while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE));
        slave_rx_buf[i] = spi_i2s_data_receive(SPI1);
        while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
        master_rx_buf[i] = spi_i2s_data_receive(SPI0);
    }
    
    printf("Master received  : ");
    for(uint8_t i = 0; i < 16; ++i)
    {
        printf("%x ", master_rx_buf[i]);
    }
    printf("\r\n");
    
    printf("Slave received  : ");
    for(uint8_t i = 0; i < 16; ++i)
    {
        printf("%x ", slave_rx_buf[i]);
    }
    printf("\r\n");
}

5、实验现象,

主设备收数据对比从设备发数据,从设备收数据对比主设备发数据是否一致。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值