GD32F330 硬件SPI CS过短问题

1. CS过短导致写SPI出现问题
  spi_i2s_data_transmit(SPI1, byte);
  while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));

LCD_CS是用户软件控制的芯片使能脚。
实际发送了1.5bit后,SPI_FLAG_TBE已置位。因此判断SPI_FLAG_TBE会导致 LCD_CS过短。
在这里插入图片描述

2. 改善
  while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
  spi_i2s_data_transmit(SPI1, byte);
  while(SET == spi_i2s_flag_get(SPI1, SPI_FLAG_TRANS)); //加此行,改善

在这里插入图片描述

3. 完整代码
void SPI1_SendByte(uint8_t byte)
{   
  while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
  spi_i2s_data_transmit(SPI1, byte);
  while(SET == spi_i2s_flag_get(SPI1, SPI_FLAG_TRANS));
}

uint8_t SPI1_ReadByte(uint8_t byte)
{  
  while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
  spi_i2s_data_transmit(SPI1, byte);
  while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE));
  return (uint8_t)spi_i2s_data_receive(SPI1);
}

void SPI1_SendBytes(const uint8_t *buf, uint16_t length)
{
  uint16_t i;
  
  for(i=0;i<length;i++)
  {
    while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
    spi_i2s_data_transmit(SPI1, buf[i]);
  }  
  while(SET == spi_i2s_flag_get(SPI1, SPI_FLAG_TRANS));
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是gd32f330spi主从配置的示例代码: 1.主机配置 ```c #include "gd32f3x0_spi.h" #include "gd32f3x0_gpio.h" #define SPI0_SCK_PIN GPIO_PIN_10 #define SPI0_MISO_PIN GPIO_PIN_11 #define SPI0_MOSI_PIN GPIO_PIN_12 #define SPI0_NSS_PIN GPIO_PIN_13 #define SPI0_PORT GPIOA void spi_master_init(void) { spi_parameter_struct spi_init_struct; rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_SPI0); gpio_init(SPI0_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, SPI0_SCK_PIN | SPI0_MOSI_PIN); gpio_init(SPI0_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, SPI0_MISO_PIN); gpio_init(SPI0_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SPI0_NSS_PIN); spi_struct_para_init(&spi_init_struct); spi_init_struct.device_mode = SPI_MASTER; spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; 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_8; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI0, &spi_init_struct); spi_enable(SPI0); } uint8_t spi_master_send_receive(uint8_t data) { while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)); spi_i2s_data_transmit(SPI0, data); while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)); return spi_i2s_data_receive(SPI0); } ``` 2.从机配置 ```c #include "gd32f3x0_spi.h" #include "gd32f3x0_gpio.h" #define SPI0_SCK_PIN GPIO_PIN_10 #define SPI0_MISO_PIN GPIO_PIN_11 #define SPI0_MOSI_PIN GPIO_PIN_12 #define SPI0_NSS_PIN GPIO_PIN_13 #define SPI0_PORT GPIOA void spi_slave_init(void) { spi_parameter_struct spi_init_struct; rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_SPI0); gpio_init(SPI0_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, SPI0_SCK_PIN | SPI0_MOSI_PIN); gpio_init(SPI0_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, SPI0_MISO_PIN); gpio_init(SPI0_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SPI0_NSS_PIN); spi_struct_para_init(&spi_init_struct); spi_init_struct.device_mode = SPI_SLAVE; spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; 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_8; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI0, &spi_init_struct); spi_enable(SPI0); } uint8_t spi_slave_send_receive(uint8_t data) { while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)); spi_i2s_data_transmit(SPI0, data); while (RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)); return spi_i2s_data_receive(SPI0); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值