使用芯片:GD32E503vct6,在调试spi时遇到一个比较奇怪的问题,在debug模式和首次下载程序下,spi可以正常工作,但是只要给板子重新上电,则spi的sck一直为低电平,mosi电平正常。spi配置如下:void LL_Spi_Init(void)
{
//GPIO CONFIG
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_SPI2);
//rcu_periph_clock_enable(RCU_AF);
/* SPI0 GPIO config:SCK/PB3, MISO/PB4, MOSI/PB5 */
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_3);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
//gpio_pin_remap_config(GPIO_SPI0_REMAP,ENABLE);
spi_parameter_struct spi_init_struct;
/* SPI0 parameter config */
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_LOW_PH_1EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_64;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI2, &spi_init_struct);
spi_enable(SPI2);
}
数据发送代码:uint8_t drv_spi_read_write_byte( uint8_t TxByte )
{
uint8_t l_Data = 0;
uint16_t l_WaitTime = 0;
while( RESET == spi_i2s_flag_get( SPI2, SPI_FLAG_TBE ) ) //等待发送缓冲区为空
{
if( SPI_WAIT_TIMEOUT == ++l_WaitTime )
{
break; //如果等待超时则退出
}
}
l_WaitTime = 0; //重新设置接收等待时间(因为SPI的速度很快,正常情况下在发送完成之后会立即收到数据,等待时间不需要过长)
spi_i2s_data_transmit(SPI2, TxByte); //发送数据
while( RESET == spi_i2s_flag_get( SPI2, SPI_FLAG_RBNE ) ) //等待接收缓冲区非空
{
if( SPI_WAIT_TIMEOUT == ++l_WaitTime )
{
break; //如果等待超时则退出
}
}
l_Data = spi_i2s_data_receive(SPI2); //读取接收数据
return l_Data; //返回
}
cs:使用的软件spi。
|