CH32V307的SPI单线发送波形异常

使用ch32v307的spi2做单线发送使用,发现软件cs波形在sck还没结束就提前变高了,感觉不正常


我在SPI_I2S_SendData之后while等待TXE和BUSY信号,等到他们都有效以后才退出发送函数,从现象上来看数据还没发完BUSY信号就已经有效了,这个BUSY信号不应该是发完数据以后才会有效吗?


请问如何解决这个问题?


这是波形图

image.png


初始化和发送代码是这样的

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);
    }
}



您好,如下图,按照我的理解,发送时要经过一个移位寄存器,无论是TXE还是BSY,应该都只是对Tx buffer的判断,当Tx buffer为空时,标志位生效,但数据的传输还要经过移位寄存器,因此CS被拉高之后还会有一段数据在传输,可以在拉高之前加个2us左右延时试一下。

image.png


喔喔这样啊,那我抽空试试


只有登录才能回复,可以选择微信账号登录