ppp_1978 发表于 2019-10-29 22:26

GD32F130G8 SPI0数据读出全为0xFF,求助!

本帖最后由 ppp_1978 于 2019-10-29 22:30 编辑

   pa15 - CS,pb3 - pb5设置为SPI0读取外部设备,三个IO上用示波器都能看到数据,但是的spi0_data读出来始终为0xFF,硬件没有问题,同样使用这几个IO模拟SPI读写都没有问题,求帮助!
void    RCU_Init(void)
{
      rcu_periph_clock_enable(RCU_GPIOA);
      rcu_periph_clock_enable(RCU_GPIOB);
      rcu_periph_clock_enable(RCU_SPI0);
}

void    GPIO_Init(void)
{
gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,iCS_PinA15);      
gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_10MHZ,iCS_PinA15);

gpio_af_set(GPIOB,GPIO_AF_0,iSCK_PinB3|iMISO_PinB4|iMOSI_PinB5);      gpio_mode_set(GPIOB,GPIO_MODE_AF,GPIO_PUPD_NONE,iSCK_PinB3|iMISO_PinB4|iMOSI_PinB5);       gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,iSCK_PinB3|iMISO_PinB4|iMOSI_PinB5);
}

void    SPI0_Init(void)
{   
      spi_parameter_struct 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_HIGH_PH_2EDGE;
      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);
}


#define   uchar                   unsigned char
#define   SPI0_Enable()       gpio_bit_reset(GPIOA,iCS_PinA15)
#define   SPI0_Disable()      gpio_bit_set(GPIOA,iCS_PinA15)

void    SPI0_RegByte_Write(uchar addr_reg,uchar data_reg)
{
      SPI0_Enable();      

      while(spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) == 0);
      spi_i2s_data_transmit(SPI0,addr_reg);      
      while(spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE) == 0);
      spi_i2s_data_receive(SPI0);

      while(spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) == 0);
      spi_i2s_data_transmit(SPI0,data_reg);      
      while(spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE) == 0);
      spi_i2s_data_receive(SPI0);

      SPI0_Disable();
}   


uchar   SPI0_RegByte_Read(uchar addr_reg)
{
      uchar mSPI0_Temp;

      SPI0_Enable();      

      while(spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) == 0);
      spi_i2s_data_transmit(SPI0,addr_reg|0x80);      
      while(spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE) == 0);
      mSPI0_Temp    = spi_i2s_data_receive(SPI0);

      while(spi_i2s_flag_get(SPI0,SPI_FLAG_TBE) == 0);
      spi_i2s_data_transmit(SPI0);      
      while(spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE) == 0);
      mSPI0_Temp    = spi_i2s_data_receive(SPI0);

      ISPI0_Disable();

      return    mSPI0_Temp;
}



ppp_1978 发表于 2019-10-30 10:34

我也是服了,明明分析仪抓到miso上的数据对的,spi0的数据寄存器就读出来0xFF

lvben5d 发表于 2019-10-30 13:49

本帖最后由 lvben5d 于 2019-10-30 13:50 编辑

我给你发我试过OK的SPI驱动函数吧。 SPI 一般4种模式M0 M3会常用一些。 我的是F130芯片,但是你改F103库函数 行只都一样。
void spi0_sendbyte(u8 byte)
{      
      spi_i2s_data_send(SPI0, byte);      
      while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)) ;
}

u8 spi0_recvbyte()
{
      u8 byte=0xFF;
      spi_i2s_data_send(SPI0, byte);      
      while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)) {}
      return byte;
}

u8 spi0_sendrecvbyte(u8 byte)
{
      while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
      spi_i2s_data_send(SPI0, byte);      
      while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)) {}
      return spi_i2s_data_receive(SPI0);
}

ps: 你检查下SPI 模式是否符合器件支持的那两种。GD32的SPI是从索引0开始标

ppp_1978 发表于 2019-10-30 16:20

4种模式都试过,无解,用模拟方法暂时代替,不知道哪里的坑。多谢!

键盘手没手 发表于 2019-10-31 18:51

硬件没问题的话,真不知哪里出问题了,反正肯定有问题,我看了半天,也不知道问题在哪。

ppp_1978 发表于 2019-11-1 17:52

硬件应该是没问题,我估计还是配置有问题,总共用了spi0,usart0,usart1,timer0_pwm,timer2_pwm,timer13_pwm,结果spi0和timer0_pwm都没调试出来,晕死,其他都可以了

wsdmzz 发表于 2022-5-31 14:55

ppp_1978 发表于 2019-10-30 10:34
我也是服了,明明分析仪抓到miso上的数据对的,spi0的数据寄存器就读出来0xFF ...

我的 GD32E23C8T6 也是这样 我真tm服了

johson4 发表于 2022-6-1 07:17

wsdmzz 发表于 2022-5-31 14:55
我的 GD32E23C8T6 也是这样 我真tm服了

我模拟I2C 也遇到诡异读管脚的状态寄存器,跟实际的不一致!
同样的硬件板子,
GD32F103C8的,一直都可以,换了CB的,有时可以,有时不行,示波器抓波形解码,没问题!最终发现问题是,ASK信号,
整个时钟周期都是低电平,但死活读出一个高电平!

见鬼似的,幽灵

阿aa雪 发表于 2022-6-21 15:54

我调试的GD32f303也出现了这种情况,在仿真状态下SPI读到的数据是随机的,但是通过采集波形数据是对的。。后来就把程序烧到芯片里面,不仿真了,通过打印观察数据是对的,,不知道什么情况

wsdmzz 发表于 2023-4-7 10:19

我的 问题是硬件问题一直再复位状态{:sweat:}已经解决软件没问题
页: [1]
查看完整版本: GD32F130G8 SPI0数据读出全为0xFF,求助!