CH58x 模拟卡低功耗模式下使用
一、前言
CH585/CH584有NFC功能,支持模拟卡的功能。这里的模拟卡是有源的需要工作的时候需要给mcu供电。
有些场景需要实现低功耗的场景,需要手机靠近时唤醒模拟卡实现读卡的功能,在非低功耗模式下模拟卡才能正常运行。
二、实现流程
在读卡器靠近时天线上会有信号耦合,这时候NFCI引脚会产生电平变化。这里就是第一步将NFCI这个IO设置成中断上升沿唤醒。写了两个标志一个用来退出睡眠的,一个用来启动模拟卡的任务。
当然这边怎么处理完全按照自己的场景应用场景来就可以了。
void gpiob_wakeup_test(void) { GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PD); GPIOB_ITModeCfg(GPIO_Pin_9, GPIO_ITMode_RiseEdge); PFIC_EnableIRQ(GPIO_B_IRQn); PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); } __INTERRUPT __HIGH_CODE void GPIOB_IRQHandler(void) { if(GPIOB_ReadITFlagBit(GPIO_Pin_9)) { flsh_gpio = GPIOB_ReadITFlagPort(); GPIOB_ClearITFlagBit(GPIO_Pin_9); picc_wakeup_flag = 1; block_sleep_flag = 1; PFIC_DisableIRQ(GPIO_B_IRQn); } }
在写完标志唤醒完之后就要开始模拟卡了,这里直接调用的模拟卡例程的流程。10s后重新睡眠。
__HIGH_CODE __attribute__((noinline)) void Main_Circulation() { while(1) { if(picc_wakeup_flag == 1) { tmos_start_task(Peripheral_TaskID, PICC_TEST_EVT, 320); picc_wakeup_flag = 0; PRINT("picc:%d\r\n",picc_wakeup_flag); PRINT("block:%d\r\n",block_sleep_flag); } TMOS_SystemProcess(); } }
if(events & PICC_TEST_EVT)
{
tmos_start_task(Peripheral_TaskID, PICC_STOP_EVT, 16000);
nfca_picc_init();
PRINT("nfca_picc_init ok\n");
nfca_picc_t2t_enable(uid);
nfca_picc_start();
PRINT("wait pcd\n");
PRINT("block_sleep_flag %02x",block_sleep_flag);
return (events ^ PICC_TEST_EVT);
}
if(events & PICC_STOP_EVT)
{
nfca_picc_stop();
tmos_stop_task(Peripheral_TaskID, PICC_TEST_EVT);
block_sleep_flag = 0;
PRINT("block_sleep_flag1 %02x",block_sleep_flag);
return (events ^ PICC_STOP_EVT);
}
再在睡眠之后重新配置gpio唤醒,推出睡眠也是在这里处理sleep.c中。
if(block_sleep_flag == 1) { return 0; } // 提前唤醒 if (time <= WAKE_UP_RTC_MAX_TIME) { time_tign = time + (RTC_MAX_COUNT - WAKE_UP_RTC_MAX_TIME); } else { time_tign = time - WAKE_UP_RTC_MAX_TIME; } SYS_DisableAllIrq(&irq_status); if (block_sleep_flag == 0) { // nfca_picc_stop(); //GPIOBDigitalCfg(ENABLE,GPIO_Pin_9); // R32_PIN_IN_DIS &=~((GPIO_Pin_8 | GPIO_Pin_9) << 16); GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PD); GPIOB_ITModeCfg(GPIO_Pin_9, GPIO_ITMode_RiseEdge); GPIOB_ClearITFlagBit(GPIO_Pin_9); PFIC_EnableIRQ(GPIO_B_IRQn); }
浙公网安备 33010602011771号