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;
}
我也是服了,明明分析仪抓到miso上的数据对的,spi0的数据寄存器就读出来0xFF 本帖最后由 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开始标
4种模式都试过,无解,用模拟方法暂时代替,不知道哪里的坑。多谢! 硬件没问题的话,真不知哪里出问题了,反正肯定有问题,我看了半天,也不知道问题在哪。 硬件应该是没问题,我估计还是配置有问题,总共用了spi0,usart0,usart1,timer0_pwm,timer2_pwm,timer13_pwm,结果spi0和timer0_pwm都没调试出来,晕死,其他都可以了 ppp_1978 发表于 2019-10-30 10:34
我也是服了,明明分析仪抓到miso上的数据对的,spi0的数据寄存器就读出来0xFF ...
我的 GD32E23C8T6 也是这样 我真tm服了 wsdmzz 发表于 2022-5-31 14:55
我的 GD32E23C8T6 也是这样 我真tm服了
我模拟I2C 也遇到诡异读管脚的状态寄存器,跟实际的不一致!
同样的硬件板子,
GD32F103C8的,一直都可以,换了CB的,有时可以,有时不行,示波器抓波形解码,没问题!最终发现问题是,ASK信号,
整个时钟周期都是低电平,但死活读出一个高电平!
见鬼似的,幽灵 我调试的GD32f303也出现了这种情况,在仿真状态下SPI读到的数据是随机的,但是通过采集波形数据是对的。。后来就把程序烧到芯片里面,不仿真了,通过打印观察数据是对的,,不知道什么情况 我的 问题是硬件问题一直再复位状态{:sweat:}已经解决软件没问题
页:
[1]