qq_37405325
qq_37405325
采纳率50%
2021-05-13 20:13 阅读 68

GD32替换STM32F103芯片过程中,SPI通讯数据出现问题

50

产品开发中,将STM32F103芯片换成GD32的芯片,但是依然是STM32的工程,其中#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)替换为#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)

发现 CAN和串口通讯正常,但是SPI通讯异常,异常如下:
1、 SPI连续发送2个数据(u8),但是从示波器上看,发送的数据相反了,而且每个数据都左移了一位,数据接收还没有验证。
2、关于STM32工程中SPI的配置如下:
GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;
 
    RCC_APB1PeriphClockCmd(    RCC_APB1Periph_SPI2, ENABLE );    
    RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB, ENABLE );    
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_Out_PP;                                                       
    GPIO_InitStructure.GPIO_Speed    = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_AF_PP;                                                         
    GPIO_InitStructure.GPIO_Speed    = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_IPU;                                                             
    GPIO_InitStructure.GPIO_Speed    = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_AF_PP;                                                         
    GPIO_InitStructure.GPIO_Speed    = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    SPI_InitStructure.SPI_Direction                 = SPI_Direction_2Lines_FullDuplex;        // 
    SPI_InitStructure.SPI_Mode                             = SPI_Mode_Master;                                        
    SPI_InitStructure.SPI_DataSize                     = SPI_DataSize_8b;                                        // 
    SPI_InitStructure.SPI_CPOL                             = SPI_CPOL_Low;                                               
    SPI_InitStructure.SPI_CPHA                             = SPI_CPHA_1Edge;                                           
    SPI_InitStructure.SPI_NSS                             = SPI_NSS_Soft;                                                
    SPI_InitStructure.SPI_BaudRatePrescaler    = SPI_BaudRatePrescaler_256;//SPI_BaudRatePrescaler_32;                        // 
    SPI_InitStructure.SPI_FirstBit                     = SPI_FirstBit_MSB;                                        // 
    //SPI_InitStructure.SPI_CRCPolynomial         = 7;                                                                // 
    SPI_Init(SPI2, &SPI_InitStructure);                                                                                      // 
 
    SPI_Cmd(SPI2, ENABLE);     

  • 点赞
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • soar3033 soar3033 2021-05-18 14:15

    GD32 在使用SPI 时,IO 的配置必须严格遵守主从模式下的输入与输出配置,而STM32 无此要求,相关代码如下:主机模式下IO 配置(主机以SPI 为例):

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    从机模式下IO 配置(从机以SPI2 为例):

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;

    GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;

    GPIO_Init(GPIOB,&GPIO_InitStructure);

     在GD32 的SPI 的时钟信号,空闲状态需要配置成高电平,以保证数据的稳定性,具体代码如下

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPI1, &SPI_InitStructure);

    当作为从机时,在GD32 中,时钟信号必须为8 的整数倍。

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPI1, &SPI_InitStructure);

     在GD32 中,不能使用SPI_I2S_FLAG_BSY 该位来判断SPI 总线数据是否接收或发送完成。

    点赞 评论 复制链接分享

相关推荐