如何通过EZI2C从设备地址匹配唤醒深度睡眠下PSoC 6设备 - KBA227480

Version: **

 

SCB_EZI2C_PDL组件可以通过从设备地址匹配唤醒深度睡眠模式下的PSoC 6设备。为此,需要使能Enable Wakeup from Deep Sleep Mode参数。12分别展示了PSoC Creator 4.2ModusToolbox中所需的配置。

1. PSoC Creator 4.2中的配置

 

 

2. ModusToolbox Device Configurator中的配置

 

注意:只有一个SCB模块在深度睡眠下具有唤醒功能。可以通过参考PSoC 6数据手册Pinouts部分:Multiple alternate functions table DS(Deep Sleep)栏查找具有深度睡眠唤醒功能的SCB模块。

通过以下步骤使用cy_syspm驱动在进入深度睡眠之前注册Deep Sleep回调函数。

1.    参考以下数据域定义cy_stc_syspm_callback_params_t结构体。

·         void* cy_stc_syspm_callback_params_t::base -> HW实例的基地址。在API中匹配基地址为驱动的名称。

·         void* cy_stc_syspm_callback_params_t::context -> 回调函数可能会用到的环境参数,若不需要,将此项定义为NULL

2.    参考以下数据域定义cy_stc_syspm_callback_t结构体。

·         Cy_SysPmCallback cy_stc_syspm_callback_t::callback -> 回调处理函数(Cy_SCB_EZI2C_DeepSleepCallback)

·         cy_en_syspm_callback_type_t cy_stc_syspm_callback_t::type -> 深度睡眠枚举回调类型(CY_SYSPM_DEEPSLEEP

·         uint32_t cy_stc_syspm_callback_t::skipMode -> 回调函数执行过程中需要跳过的模式所对应的掩码。

·         cy_stc_syspm_callback_params_t* cy_stc_syspm_callback_t::callbackParams -> cy_stc_syspm_callback_params_t的地址;回调函数的执行所需要的参数。

·         struct cy_stc_syspm_callback* cy_stc_syspm_callback_t::prevItm -> 前一个列表项。此项定义为NULL

·         struct cy_stc_syspm_callback* cy_stc_syspm_callback_t::nextItm -> 后一个列表项。此项定义为NULL

3.    通过Cy_SysPm_RegisterCallback (cy_stc_syspm_callback_t * handler)注册回调函数。

4.    调用Cy_SysPm_CpuEnterDeepSleep (CY_SYSPM_WAIT_FOR_INTERRUPT)进入深度睡眠。当EZI2C地址匹配时会自动唤醒PSoC 6设备。

 

更多结构体和API的更多信息,请参考相关PDL文档。

 

 

参考代码:

cy_stc_syspm_callback_params_t  Cy_SCB_EZI2C_DeepSleepCallback_param =

   {

        sEzI2C_HW,

        NULL

   };

 

cy_stc_syspm_callback_t Cy_SCB_EZI2C_DeepSleepCallback_elements =

   {

       &Cy_SCB_EZI2C_DeepSleepCallback,

 

       CY_SYSPM_DEEPSLEEP,

    0U,

       &Cy_SCB_EZI2C_DeepSleepCallback_param,

       NULL,

       NULL

   };

 

 

int main(void)

{

   if (true != Cy_SysPm_RegisterCallback(&Cy_SCB_EZI2C_DeepSleepCallback_elements))

       {

        /* Insert error handling */

       }

  

   if (CY_SYSPM_SUCCESS != Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT))

       {        

        /* Insert error handling */

       }

}