Ch32v307 spi问题

用了个官方spi1的例子,代码如下,从分析仪可以看到clk和mosi,但是不知为什么spi_cs信号始终为低

另外自己写了一个spi2的代码,SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET 这个条件始终不能满足,不知道是为什么

附件是spi1的时序图,cs信号始终为低

-----------------spi1的测试例程---------------------------------

void Test1()

{

    u8 i;


    SystemCoreClockUpdate();

    Delay_Init();

    USART_Printf_Init(115200);                                    //USART initialize

    printf("Test1\r\n");


    GPIO_InitTypeDef GPIO_InitStructure={0};

    SPI_InitTypeDef SPI_InitStructure={0};


    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );


    //cs

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure );


    //clk

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure );


    //miso

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure );


    //mosi

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure );


    SPI_SSOutputCmd( SPI1, ENABLE );

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPI1, &SPI_InitStructure );


    SPI_Cmd(SPI1, ENABLE );


    i = 0;

    while (1)

    {

        while (i<100)

        {

            if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE ) != RESET )

            {

                Delay_Us(10);

                SPI_I2S_SendData(SPI1, i);

                i++;

            }

        }

        i = 0;

    }



}

spiTest1.png

-----------------spi2的测试例程---------------------------------

void Test2()

{

    u8 i;

    SystemCoreClockUpdate();

    Delay_Init();

    USART_Printf_Init(115200);                                    //USART initialize


    printf("Test2\r\n");

    GPIO_InitTypeDef GPIO_InitStructure={0};

    SPI_InitTypeDef SPI_InitStructure={0};


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB1Periph_SPI2, ENABLE);


    //cs

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure );


    //clk

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure );


    //miso

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;  //MISO

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOB, &GPIO_InitStructure );


    //mosi

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure );


    SPI_SSOutputCmd(SPI2, ENABLE );


    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPI2, &SPI_InitStructure );


    SPI_Cmd(SPI2, ENABLE );


    i = 0;

    while (1)

    {

        while (i<100)

        {

            printf("get2\r\n");

            if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET )

            {//=========================================永远进入不了这里,条件始终不能满足

                SPI_I2S_SendData(SPI2, i);

                printf("send2\r\n");

                i++;

            }

            Delay_Ms(1000);

        }

        i = 0;

    }



}


您好,关于CS引脚拉低问题,SPI主从通信时,CS引脚拉低,选中设备开始进行通信,通信结束,CS引脚拉高。你这while循环中一直在进行通信,因此CS引脚为低电平。关于SPI2的测试,时钟配置有问题,SPI2应该调用RCC_APB1PeriphClockCmd函数使能开启SPI2时钟。

image.png


https://www.wch.cn/bbs/thread-106412-1.html

刚才看了这个帖子,感觉是用SPI_Cmd(SPI2, DISABLE );来结束通讯,这时候它就拉高了

等于spi是用这个enable和disable来控制片选了


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