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、实验现象,
主设备收数据对比从设备发数据,从设备收数据对比主设备发数据是否一致。