各位老師,我在使用HID設(shè)備時(shí)候出現(xiàn)問題,請(qǐng)百忙之中指導(dǎo),現(xiàn)象如下:
1.我的上位機(jī)是使用hidapi 庫的,僅僅通過hid_read讀取。通過上位機(jī)讀取數(shù)據(jù),無法讀到上傳數(shù)據(jù)
2.另外我直接使用CH9326的DEBUG程序打開該設(shè)備,試著讀取,效果一樣。還是無法讀到數(shù)據(jù)。
3.先寫使用hid_write寫一幀數(shù)據(jù),則可以讀到一幀數(shù)據(jù),再寫則可以再讀一幀數(shù)據(jù)。意思是只能寫一幀才能讀一幀。
問題如下:
我的理解是我的main函數(shù)的while循環(huán)里面包含語句DevEP2_OUT_Deal(16);就是向PC機(jī)器上傳數(shù)據(jù),為什么無法讀取。
我只需要實(shí)現(xiàn)每20ms向PC上上傳一幀20個(gè)字節(jié)左右的自定義數(shù)據(jù),如何實(shí)現(xiàn)?
我的回復(fù)帖是新的問題,請(qǐng)不吝指導(dǎo)。
附件是對(duì)應(yīng)的ch582下位機(jī)程序和上位機(jī)測(cè)試代碼
/**********************************?(C)?COPYRIGHT?******************************* ?*?File?Name??????????:?Main.c ?*?Author?????????????:?WCH ?*?Version????????????:?V1.0 ?*?Date???????????????:?2020/02/20 ?*?Description????????:?模擬USB復(fù)合設(shè)備,鍵鼠,支持類命令 ?*******************************************************************************/ #include?"CH58x_common.h" #define?DevEP0SIZE??0x10 //?設(shè)備描述符 const?UINT8?MyDevDescr[]?=?{?0x12,?0x01,?0x10,?0x01,?0x00,?0x00,?0x00,?DevEP0SIZE,?0x3d,?0x41,?0x07,?0x21,?0x00,?0x00, ?????????????????????????????0x00,?0x00,?0x00,?0x01?}; //?配置描述符 const?UINT8?MyCfgDescr[]?=?{?????0x09,0x02,0x29,0x00,0x01,0x01,0x04,0xA0,0x23,???????????????//配置描述符 ?????????????????????????????????0x09,0x04,0x00,0x00,0x02,0x03,0x00,0x00,0x05,???????????????//接口描述符 ?????????????????????????????????0x09,0x21,0x00,0x01,0x00,0x01,0x22,0x22,0x00,???????????????//HID類描述符 ?????????????????????????????????0x07,0x05,0x82,0x03,DevEP0SIZE,0x00,0x01,??????????????//端點(diǎn)描述符(全速間隔時(shí)間改成1ms) ?????????????????????????????????0x07,0x05,0x02,0x03,DevEP0SIZE,0x00,0x01,??????????????//端點(diǎn)描述符 ????}; //?語言描述符 const?UINT8?MyLangDescr[]?=?{?0x04,?0x03,?0x09,?0x04?}; //?廠家信息 const?UINT8?MyManuInfo[]?=?{?0x0E,?0x03,?'X',?0,?'i',?0,?'n',?0,?'L',?0,?'i',?0,?'n',?0?}; //?產(chǎn)品信息 const?UINT8?MyProdInfo[]?=?{?0x0C,?0x03,?'M',?0,?'a',?0,?'g',?0,?'i',?0,?'c',?0?}; /*HID類報(bào)表描述符*/ const?UINT8?CfgDesc[]?=?{?????0x06,?0x00,0xff, ?????????????????????????????????0x09,?0x01, ?????????????????????????????????0xa1,?0x01,???????????????????????????????????????????????????//集合開始 ?????????????????????????????????0x09,?0x02,???????????????????????????????????????????????????//Usage?Page??用法 ?????????????????????????????????0x15,?0x00,???????????????????????????????????????????????????//Logical??Minimun ?????????????????????????????????0x26,?0x00,0xff,??????????????????????????????????????????????//Logical??Maximun ?????????????????????????????????0x75,?0x08,???????????????????????????????????????????????????//Report?Size ?????????????????????????????????0x95,?DevEP0SIZE,????????????????????????????????????????//Report?Counet ?????????????????????????????????0x81,?0x06,???????????????????????????????????????????????????//Input ?????????????????????????????????0x09,?0x02,???????????????????????????????????????????????????//Usage?Page??用法 ?????????????????????????????????0x15,?0x00,???????????????????????????????????????????????????//Logical??Minimun ?????????????????????????????????0x26,?0x00,0xff,??????????????????????????????????????????????//Logical??Maximun ?????????????????????????????????0x75,?0x08,???????????????????????????????????????????????????//Report?Size ?????????????????????????????????0x95,?DevEP0SIZE,????????????????????????????????????????//Report?Counet ?????????????????????????????????0x91,?0x06,???????????????????????????????????????????????????//Output ?????????????????????????????????0xC0?}; /**********************************************************/ UINT8?DevConfig,?Ready; UINT8?SetupReqCode; UINT16?SetupReqLen; const?UINT8?*pDescr; /*鼠標(biāo)鍵盤數(shù)據(jù)*/ UINT8?HIDInOutData[DevEP0SIZE]?=?{?0?}; /********?用戶自定義分配端點(diǎn)RAM?****************************************/ __attribute__((aligned(4)))??UINT8?EP0_Databuf[64?+?64?+?64];????//ep0(64)+ep4_out(64)+ep4_in(64) __attribute__((aligned(4)))??UINT8?EP1_Databuf[64?+?64];????//ep1_out(64)+ep1_in(64) __attribute__((aligned(4)))??UINT8?EP2_Databuf[64?+?64];????//ep2_out(64)+ep2_in(64) __attribute__((aligned(4)))??UINT8?EP3_Databuf[64?+?64];????//ep3_out(64)+ep3_in(64) void?USB_DevTransProcess(?void?) { ??UINT8?len,?chtype; ??UINT8?intflag,?errflag?=?0; ??intflag?=?R8_USB_INT_FG; ??if?(?intflag?&?RB_UIF_TRANSFER?) ??{ ????if?(?(?R8_USB_INT_ST?&?MASK_UIS_TOKEN?)?!=?MASK_UIS_TOKEN?)????//?非空閑 ????{ ??????switch?(?R8_USB_INT_ST?&?(?MASK_UIS_TOKEN?|?MASK_UIS_ENDP?)?) ??????//?分析操作令牌和端點(diǎn)號(hào) ??????{ ????????case?UIS_TOKEN_IN?: ????????{ ??????????switch?(?SetupReqCode?) ??????????{ ????????????case?USB_GET_DESCRIPTOR?: ??????????????len?=?SetupReqLen?>=?DevEP0SIZE?? ??????????????????DevEP0SIZE?:?SetupReqLen;????//?本次傳輸長(zhǎng)度 ??????????????memcpy(?pEP0_DataBuf,?pDescr,?len?);?/*?加載上傳數(shù)據(jù)?*/ ??????????????SetupReqLen?-=?len; ??????????????pDescr?+=?len; ??????????????R8_UEP0_T_LEN?=?len; ??????????????R8_UEP0_CTRL?^=?RB_UEP_T_TOG;?????????????????????????????//?翻轉(zhuǎn) ??????????????break; ????????????case?USB_SET_ADDRESS?: ??????????????R8_USB_DEV_AD?=?(?R8_USB_DEV_AD?&?RB_UDA_GP_BIT?)?|?SetupReqLen; ??????????????R8_UEP0_CTRL?=?UEP_R_RES_ACK?|?UEP_T_RES_NAK; ??????????????break; ????????????default?: ??????????????R8_UEP0_T_LEN?=?0;??????????????????????????????????????//?狀態(tài)階段完成中斷或者是強(qiáng)制上傳0長(zhǎng)度數(shù)據(jù)包結(jié)束控制傳輸 ??????????????R8_UEP0_CTRL?=?UEP_R_RES_ACK?|?UEP_T_RES_NAK; ??????????????break; ??????????} ????????} ??????????break; ????????case?UIS_TOKEN_OUT?: ????????{ ????????????//GPIOB_InverseBits(GPIO_Pin_19); ??????????len?=?R8_USB_RX_LEN; ??????????//if?(?SetupReqCode?==?0x09?) ??????????{ ??????????????GPIOB_WriteBit(GPIO_Pin_19,?pEP0_DataBuf[0]); ??????????} ????????} ??????????break; ????????case?UIS_TOKEN_OUT?|?1?: ????????{ ??????????if?(?R8_USB_INT_ST?&?RB_UIS_TOG_OK?) ??????????{???????????????????????//?不同步的數(shù)據(jù)包將丟棄 ????????????len?=?R8_USB_RX_LEN; ????????????DevEP1_OUT_Deal(?len?); ??????????} ????????} ??????????break; ????????case?UIS_TOKEN_IN?|?1?: ??????????R8_UEP1_CTRL?=?(?R8_UEP1_CTRL?&?~MASK_UEP_T_RES?)?|?UEP_T_RES_NAK; ??????????break; ????????case?UIS_TOKEN_OUT?|?2?: ????????{ ??????????if?(?R8_USB_INT_ST?&?RB_UIS_TOG_OK?) ??????????{???????????????????????//?不同步的數(shù)據(jù)包將丟棄 ????????????len?=?R8_USB_RX_LEN; ????????????DevEP2_OUT_Deal(?len?); ??????????} ????????} ??????????break; ????????case?UIS_TOKEN_IN?|?2?: ??????????//GPIOB_InverseBits(GPIO_Pin_19); //??????????if?(?!pEP2_IN_DataBuf[0]?) //??????????{ //??????????????GPIOB_SetBits(GPIO_Pin_19); //??????????} //??????????else //??????????{ //?????????????GPIOB_ResetBits(GPIO_Pin_19); //??????????} ????????GPIOB_WriteBit(GPIO_Pin_19,?pEP2_OUT_DataBuf[1]); ??????????R8_UEP2_CTRL?=?(?R8_UEP2_CTRL?&?~MASK_UEP_T_RES?)?|?UEP_T_RES_NAK; ??????????break; ????????case?UIS_TOKEN_OUT?|?3?: ????????{ ??????????if?(?R8_USB_INT_ST?&?RB_UIS_TOG_OK?) ??????????{???????????????????????//?不同步的數(shù)據(jù)包將丟棄 ????????????len?=?R8_USB_RX_LEN; ????????????DevEP3_OUT_Deal(?len?); ??????????} ????????} ??????????break; ????????case?UIS_TOKEN_IN?|?3?: ??????????R8_UEP3_CTRL?=?(?R8_UEP3_CTRL?&?~MASK_UEP_T_RES?)?|?UEP_T_RES_NAK; ??????????break; ????????case?UIS_TOKEN_OUT?|?4?: ????????{ ??????????if?(?R8_USB_INT_ST?&?RB_UIS_TOG_OK?) ??????????{ ????????????R8_UEP4_CTRL?^=?RB_UEP_R_TOG; ????????????len?=?R8_USB_RX_LEN; ????????????DevEP4_OUT_Deal(?len?); ??????????} ????????} ??????????break; ????????case?UIS_TOKEN_IN?|?4?: ??????????R8_UEP4_CTRL?^=?RB_UEP_T_TOG; ??????????R8_UEP4_CTRL?=?(?R8_UEP4_CTRL?&?~MASK_UEP_T_RES?)?|?UEP_T_RES_NAK; ??????????break; ????????default?: ??????????break; ??????} ??????R8_USB_INT_FG?=?RB_UIF_TRANSFER; ????} ????if?(?R8_USB_INT_ST?&?RB_UIS_SETUP_ACT?)??????????????????//?Setup包處理 ????{ ????????//GPIOB_InverseBits(GPIO_Pin_19); ??????R8_UEP0_CTRL?=?RB_UEP_R_TOG?|?RB_UEP_T_TOG?|?UEP_R_RES_ACK?|?UEP_T_RES_NAK; ??????SetupReqLen?=?pSetupReqPak->wLength; ??????SetupReqCode?=?pSetupReqPak->bRequest; ??????chtype?=?pSetupReqPak->bRequestType; ??????len?=?0; ??????errflag?=?0; ??????if?(?(?pSetupReqPak->bRequestType?&?USB_REQ_TYP_MASK?)?!=?USB_REQ_TYP_STANDARD?) ??????{ ????????switch?(?SetupReqCode?) ????????{ ??????????case?0x0a?: ????????????break;????????//這個(gè)一定要有 ??????????case?0x09?: ????????????break; ??????????default?: ????????????errflag?=?0xFF; ????????} ??????} ??????else?/*?標(biāo)準(zhǔn)請(qǐng)求?*/ ??????{ ????????switch?(?SetupReqCode?) ????????{ ??????????case?USB_GET_DESCRIPTOR?: ??????????{ ????????????switch?(?(?(?pSetupReqPak->wValue?)?>>?8?)?) ????????????{ ??????????????case?USB_DESCR_TYP_DEVICE?: ??????????????{ ????????????????pDescr?=?MyDevDescr; ????????????????len?=?MyDevDescr[0]; ??????????????} ????????????????break; ??????????????case?USB_DESCR_TYP_CONFIG?: ??????????????{ ????????????????pDescr?=?MyCfgDescr; ????????????????len?=?MyCfgDescr[2]; ??????????????} ????????????????break; ??????????????case?USB_DESCR_TYP_REPORT?: ??????????????{ ????????????????if?(?(?(?pSetupReqPak->wIndex?)?&?0xff?)?==?0?)?????????????????????????????//接口0報(bào)表描述符 ????????????????{ ??????????????????pDescr?=?CfgDesc;??????????????????????????????????//數(shù)據(jù)準(zhǔn)備上傳 ??????????????????len?=?sizeof(?CfgDesc?); ????????????????} ????????????????else ??????????????????len?=?0xff;???????????????????????????????????????????//本程序只有2個(gè)接口,這句話正常不可能執(zhí)行 ??????????????} ????????????????break; ??????????????case?USB_DESCR_TYP_STRING?: ??????????????{ ????????????????switch?(?(?pSetupReqPak->wValue?)?&?0xff?) ????????????????{ ??????????????????case?1?: ????????????????????pDescr?=?MyManuInfo; ????????????????????len?=?MyManuInfo[0]; ????????????????????break; ??????????????????case?2?: ????????????????????pDescr?=?MyProdInfo; ????????????????????len?=?MyProdInfo[0]; ????????????????????break; ??????????????????case?0?: ????????????????????pDescr?=?MyLangDescr; ????????????????????len?=?MyLangDescr[0]; ????????????????????break; ??????????????????default?: ????????????????????errflag?=?0xFF;???????????????????????????????//?不支持的字符串描述符 ????????????????????break; ????????????????} ??????????????} ????????????????break; ??????????????default?: ????????????????errflag?=?0xff; ????????????????break; ????????????} ????????????if?(?SetupReqLen?>?len?) ??????????????SetupReqLen?=?len;??????//實(shí)際需上傳總長(zhǎng)度 ????????????len?=?(?SetupReqLen?>=?DevEP0SIZE?)?? ????????????????DevEP0SIZE?:?SetupReqLen; ????????????memcpy(?pEP0_DataBuf,?pDescr,?len?); ????????????pDescr?+=?len; ??????????} ????????????break; ??????????case?USB_SET_ADDRESS?: ????????????SetupReqLen?=?(?pSetupReqPak->wValue?)?&?0xff; ????????????break; ??????????case?USB_GET_CONFIGURATION?: ????????????pEP0_DataBuf[0]?=?DevConfig; ????????????if?(?SetupReqLen?>?1?) ??????????????SetupReqLen?=?1; ????????????break; ??????????case?USB_SET_CONFIGURATION?: ????????????DevConfig?=?(?pSetupReqPak->wValue?)?&?0xff; ????????????break; ??????????case?USB_CLEAR_FEATURE?: ??????????{ ????????????if?(?(?pSetupReqPak->bRequestType?&?USB_REQ_RECIP_MASK?)?==?USB_REQ_RECIP_ENDP?)????//?端點(diǎn) ????????????{ ??????????????switch?(?(?pSetupReqPak->wIndex?)?&?0xff?) ??????????????{ ????????????????case?0x82?: ??????????????????R8_UEP2_CTRL?=?(?R8_UEP2_CTRL?&?~(?RB_UEP_T_TOG?|?MASK_UEP_T_RES?)?)?|?UEP_T_RES_NAK; ??????????????????break; ????????????????case?0x02?: ??????????????????R8_UEP2_CTRL?=?(?R8_UEP2_CTRL?&?~(?RB_UEP_R_TOG?|?MASK_UEP_R_RES?)?)?|?UEP_R_RES_ACK; ??????????????????break; ????????????????case?0x81?: ??????????????????R8_UEP1_CTRL?=?(?R8_UEP1_CTRL?&?~(?RB_UEP_T_TOG?|?MASK_UEP_T_RES?)?)?|?UEP_T_RES_NAK; ??????????????????break; ????????????????case?0x01?: ??????????????????R8_UEP1_CTRL?=?(?R8_UEP1_CTRL?&?~(?RB_UEP_R_TOG?|?MASK_UEP_R_RES?)?)?|?UEP_R_RES_ACK; ??????????????????break; ????????????????default?: ??????????????????errflag?=?0xFF;?????????????????????????????????//?不支持的端點(diǎn) ??????????????????break; ??????????????} ????????????} ????????????else ??????????????errflag?=?0xFF; ??????????} ????????????break; ??????????case?USB_GET_INTERFACE?: ????????????pEP0_DataBuf[0]?=?0x00; ????????????if?(?SetupReqLen?>?1?) ??????????????SetupReqLen?=?1; ????????????break; ??????????case?USB_GET_STATUS?: ????????????pEP0_DataBuf[0]?=?0x00; ????????????pEP0_DataBuf[1]?=?0x00; ????????????if?(?SetupReqLen?>?2?) ??????????????SetupReqLen?=?2; ????????????break; ??????????default?: ????????????errflag?=?0xff; ????????????break; ????????} ??????} ??????if?(?errflag?==?0xff?)????????//?錯(cuò)誤或不支持 ??????{ //??????????????????SetupReqCode?=?0xFF; ????????R8_UEP0_CTRL?=?RB_UEP_R_TOG?|?RB_UEP_T_TOG?|?UEP_R_RES_STALL?|?UEP_T_RES_STALL;????//?STALL ??????} ??????else ??????{ ????????if?(?chtype?&?0x80?)?????//?上傳 ????????{ ??????????len?=?(?SetupReqLen?>?DevEP0SIZE?)?? ??????????????DevEP0SIZE?:?SetupReqLen; ??????????SetupReqLen?-=?len; ????????} ????????else ??????????len?=?0;????????//?下傳 ????????R8_UEP0_T_LEN?=?len; ????????R8_UEP0_CTRL?=?RB_UEP_R_TOG?|?RB_UEP_T_TOG?|?UEP_R_RES_ACK?|?UEP_T_RES_ACK;????//?默認(rèn)數(shù)據(jù)包是DATA1 ??????} ??????R8_USB_INT_FG?=?RB_UIF_TRANSFER; ????} ??} ??else?if?(?intflag?&?RB_UIF_BUS_RST?) ??{ ????R8_USB_DEV_AD?=?0; ????R8_UEP0_CTRL?=?UEP_R_RES_ACK?|?UEP_T_RES_NAK; ????R8_UEP1_CTRL?=?UEP_R_RES_ACK?|?UEP_T_RES_NAK?|?RB_UEP_AUTO_TOG; ????R8_UEP2_CTRL?=?UEP_R_RES_ACK?|?UEP_T_RES_NAK?|?RB_UEP_AUTO_TOG; ????R8_UEP3_CTRL?=?UEP_R_RES_ACK?|?UEP_T_RES_NAK?|?RB_UEP_AUTO_TOG; ????R8_USB_INT_FG?=?RB_UIF_BUS_RST; ??} ??else?if?(?intflag?&?RB_UIF_SUSPEND?) ??{ ????if?(?R8_USB_MIS_ST?&?RB_UMS_SUSPEND?) ????{ ??????; ????}????//?掛起 ????else ????{ ??????; ????}???????????????//?喚醒 ????R8_USB_INT_FG?=?RB_UIF_SUSPEND; ??} ??else ??{ ????R8_USB_INT_FG?=?intflag; ??} } void?DebugInit(?void?) { ??GPIOA_SetBits(?GPIO_Pin_9?); ??GPIOA_ModeCfg(?GPIO_Pin_8,?GPIO_ModeIN_PU?); ??GPIOA_ModeCfg(?GPIO_Pin_9,?GPIO_ModeOut_PP_5mA?); ??UART1_DefInit(); } int?main() { ??SetSysClock(?CLK_SOURCE_PLL_60MHz?); ??DebugInit(); ??printf(?"start\n"?); ??pEP0_RAM_Addr?=?EP0_Databuf; ??pEP1_RAM_Addr?=?EP1_Databuf; ??pEP2_RAM_Addr?=?EP2_Databuf; ??pEP3_RAM_Addr?=?EP3_Databuf; ??USB_DeviceInit(); ??PFIC_EnableIRQ(?USB_IRQn?); ??GPIOB_ModeCfg(GPIO_Pin_19,GPIO_ModeOut_PP_20mA); ??GPIOB_ModeCfg(GPIO_Pin_19,GPIO_ModeOut_PP_20mA); ??GPIOB_ModeCfg(GPIO_Pin_18,GPIO_ModeOut_PP_20mA); ??mDelaymS(1000); ??while(1) ??{ ??????mDelaymS(100); ??????DevEP2_OUT_Deal(32); ??} } void?DevEP1_OUT_Deal(?UINT8?l?) {?/*?用戶可自定義?*/ ??UINT8?i; ??for?(?i?=?0;?i?<?l;?i++?) ??{ ????pEP1_IN_DataBuf[i]?=?~pEP1_OUT_DataBuf[i]; ??} ??DevEP1_IN_Deal(?l?); } void?DevEP2_OUT_Deal(?UINT8?l?) {?/*?用戶可自定義?*/ ??UINT8?i; ??for?(?i?=?0;?i?<?l;?i++?) ??{ ????pEP2_IN_DataBuf[i]?=?pEP2_OUT_DataBuf[i]+1; ??} ??DevEP2_IN_Deal(?l?); } void?DevEP3_OUT_Deal(?UINT8?l?) {?/*?用戶可自定義?*/ ??UINT8?i; ??for?(?i?=?0;?i?<?l;?i++?) ??{ ????pEP3_IN_DataBuf[i]?=?~pEP3_OUT_DataBuf[i]+2; ??} ??DevEP3_IN_Deal(?l?); } void?DevEP4_OUT_Deal(?UINT8?l?) {?/*?用戶可自定義?*/ ??UINT8?i; ??for?(?i?=?0;?i?<?l;?i++?) ??{ ????pEP4_IN_DataBuf[i]?=?~pEP4_OUT_DataBuf[i]+3; ??} ??DevEP4_IN_Deal(?l?); } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void?USB_IRQHandler(?void?)?/*?USB中斷服務(wù)程序,使用寄存器組1?*/ { ??USB_DevTransProcess(); }