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);


       }

 

 

 

  

posted @ 2025-09-02 19:41  小舟从此逝_1  阅读(41)  评论(0)    收藏  举报