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

Version 2

    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 */

           }

    }