使用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); } }
热门产品 :
CH32X035: 32位USB+USB PD单片机