CH32V307RCT6 SPI2初始化失败问题

     最近使用CH32V307RCT6单片机驱动MFRC522模块时出现SPI2初始化失败的情况。具体现象是 在MounRiverStudio中按F8快捷键下载程序,SPI2初始化正常。单片机断电后重新上电,SPI2初始化失败,再次初始化仍旧失败,调用NVIC_SystemReset();函数软重启后,SPI2初始化恢复正常。

代码如下:

int main(void)

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

SystemCoreClockUpdate();

Delay_Init();

MFRC522_Init();

wchUart3Init(1000000,true,false);//printf调试串口 波特率1M

    printf("SystemClk:%d\r\n",SystemCoreClock);

    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    printf("This is printf example\r\n");

u32 counter = 0;

    while(1)

    {

        Delay_Ms(500);

        printf("[M]This is App =%06d!\r\n",counter++);

        Delay_Ms(10);

        if(ReadRawRC (ModeReg) != 0x3D) //测试SPI2初始化是否成功,等于0x3D则为成功

        {

            printf("[M]MFRC522_Init()=%02X\r\n",ReadRawRC (ModeReg));

        }

    }

}

void MFRC522_Init(void)//接口初始化

{

    GPIO_InitTypeDef GPIO_InitStructure = {0};    

    SPI2_Init(SPI_CPOL_Low,SPI_CPHA_1Edge,SPI_BaudRatePrescaler_16);

    SPI_I2S_DeInit(SPI2);

    SPI2_Init(SPI_CPOL_Low,SPI_CPHA_1Edge,SPI_BaudRatePrescaler_16);

    wchGpioClockEnable(MFRC522_NCS_GPIO_PORT);

    GPIO_InitStructure.GPIO_Pin = MFRC522_NCS_GPIO_PIN;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(MFRC522_NCS_GPIO_PORT, &GPIO_InitStructure);


    wchGpioClockEnable(MFRC522_RST_GPIO_PORT);

    GPIO_InitStructure.GPIO_Pin = MFRC522_RST_GPIO_PIN;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(MFRC522_RST_GPIO_PORT, &GPIO_InitStructure);

    PcdReset();

    M500PcdConfigISOType ( 'A' );//设置工作方式

}


经过各种测试,发现加入红色加粗部分代码后可以解决此问题。至于出现这种现象的原因没有头绪,敬求解!

您好,SPI在初始化的时候注意将相关结构体清0,可参考下图试一下。调用SPI_I2S_DeInit函数也是使其恢复默认配置,正常初始化时候将其结构体清零即可,避免将随机值写入寄存器导致初始化失败。若修改后还有问题,可将完整程序发我邮箱(lzs@wch.cn)具体看一下。

image.png


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