最近使用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' );//设置工作方式
}
经过各种测试,发现加入红色加粗部分代码后可以解决此问题。至于出现这种现象的原因没有头绪,敬求解!