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

[复制链接]
3692|9
 楼主| ppp_1978 发表于 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;
}



 楼主| ppp_1978 发表于 2019-10-30 10:34 来自手机 | 显示全部楼层
我也是服了,明明分析仪抓到miso上的数据对的,spi0的数据寄存器就读出来0xFF
15724028085584937092014720375352.jpg
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 | 显示全部楼层
我的 问题是硬件问题  一直再复位状态  已经解决软件没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

1

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