部分程序如下 void mCH372Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char length, c1, len; unsigned char *pBuf; unsigned char mBuf[64]; CH372_WR_CMD_PORT(CMD_GET_STATUS); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus =CH372_RD_DAT_PORT(); /* 獲取中斷狀態(tài) */ IE1 = 0; /* 清中斷標(biāo)志,對應(yīng)于INT0中斷 */ switch(InterruptStatus){ // 分析中斷狀態(tài) case USB_INT_EP2_OUT: // 批量端點(diǎn)下傳成功 pBuf=mBuf; //數(shù)據(jù)未處理 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); //發(fā)出讀數(shù)據(jù)命令 length=CH372_RD_DAT_PORT(); //首先讀出的是長度 for(len=0;len!=length;len++,pBuf++)*pBuf=CH372_RD_DAT_PORT(); //將數(shù)據(jù)讀入到緩沖區(qū) // pBuf=mBuf; // 演示回傳 // CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); //發(fā)出寫上傳端點(diǎn)命令 // CH372_WR_DAT_PORT(length); // for(len=0;len!=length;len++,pBuf++)CH372_WR_DAT_PORT(*pBuf); //將數(shù)據(jù)寫入上傳端點(diǎn) break; case USB_INT_EP2_IN: //批量端點(diǎn)上傳成功,未處理 CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū) break; case USB_INT_EP1_IN: //中斷端點(diǎn)上傳成功,未處理 CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū) break; case USB_INT_EP1_OUT: //中斷端點(diǎn)下傳成功,未處理 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); //發(fā)出讀數(shù)據(jù)命令 if(length=CH372_RD_DAT_PORT()){ //長度為0跳出 for(len=0;len!=length;len++)c1=CH372_RD_DAT_PORT(); //取出下傳數(shù)據(jù) } // CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū),如果前面沒有CMD_RD_USB_DATA命令則使用本命令 break; case USB_INT_EP0_SETUP: //控制端點(diǎn)建立成功 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); length=CH372_RD_DAT_PORT(); for(len=0;len!=length;len++)request.buffer[len]=CH372_RD_DAT_PORT(); // 取出數(shù)據(jù) if(length==0x08){ mVarSetupLength=request.buffer[6]&0x7f; //控制傳輸數(shù)據(jù)長度最大設(shè)置為128 if((c1=request.r.bmReuestType)&0x40){ //廠商請求,未處理 } if((c1=request.r.bmReuestType)&0x20){ //類請求,未處理 } if(!((c1=request.r.bmReuestType)&0x60)){ //標(biāo)準(zhǔn)請求 mVarSetupRequest=request.r.bRequest; //暫存標(biāo)準(zhǔn)請求碼 switch(request.r.bRequest){ // 分析標(biāo)準(zhǔn)請求 case DEF_USB_CLR_FEATURE: //清除特性 if((c1=request.r.bmReuestType&0x1F)==0X02){ //不是端點(diǎn)不支持 switch(request.buffer[4]){ case 0x82: CH372_WR_CMD_PORT(CMD_SET_ENDP7); //清除端點(diǎn)2上傳 CH372_WR_DAT_PORT(0x8E); //發(fā)命令清除端點(diǎn) break; case 0x02: CH372_WR_CMD_PORT(CMD_SET_ENDP6); CH372_WR_DAT_PORT(0x80); //清除端點(diǎn)2下傳 break; case 0x81: CH372_WR_CMD_PORT(CMD_SET_ENDP5); //清除端點(diǎn)1上傳 CH372_WR_DAT_PORT(0x8E); break; case 0x01: CH372_WR_CMD_PORT(CMD_SET_ENDP4); //清除端點(diǎn)1下傳 CH372_WR_DAT_PORT(0x80); break; default: break; } } else{ CH372FLAGERR=1; //不支持的清除特性,置錯(cuò)誤標(biāo)志 } break; case DEF_USB_GET_STATUS: //獲得狀態(tài) request.buffer[0]=0; request.buffer[1]=0; //上傳狀態(tài) break; case DEF_USB_SET_ADDRESS: //設(shè)置地址 VarUsbAddress=request.buffer[2]; //暫存USB主機(jī)發(fā)來的地址 break; case DEF_USB_GET_DESCR: //獲得描述符 if(request.buffer[3]==1) //設(shè)備描述符上傳 VarSetupDescr=DevDes; else if(request.buffer[3]==2) //配置描述符上傳 VarSetupDescr=ConDes; else if(request.buffer[3]==3) { if ( request.buffer[2]== 0 ) VarSetupDescr=LangDes; else VarSetupDescr=SerDes; //做字符串處理 } mCH372DesUp(); //其余描述符不支持 break; case DEF_USB_GET_CONFIG: //獲得配置 request.buffer[0]=0; //沒有配置則傳0 if(CH372CONFLAG) request.buffer[0]=1; //已經(jīng)配置則傳1;這是在描述符里規(guī)定的 break; case DEF_USB_SET_CONFIG: //設(shè)置配置 CH372CONFLAG=0; CH372ACT=1; if ( request.buffer[2] != 0 ) { CH372CONFLAG=1; //設(shè)置配置標(biāo)志 CH372ACT=0; //輸出配置完成信號 } break; case DEF_USB_GET_INTERF: //得到接口 request.buffer[0]=1; //上傳接口數(shù),本事例只支持一個(gè)接口 break; default : CH372FLAGERR=1; //不支持的標(biāo)準(zhǔn)請求 break; } } } else { //不支持的控制傳輸,不是8字節(jié)的控制傳輸 CH372FLAGERR=1; } if(!CH372FLAGERR) mCH372Ep0Up(); //沒有錯(cuò)誤/調(diào)用數(shù)據(jù)上傳,,長度為0上傳為狀態(tài) else { CH372_WR_CMD_PORT(CMD_SET_ENDP3); //設(shè)置端點(diǎn)1為STALL,指示一個(gè)錯(cuò)誤 CH372_WR_DAT_PORT(0x0F); } break; case USB_INT_EP0_IN: //控制端點(diǎn)上傳成功 if(mVarSetupRequest==DEF_USB_GET_DESCR){ //描述符上傳 mCH372DesUp(); mCH372Ep0Up(); } else if(mVarSetupRequest==DEF_USB_SET_ADDRESS){ //設(shè)置地址 CH372_WR_CMD_PORT(CMD_SET_USB_ADDR); CH372_WR_DAT_PORT(VarUsbAddress); //設(shè)置USB地址,設(shè)置下次事務(wù)的USB地址 } CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū) break; case USB_INT_EP0_OUT: //控制端點(diǎn)下傳成功 CH372_WR_CMD_PORT(CMD_RD_USB_DATA); //發(fā)出讀數(shù)據(jù)命令 if(length=CH372_RD_DAT_PORT()){ //長度為0跳出 for(len=0;len!=length;len++)c1=CH372_RD_DAT_PORT(); //取出下傳數(shù)據(jù) } break; default: if((InterruptStatus&0x03)==0x03){ //總線復(fù)位 CH372FLAGERR=0; //錯(cuò)誤清0 CH372CONFLAG=0; //配置清0 mVarSetupLength=0; CH372ACT=1; //清配置完成輸出 } else{ //命令不支持 ; } CH372_WR_CMD_PORT (CMD_UNLOCK_USB); //釋放緩沖區(qū) break; } }
查看: 1438
回復(fù): 1
計(jì)算機(jī)彈出找到新硬件向?qū)В雴枂柍绦蛴袥]有SETUP成功
熱門產(chǎn)品 :
CH32L103: 32位PDUSB低功耗單片機(jī)
如果提示找到新硬件,那么Setup已經(jīng)成功了
請勿發(fā)布廣告和違法內(nèi)容, 代碼可以選擇編輯器代碼語言格式, 更易他人閱讀幫助您, 或者留下聯(lián)系方式,以便更好更快服務(wù)您
只有登錄才能回復(fù),可以選擇微信賬號登錄