查看: 3520|回复: 7

[求助] RT1064如何通过网络魔法包唤醒?

[复制链接]

该用户从未签到

6

主题

18

帖子

0

注册会员

Rank: 2

积分
119
最后登录
2022-1-26
发表于 2021-5-25 13:33:39 | 显示全部楼层 |阅读模式
本帖最后由 lving 于 2021-5-25 13:33 编辑

1.根据手册将ENETn_ECR[SLEEP]  和 ENETn_ECR[MAGICEN] 两个位置位2.使能ENET唤醒中断,打开ENET中断
3.使用UDP向板卡发送魔法包
4. 网卡没有睡眠之前板卡能够接收到以太网帧, 但是调用ENET_EnableSleepMode(ENET,1);使网卡休眠后.EIR[WAKEUP]位不能够置位???
如何定位问题
               

int macsleep111(void)
{
        //ENET_EnableSleepMode(ENET,1);
        ENET->ECR |= (1 <<2 );
        ENET->ECR |= (1 <<3 );

        DisableIRQ(ENET_IRQn);       
        ENET_EnableInterrupts(ENET,ENET_ERR_INTERRUPT|kENET_WakeupInterrupt );                               
        NVIC_ClearPendingIRQ(ENET_IRQn);               
        NVIC_EnableIRQ(ENET_IRQn);
        EnableIRQ(ENET_IRQn);                                       
        LPM_EnableWakeupSource(ENET_IRQn);                               
        return 0;
}
MSH_CMD_EXPORT(macsleep111, wakeup_demo );

magic packet

magic packet

magic detect

magic detect

接收到的魔法包

接收到的魔法包
回复

使用道具 举报

  • TA的每日心情
    开心
    2025-6-10 23:03
  • 签到天数: 1502 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4688

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10080
    最后登录
    2025-7-2
    发表于 2021-5-25 17:57:29 | 显示全部楼层
    网口还能这么玩啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24866
    最后登录
    2025-7-18
    发表于 2021-5-27 11:23:53 | 显示全部楼层
    正在测试,请稍后
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    119
    最后登录
    2022-1-26
     楼主| 发表于 2021-5-27 14:03:15 | 显示全部楼层
    小恩GG 发表于 2021-5-27 11:23
    正在测试,请稍后

    官方驱动需要在这里
    #define ENET_ERR_INTERRUPT                                                                              \
      (kENET_BabrInterrupt | kENET_BabtInterrupt | kENET_EBusERInterrupt |
         kENET_LateCollisionInterrupt | \
         kENET_RetryLimitInterrupt | kENET_UnderrunInterrupt | kENET_PayloadRxInterrupt
        |kENET_WakeupInterrupt)
    加上唤醒中断kENET_WakeupInterrupt

    在初始化ENET配置唤醒中断后才会有错误中断处理,现在EIR[WAKEUP]能够正常置位,但是不能够唤醒,使用官方E:\01_auto_sample\SDK\boards\evkmimxrt1064\lwip_examples\lwip_httpsrv\freertos\mdk测试过了   




    int enetwakeup(void)
    {
        uint32_t freq;

        /* When wakeup from suspend, peripheral's doze & stop requests won't be cleared, need to clear them manually */
        IOMUXC_GPR->GPR4  = 0x00000000;
        IOMUXC_GPR->GPR7  = 0x00000000;
        IOMUXC_GPR->GPR8  = 0x00000000;
        IOMUXC_GPR->GPR12 = 0x00000000;

        CLOCK_SetMux(kCLOCK_UartMux, 1);
        CLOCK_SetDiv(kCLOCK_UartDiv, 0);

        DEBUG_MSG("\r\nCPU wakeup source 0x%x...\r\n", SRC->SRSR);
        APP_PrintRunFrequency(0);

        LPM_Init();       
        while (1)
        {
            freq = CLOCK_GetFreq(kCLOCK_CpuClk);
            DEBUG_MSG("\r\n########## Power Mode Switch Demo (build %s) ###########\n\r\n", __DATE__);
            DEBUG_MSG("    Core Clock = %dHz \r\n", freq);
            APP_ShowPowerMode(s_curRunMode);
                   
            s_targetPowerMode = LPM_PowerModeSysIdle;
            if (s_targetPowerMode <= LPM_PowerModeEnd)
            {
                /* If could not set the target power mode, loop continue. */
                if (!APP_CheckPowerMode(s_curRunMode, s_targetPowerMode))
                {
                    continue;
                }
                           
                            ENET_EnableInterrupts(ENET,kENET_WakeupInterrupt );                                //ʹ�ܴ����ж� �����ж�
                            NVIC_ClearPendingIRQ(ENET_IRQn);                //����Դ������
                            NVIC_EnableIRQ(ENET_IRQn);
                            EnableIRQ(ENET_IRQn);                                       
                            LPM_EnableWakeupSource(ENET_IRQn);                //ʹ�ܻ���Դ                       
                                   
                           
                            ENET->ECR |= (1 <<2 );
                            ENET->ECR |= (1 <<3 );
                           
                APP_PowerPreSwitchHook(s_targetPowerMode);
                APP_PowerModeSwitch(s_targetPowerMode);
                APP_PowerPostSwitchHook(s_targetPowerMode);
                           
                   
                            ENET_EnableSleepMode(ENET,0);// MAC�˳�����
            }
            IOMUXC_GPR->GPR4  = 0x00000000;
            IOMUXC_GPR->GPR7  = 0x00000000;
            IOMUXC_GPR->GPR8  = 0x00000000;
            IOMUXC_GPR->GPR12 = 0x00000000;

            DEBUG_MSG("\r\nNext loop\r\n");
        }
    }
    进入睡眠模式之前能够正常职位EIR[WAKEUP],  进入睡眠模式之后不能够唤醒



    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-5-28 05:36
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    2

    主题

    36

    帖子

    0

    注册会员

    Rank: 2

    积分
    153
    最后登录
    2025-5-20
    发表于 2021-6-30 17:20:56 | 显示全部楼层
    这个睡眠唤醒测试了没啥问题,NXP已经把中断转化成事件了,你不要自己写,用他的就行了,当然还得改点东西,这就像STM32的HAL库已经封装SysTick了就别自己写了,直接用HAL_Delay就好。但是这个睡眠监测了一下功耗,没节能呀,所以没啥用呀,也不知道结合MCU的电源管理节能的效果。
    干不完的事
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-5-28 05:36
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    2

    主题

    36

    帖子

    0

    注册会员

    Rank: 2

    积分
    153
    最后登录
    2025-5-20
    发表于 2021-6-30 17:31:34 | 显示全部楼层
    fengyun2018 发表于 2021-6-30 17:20
    这个睡眠唤醒测试了没啥问题,NXP已经把中断转化成事件了,你不要自己写,用他的就行了,当然还得改点东西 ...

    修正一下不是1064是1021
    干不完的事
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    119
    最后登录
    2022-1-26
     楼主| 发表于 2021-7-7 14:00:58 | 显示全部楼层
    fengyun2018 发表于 2021-6-30 17:31
    修正一下不是1064是1021

    现在使用1064确实没有测试出来,可否贡献以下1021代码?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-5-28 05:36
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    2

    主题

    36

    帖子

    0

    注册会员

    Rank: 2

    积分
    153
    最后登录
    2025-5-20
    发表于 2021-7-7 22:08:55 | 显示全部楼层
    lving 发表于 2021-7-7 14:00
    现在使用1064确实没有测试出来,可否贡献以下1021代码?

    也没几句,1、我看ENET_ERR_INTERRUPT一堆搞它也没啥用,就把它放到ENET_TS_INTERRUPT处理中了,先配置enet_config_t的中断事件类型,config.interrupt = ENET_RX_INTERRUPT;2、配置中断事件回调函数ethif.handle.callback=enet_event_callback_r;然后是函数的处理部分void enet_event_callback_r(ENET_Type *base, enet_handle_t *handle,  enet_event_t event,  enet_frame_info_t *frameInfo,  void *userData) {...};3、把ENET_ErrorIRQHandler中单独判断部分if (0U != ((uint32_t)kENET_WakeupInterrupt & base->EIR)){...}拷贝到ENET_ReceiveIRQHandler中,4、最后修改个BUG,它把你配置清除了(void)memset(handle, 0, sizeof(enet_handle_t));,需要在这句之前备份enet_callback_t callback_temp = handle->callback;然后在后面恢复handle->callback         = callback_temp;
    干不完的事
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 10:15 , Processed in 0.102335 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表