CH583M可以模拟PC睡眠时向键盘设备发送的睡眠包吗

 下面是PC在睡眠的时候通过USB给键盘设备发送的包:

Screenshot-2a5758b2-0f6f-40da-b2bb-bc91c68d6a46.png

我使用583的USB的接口程序尝试下发这段DATA 结果返回了0x20的错误码,使用程序为:

/*********************************************************************

 * @fn      CtrlGetU2DeviceDescr

 *

 * @brief   获取设备描述符,返回在 pHOST_TX_RAM_Addr 中

 *

 * @param   none

 *

 * @return  ERR_USB_BUF_OVER    描述符长度错误

 *          ERR_SUCCESS         成功

 */

uint8_t CtrlGetU2DeviceDescr(void)

{

    uint8_t s;

    uint8_t len;


    Usb2DevEndp0Size = DEFAULT_ENDP0_SIZE;

    CopyU2SetupReqPkg((uint8_t *)SetupGetU2DevDescr);

    s = U2HostCtrlTransfer(U2Com_Buffer, &len); // 执行控制传输

    if(s != ERR_SUCCESS)

        return (s);

    Usb2DevEndp0Size = ((PUSB_DEV_DESCR)U2Com_Buffer)->bMaxPacketSize0; // 端点0最大包长度,这是简化处理,正常应该先获取前8字节后立即更新UsbDevEndp0Size再继续

    if(len < ((PUSB_SETUP_REQ)SetupGetU2DevDescr)->wLength)

        return (ERR_USB_BUF_OVER); // 描述符长度错误

    return (ERR_SUCCESS);

}


求助是否调用正确,PC下发的睡眠包是否正确

您好,主机挂起从机,本质上来讲是电信号,跟发包无关,需要主机将总线置空闲状态持续3ms。对于全速设备来说,空闲状态是D+保持高电平,D-保持低电平。注意默认启用了SOF自动生成的功能,也要关闭,否则总线上持续自动生成帧起始包,从机一旦发现电平信号变化,是立即退出挂起的。

您可以使用下面的代码块挂起从机。测试代码使用了USB2接口,若使用USB1接口,可以把寄存器名中的‘2’删去。

R8_U2H_SETUP &= ~RB_UH_SOF_EN;      //关闭帧起始包自动生成

R8_USB2_CTRL &= ~MASK_UC_SYS_CTRL;

R8_USB2_CTRL |= 0x20;               //D+D-产生J信号,处于空闲状态

image.png

image.png

您上面尝试发送的SET FEATURE请求,可以参考下方代码块。测试代码使用了USB2接口,若使用USB1接口,可以把变量/函数名中的‘2’删去。

uint8_t len_temp = 8;

pU2SetupReq->bRequestType = 0;

pU2SetupReq->bRequest = 3;

pU2SetupReq->wValue = 1;

pU2SetupReq->wIndex = 0;

pU2SetupReq->wLength = 0;

uint8_t s = U2HostCtrlTransfer(U2Com_Buffer, &len_temp); // 执行控制传输

if(!s)

    PRINT("SET_FEATURE OK\n"); 

else

    PRINT("SET_FEATURE NG\n");



您好,感谢您的回复,

我在TMOS里建立了一个延时任务,当1分钟之内键盘没有按下时583会进入睡眠

然后我按照您的指导书写以下程序:

if(events & START_SLEEP_EVT)

    {

        uint8_t len_temp = 8;

        pU2SetupReq->bRequestType = 0;

        pU2SetupReq->bRequest = 3;

        pU2SetupReq->wValue = 1;

        pU2SetupReq->wIndex = 0;

        pU2SetupReq->wLength = 0;

        uint8_t s = U2HostCtrlTransfer(U2Com_Buffer, &len_temp); // 执行控制传输

        if(!s)

            PRINT("SET_FEATURE OK\n");

        else

            PRINT("SET_FEATURE NG\n");


        R8_U2H_SETUP &= ~RB_UH_SOF_EN;      //关闭帧起始包自动生成

        R8_USB2_CTRL &= ~MASK_UC_SYS_CTRL;

        R8_USB2_CTRL |= 0x20;               //D+D-产生J信号,处于空闲状态

        DelayMs(3);

        PRINT("SLEEP\r\n");

        GPIOB_ModeCfg(GPIO_Pin_12|GPIO_Pin_13, GPIO_ModeIN_PU);

        GPIOB_ITModeCfg(GPIO_Pin_12|GPIO_Pin_13, GPIO_ITMode_FallEdge); // 下降沿唤醒

        PFIC_EnableIRQ(GPIO_B_IRQn);

        PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

        DelayMs(2);

        LowPower_Shutdown(0); //全部断电,唤醒后复位

        return (events ^ START_SLEEP_EVT);

    }


__INTERRUPT  

__HIGH_CODE

void GPIOB_IRQHandler(void)

{

    GPIOB_ClearITFlagBit(GPIO_Pin_12 | GPIO_Pin_13);

}

此目的是主机睡眠和键盘可以唤醒主机,我将USB2的两个IO设置了下降沿唤醒,如果键盘有数据发出将会唤醒主机

但是:

串口.PNG

串口显示SET_FEATURE_NG,说明这个包并没有下发成功,

然后按下键盘按键并没有唤醒的电平


您好,测试的键盘是否支持远程唤醒功能,是可以唤醒电脑的吧,抓包看一下电脑收到唤醒信号后有没有等待一段时间再发包;注意MCU挂起键盘后是关掉SOF自动生成功能的,MCU收到键盘唤醒信号后需要再恢复SOF生成。

您是要做有线转蓝牙的转接器类似的东西吗,您可以发邮件至zhaiyw@wch.cn取得联系。


只有登录才能回复,可以选择微信账号登录