CH583M可以模擬PC睡眠時向鍵盤設(shè)備發(fā)送的睡眠包嗎

?下面是PC在睡眠的時候通過USB給鍵盤設(shè)備發(fā)送的包:

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

我使用583的USB的接口程序嘗試下發(fā)這段DATA 結(jié)果返回了0x20的錯誤碼,使用程序為:

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

?* @fn? ? ? CtrlGetU2DeviceDescr

?*

?* @brief? ?獲取設(shè)備描述符,返回在 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); // 執(zhí)行控制傳輸

? ? if(s != ERR_SUCCESS)

? ? ? ? return (s);

? ? Usb2DevEndp0Size = ((PUSB_DEV_DESCR)U2Com_Buffer)->bMaxPacketSize0; // 端點0最大包長度,這是簡化處理,正常應(yīng)該先獲取前8字節(jié)后立即更新UsbDevEndp0Size再繼續(xù)

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

? ? ? ? return (ERR_USB_BUF_OVER); // 描述符長度錯誤

? ? return (ERR_SUCCESS);

}


求助是否調(diào)用正確,PC下發(fā)的睡眠包是否正確

您好,主機掛起從機,本質(zhì)上來講是電信號,跟發(fā)包無關(guān),需要主機將總線置空閑狀態(tài)持續(xù)3ms。對于全速設(shè)備來說,空閑狀態(tài)是D+保持高電平,D-保持低電平。注意默認啟用了SOF自動生成的功能,也要關(guān)閉,否則總線上持續(xù)自動生成幀起始包,從機一旦發(fā)現(xiàn)電平信號變化,是立即退出掛起的。

您可以使用下面的代碼塊掛起從機。測試代碼使用了USB2接口,若使用USB1接口,可以把寄存器名中的‘2’刪去。

R8_U2H_SETUP &= ~RB_UH_SOF_EN;? ? ? //關(guān)閉幀起始包自動生成

R8_USB2_CTRL &= ~MASK_UC_SYS_CTRL;

R8_USB2_CTRL |= 0x20;? ? ? ? ? ? ? ?//D+D-產(chǎn)生J信號,處于空閑狀態(tài)

image.png

image.png

您上面嘗試發(fā)送的SET FEATURE請求,可以參考下方代碼塊。測試代碼使用了USB2接口,若使用USB1接口,可以把變量/函數(shù)名中的‘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); // 執(zhí)行控制傳輸

if(!s)

????PRINT("SET_FEATURE OK\n");?

else

????PRINT("SET_FEATURE NG\n");



您好,感謝您的回復(fù),

我在TMOS里建立了一個延時任務(wù),當1分鐘之內(nèi)鍵盤沒有按下時583會進入睡眠

然后我按照您的指導(dǎo)書寫以下程序:

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); // 執(zhí)行控制傳輸

? ? ? ? if(!s)

? ? ? ? ? ? PRINT("SET_FEATURE OK\n");

? ? ? ? else

? ? ? ? ? ? PRINT("SET_FEATURE NG\n");


? ? ? ? R8_U2H_SETUP &= ~RB_UH_SOF_EN;? ? ? //關(guān)閉幀起始包自動生成

? ? ? ? R8_USB2_CTRL &= ~MASK_UC_SYS_CTRL;

? ? ? ? R8_USB2_CTRL |= 0x20;? ? ? ? ? ? ? ?//D+D-產(chǎn)生J信號,處于空閑狀態(tài)

? ? ? ? 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); //全部斷電,喚醒后復(fù)位

? ? ? ? return (events ^ START_SLEEP_EVT);

? ? }


__INTERRUPT??

__HIGH_CODE

void GPIOB_IRQHandler(void)

{

? ? GPIOB_ClearITFlagBit(GPIO_Pin_12 | GPIO_Pin_13);

}

此目的是主機睡眠和鍵盤可以喚醒主機,我將USB2的兩個IO設(shè)置了下降沿喚醒,如果鍵盤有數(shù)據(jù)發(fā)出將會喚醒主機

但是:

串口.PNG

串口顯示SET_FEATURE_NG,說明這個包并沒有下發(fā)成功,

然后按下鍵盤按鍵并沒有喚醒的電平


您好,測試的鍵盤是否支持遠程喚醒功能,是可以喚醒電腦的吧,抓包看一下電腦收到喚醒信號后有沒有等待一段時間再發(fā)包;注意MCU掛起鍵盤后是關(guān)掉SOF自動生成功能的,MCU收到鍵盤喚醒信號后需要再恢復(fù)SOF生成。

您是要做有線轉(zhuǎn)藍牙的轉(zhuǎn)接器類似的東西嗎,您可以發(fā)郵件至zhaiyw@wch.cn取得聯(lián)系。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频