CH582 使用USB模擬 HID設(shè)備,無法只讀取數(shù)據(jù),必須先寫一幀才能讀一幀

各位老師,我在使用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ù)。意思是只能寫一幀才能讀一幀。

問題如下:

  1. 我的理解是我的main函數(shù)的while循環(huán)里面包含語句DevEP2_OUT_Deal(16);就是向PC機(jī)器上傳數(shù)據(jù),為什么無法讀取。

  2. 我只需要實(shí)現(xiàn)每20ms向PC上上傳一幀20個(gè)字節(jié)左右的自定義數(shù)據(jù),如何實(shí)現(xiàn)?

  3. 我的回復(fù)帖是新的問題,請(qǐng)不吝指導(dǎo)。

    附件是對(duì)應(yīng)的ch582下位機(jī)程序和上位機(jī)測(cè)試代碼

  4. icon_rar.gifHIDapiTest.rar

  5. icon_rar.gifHID.rar

/**********************************?(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();
}


目前進(jìn)一步測(cè)試,發(fā)現(xiàn),我只有通過hid_write寫一部分?jǐn)?shù)據(jù)進(jìn)去之后,才能通過hid_read讀一幀數(shù)據(jù)出來,如果不寫則無法讀出數(shù)據(jù),我的USB初始化函數(shù)里面一個(gè)while循環(huán)在哪,發(fā)現(xiàn)LED是在閃爍。但是就是沒有數(shù)據(jù)讀出來。請(qǐng)教各位版主如何解決?我的目的很簡(jiǎn)單,就是實(shí)現(xiàn)一個(gè)HID設(shè)備,每隔20毫秒能向電腦傳輸一幀數(shù)據(jù),大概有10來個(gè)字節(jié)左右。

void?USB_Init()
{
??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?);
??mDelaymS(1000);
??while(1)
??{
??????mDelaymS(100);
??????GPIOB_InverseBits(GPIO_Pin_18);//LED閃爍
??????for?(int?i?=?0;?i?<?0x20;?i++?)
????????{
??????????pEP2_IN_DataBuf[i]?=?i*2;
????????}
????????DevEP2_IN_Deal(?0X20);//發(fā)送數(shù)據(jù)到端口2

??}

}



另外請(qǐng)教各位老師第三個(gè)問題:我在上位機(jī)使用hid_read讀端口2數(shù)據(jù)時(shí)候,如下的程序段好像都沒有被執(zhí)行到,對(duì)應(yīng)的LED沒有發(fā)生閃爍,這是什么原因?我的理解是這是向PC機(jī)上傳的中斷,當(dāng)PC發(fā)出hid_read命令時(shí)候,肯定會(huì)被執(zhí)行到:

????????case?UIS_TOKEN_IN?|?2?:
??????????GPIOB_InverseBits(GPIO_Pin_19);
??????????R8_UEP2_CTRL?=?(?R8_UEP2_CTRL?&?~MASK_UEP_T_RES?)?|?UEP_T_RES_NAK;
??????????break;

當(dāng)我在上位機(jī)執(zhí)行hid_write命令,發(fā)現(xiàn)如下的程序段是執(zhí)行的,因?yàn)閷?duì)應(yīng)的LED在閃爍。

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?);
????????????for?(?int?i?=?0;?i?<?64;?i++?)
???????????????????????{
??????????????????????????pEP2_IN_DataBuf[i]?=0x33;
???????????????????????}
???????????????????????DevEP2_IN_Deal(?len?);
??????????}
??????????GPIOB_InverseBits(GPIO_Pin_18);
??????????break;



DevEP4_IN_Deal(?l?); 這句里面的 l 必須是64,也就是 上傳數(shù)據(jù)必須是64個(gè)字節(jié),我測(cè)試的時(shí)候,也發(fā)現(xiàn)了這個(gè)問題,發(fā)送字節(jié)要是不夠64,上位機(jī)就收不到USB發(fā)來的數(shù)據(jù)


問題1:端點(diǎn)_OUT_Deal這個(gè)函數(shù),是設(shè)備接收到主機(jī)發(fā)來的OUT包之后,對(duì)于OUT數(shù)據(jù)的處理,處理好后再通過IN方向的數(shù)據(jù)處理返回給主機(jī);USB低速和全速傳輸中從機(jī)設(shè)備不能主動(dòng)向主機(jī)PC上傳數(shù)據(jù)。

問題2:可以修改IN方向端點(diǎn)2的描述符的最后一個(gè)字節(jié),值改為20,即中斷傳輸中,每隔20ms,主機(jī)發(fā)一個(gè)IN包給從機(jī),從機(jī)設(shè)備收到PC發(fā)來的IN包,上傳自定義數(shù)據(jù)。報(bào)表描述符中規(guī)定了上傳數(shù)據(jù)的格式,DevEP0SIZE的值宏定義為了16,配合report size表示16個(gè)字節(jié)。這里中斷使用端點(diǎn)2的話,報(bào)表描述符中DevEP0SIZE這個(gè)值可以不用通過宏定義,直接改成想要的字節(jié)數(shù),最大為64。


感謝回復(fù),關(guān)于問題1和2,我的理解:端點(diǎn)_OUT_Deal 這個(gè)函數(shù)就是將當(dāng)前的數(shù)據(jù)提前準(zhǔn)備好,等待上位機(jī)發(fā)命令下來就開始上傳,當(dāng)我發(fā)送了一個(gè)讀的命令之后,相當(dāng)于就是主機(jī)發(fā)送了一個(gè)IN的命令,那么準(zhǔn)備好的數(shù)據(jù)就被上傳到主機(jī)上了。因此理論上我應(yīng)該得到數(shù)據(jù)的。

? ?請(qǐng)問:我以上的描述中是哪個(gè)環(huán)節(jié)出了問題而導(dǎo)致我的數(shù)據(jù)沒有被收到,也就是讀失敗了.


我下載了附件中的程序,主函數(shù)復(fù)制于帖子中的主函數(shù)。

使用BUS HOUND抓包,能夠抓到按程序設(shè)置并返回的IN數(shù)據(jù)。

6{SIZPC_ZH0]R9W0U`PV48S.png 8{TCTU4HDS{][LWI{{DI~IC.png7O2C0OXK~QW914CTXYZCDZV.png

此過程是否即是按6樓的說法進(jìn)行的,OUT方向作為觸發(fā)指令下達(dá)給從機(jī)設(shè)備,再設(shè)置數(shù)據(jù)后IN方向上傳給主機(jī)。




是這樣的,中斷里面的確實(shí)說明了6樓的工作流程。

但是我在main 函數(shù)里面也一直在 循環(huán)調(diào)用

?DevEP2_IN_Deal(?0X20);//發(fā)送數(shù)據(jù)到端口,

那么我在上位機(jī)中:不調(diào)用hid_write的情況下,一直調(diào)用hid_read,應(yīng)該是可以得到數(shù)據(jù)的,但是事實(shí)上讀取的時(shí)候沒有返回?cái)?shù)據(jù)。如何才能不調(diào)用hid_write 只調(diào)用hid_read能夠返回?cái)?shù)據(jù)呢?我現(xiàn)在將上傳周期修改為20ms,仍然不能讀取數(shù)據(jù)。

下面是下位機(jī)main函數(shù)中的while循環(huán):

??while(1)
??{
??????mDelaymS(100);
??????GPIOB_InverseBits(GPIO_Pin_18);//LED閃爍
??????for?(int?i?=?0;?i?<?0x20;?i++?)
????????{
??????????pEP2_IN_DataBuf[i]?=?i*2;
????????}
????????DevEP2_IN_Deal(?0X20);//發(fā)送數(shù)據(jù)到端口2
?
??}
?
}




3樓中程序沒有運(yùn)行到IN方向case內(nèi),建議確定一下,調(diào)用hid_read,主機(jī)PC是否在端點(diǎn)2的IN方向向從機(jī)設(shè)備發(fā)送IN指令,指令是否下達(dá)到了單片機(jī)。建議在相應(yīng)case內(nèi)添加串口打印? PRINT("debug字符串注意最后加\n換行"),由串口打印信息來debug。

當(dāng)設(shè)置好中斷函數(shù)后,每隔20ms主機(jī)會(huì)自動(dòng)于端點(diǎn)2的IN方向管道,向從機(jī)設(shè)備發(fā)送IN指令。若要實(shí)現(xiàn)每20ms發(fā)送一段數(shù)據(jù),收到這個(gè)IN指令前,要向pEP2_IN_DataBuf寫好數(shù)據(jù),而后調(diào)用 端點(diǎn)_IN_Deal()函數(shù)設(shè)置相應(yīng)寄存器,即可在收到IN指令時(shí)發(fā)出去。

若收到IN指令前pEP2_IN_DataBuf內(nèi)沒有寫數(shù)據(jù),判斷為設(shè)備沒有準(zhǔn)備好數(shù)據(jù),會(huì)回NAK包。

若要咨詢API的使用,可以致電025-52638360。


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

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