打印

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

[复制链接]
2873|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 (68.73 KB )

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种模式都试过,无解,用模拟方法暂时代替,不知道哪里的坑。多谢!

使用特权

评论回复
5
键盘手没手| | 2019-10-31 18:51 | 只看该作者
硬件没问题的话,真不知哪里出问题了,反正肯定有问题,我看了半天,也不知道问题在哪。

使用特权

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

使用特权

评论回复
7
wsdmzz| | 2022-5-31 14:55 | 只看该作者
ppp_1978 发表于 2019-10-30 10:34
我也是服了,明明分析仪抓到miso上的数据对的,spi0的数据寄存器就读出来0xFF ...

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

使用特权

评论回复
8
johson4| | 2022-6-1 07:17 | 只看该作者
wsdmzz 发表于 2022-5-31 14:55
我的 GD32E23C8T6 也是这样 我真tm服了

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

见鬼似的,幽灵

使用特权

评论回复
9
阿aa雪| | 2022-6-21 15:54 | 只看该作者
我调试的GD32f303也出现了这种情况,在仿真状态下SPI读到的数据是随机的,但是通过采集波形数据是对的。。后来就把程序烧到芯片里面,不仿真了,通过打印观察数据是对的,,不知道什么情况

使用特权

评论回复
10
wsdmzz| | 2023-4-7 10:19 | 只看该作者
我的 问题是硬件问题  一直再复位状态  已经解决软件没问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

1

粉丝