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

[复制链接]
156|5
 楼主 | 2019-10-29 22:26 | 显示全部楼层 |阅读模式
本帖最后由 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;
}



使用特权

评论回复
 楼主 | 2019-10-30 10:34 | 显示全部楼层
我也是服了,明明分析仪抓到miso上的数据对的,spi0的数据寄存器就读出来0xFF
15724028085584937092014720375352.jpg

使用特权

评论回复
| 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开始标

使用特权

评论回复
 楼主 | 2019-10-30 16:20 | 显示全部楼层
4种模式都试过,无解,用模拟方法暂时代替,不知道哪里的坑。多谢!

使用特权

评论回复
| 2019-10-31 18:51 | 显示全部楼层
硬件没问题的话,真不知哪里出问题了,反正肯定有问题,我看了半天,也不知道问题在哪。

使用特权

评论回复
 楼主 | 2019-11-1 17:52 | 显示全部楼层
硬件应该是没问题,我估计还是配置有问题,总共用了spi0,usart0,usart1,timer0_pwm,timer2_pwm,timer13_pwm,结果spi0和timer0_pwm都没调试出来,晕死,其他都可以了

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表