打印
[单片机芯片]

CH32V307的SPI单线发送波形异常

[复制链接]
40|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用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);
    }
}


使用特权

评论回复
沙发
呐咯密密|  楼主 | 2024-10-9 16:32 | 只看该作者
解答如下:
发送时要经过一个移位寄存器,无论是TXE还是BSY,应该都只是对Tx buffer的判断,当Tx buffer为空时,标志位生效,但数据的传输还要经过移位寄存器,因此CS被拉高之后还会有一段数据在传输,可以在拉高之前加个2us左右延时试一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

467

主题

3669

帖子

47

粉丝