使用ch32v307的spi2做单线发送使用,发现软件cs波形在sck还没结束就提前变高了,感觉不正常
我在SPI_I2S_SendData之后while等待TXE和BUSY信号,等到他们都有效以后才退出发送函数,从现象上来看数据还没发完BUSY信号就已经有效了,这个BUSY信号不应该是发完数据以后才会有效吗?
请问如何解决这个问题?
这是波形图
void bsp_spi_config(void)
{
GPIO_InitTypeDef gpio_init_struct = {0};
SPI_APBxClock_FUN(SPI_CLK, ENABLE);
SPI_CS_APBxClock_FUN(SPI_CS_CLK, ENABLE);
SPI_SCK_APBxClock_FUN(SPI_SCK_CLK, ENABLE);
SPI_MOSI_APBxClock_FUN(SPI_MOSI_CLK, ENABLE);
gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
/* SCK */
gpio_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_init_struct.GPIO_Pin = SPI_SCK_PIN;
GPIO_Init(SPI_SCK_PORT, &gpio_init_struct);
/* MOSI */
gpio_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_init_struct.GPIO_Pin = SPI_MOSI_PIN;
GPIO_Init(SPI_MOSI_PORT, &gpio_init_struct);
/* CS */
gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_init_struct.GPIO_Pin = SPI_CS_PIN;
GPIO_Init(SPI_CS_PORT, &gpio_init_struct);
spi_init_struct.SPI_Direction = SPI_Direction_1Line_Tx;
spi_init_struct.SPI_Mode = SPI_Mode_Master;
spi_init_struct.SPI_DataSize = SPI_DataSize_8b;
spi_init_struct.SPI_CPOL = SPI_CPOL_High;
spi_init_struct.SPI_CPHA = SPI_CPHA_2Edge;
spi_init_struct.SPI_NSS = SPI_NSS_Soft;
spi_init_struct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
spi_init_struct.SPI_FirstBit = SPI_FirstBit_MSB;
spi_init_struct.SPI_CRCPolynomial = 7;
SPI_Init(SPIx, &spi_init_struct);
/* 使能 SPI */
SPI_Cmd(SPIx, ENABLE);
}
void bsp_spi_transmit(uint16_t byte)
{
SPI_I2S_SendData(SPIx, byte);
while((SPI2->STATR & SPI_I2S_FLAG_TXE) == RESET);
while((SPI2->STATR & SPI_I2S_FLAG_BSY) == SET);
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
printf("This is printf example\r\n");
bsp_spi_config();
while(1)
{
SPI_CS_LOW();
bsp_spi_transmit(0xaa);
bsp_spi_transmit(0xaa);
bsp_spi_transmit(0xaa);
bsp_spi_transmit(0xaa);
SPI_CS_HIGH();
Delay_Ms(1);
}
}
|