您好。我現(xiàn)在ch554作為host連接一個(gè)usb設(shè)備,已經(jīng)枚舉完成得到設(shè)備的各描述符,設(shè)備interface 1、endp 1需要開(kāi)始同步傳輸(等時(shí)傳輸),我要如何向設(shè)備端發(fā)消息并接收數(shù)據(jù)呢?
謝謝!
您好。我現(xiàn)在ch554作為host連接一個(gè)usb設(shè)備,已經(jīng)枚舉完成得到設(shè)備的各描述符,設(shè)備interface 1、endp 1需要開(kāi)始同步傳輸(等時(shí)傳輸),我要如何向設(shè)備端發(fā)消息并接收數(shù)據(jù)呢?
謝謝!
同步傳輸和批量、中斷傳輸?shù)闹饕顒e在于對(duì)于IN、OUT事務(wù)不做相應(yīng),實(shí)現(xiàn)對(duì)事務(wù)不響應(yīng)配置如下圖。
您好,按照您的回復(fù),參考CH554EVT_參考例程寫了代碼測(cè)試,同步傳輸看上去是成功了,可接收的數(shù)據(jù)沒(méi)有填充到RxBuffer里。請(qǐng)幫忙看看哪里做的不對(duì),接收的值應(yīng)該在哪里取到?謝謝!
不好意思為什么空格都變成了問(wèn)號(hào)。越改越亂,重貼一次。抱歉
//這兩個(gè)變量修改了,因?yàn)橥絺鬏敃r(shí)可能一次接收了126個(gè)字節(jié)。經(jīng)測(cè)試RxBuffer是64還是126效果都一樣 UINT8XRxBuffer[126]_at_0x0000;//IN,mustevenaddress UINT8XTxBuffer[MAX_PACKET_SIZE]_at_0x007E;//OUT,mustevenaddress voidmain() { ????UINT8i,r,s,len,endp; ????UINT16isoc_len,loc; ????CfgFsys(); ????mDelaymS(50); ????mInitSTDIO();//串口0初始化(按12MHz內(nèi)部晶振),為了讓計(jì)算機(jī)通過(guò)串口監(jiān)控演示過(guò)程 ????printf("Start@ChipID=%02X\n",(UINT16)CHIP_ID); ????InitUSB_Host();//初始化USB主機(jī) ????printf("initusbhostok\n"); ????while(1){ ????????if(UIF_DETECT){//如果有USB主機(jī)檢測(cè)中斷則處理 ????????????UIF_DETECT=0;//清中斷標(biāo)志 ????????????s=AnalyzeRootHub();//分析ROOT-HUB狀態(tài) ????????????if(s==ERR_USB_CONNECT//有USB設(shè)備接入 ????????????????&&ThisUsbDev.DeviceStatus==ROOT_DEV_CONNECTED//剛插入設(shè)備尚未初始化 ????????????){ ????????????????s=InitRootDevice();//初始化/枚舉指定HUB端口的USB設(shè)備 ????????????????if(s!=ERR_SUCCESS){ ????????????????????printf("EnumAllRootDeverr=%02X\n",(UINT16)s); ????????????????} ????????????} ????????} ????????//SETINTERFACE ????????//GETCUR ????????//SETCUR ????????//SETINTERFACE(COMMIT) ????????//pSetupReq結(jié)構(gòu)各成員賦值,然后HostCtrlTransfer傳輸 ????????s=HostCtrlTransfer(Com_Buffer,(PUINT8)&len); ????????......//一些雜七雜八的get/set,略 ????????//以上看上去都沒(méi)什么問(wèn)題,打出來(lái)的值也對(duì) ????????mDelayuS(200); ????while(1){ ????????len=0; ????????memset(RxBuffer,0x78,sizeof(RxBuffer));//初始化值 ???????? ????????UH_RX_CTRL=UH_RX_CTRL|bUH_R_RES;//主機(jī)響應(yīng)控制 ????????UH_TX_CTRL=UH_TX_CTRL|bUH_T_RES;//主機(jī)響應(yīng)控制 ???????? ????????//endp:0不報(bào)錯(cuò)但收到長(zhǎng)度為0 ????????//endp:1收到長(zhǎng)度126字節(jié),但RxBuffer內(nèi)容全是初始值 ????????//endp:2、3報(bào)錯(cuò)USB_INT_ST為0x03 ????????UH_EP_PID=USB_PID_IN<<4|0x01;//指定令牌PID和目的端點(diǎn)號(hào) ???????? ????????UIF_TRANSFER=0;//允許傳輸 ????????for(i=WAIT_USB_TOUT_200US;i!=0&&UIF_TRANSFER==0;i--);//等待傳輸完成 ????????UH_EP_PID=0x00;//停止USB傳輸 ????????if(UIF_TRANSFER==0){ ????????????printf("ISOCERROR::NoTransact\n"); ????????????while(1){mDelaymS(1000);} ????????} ????????if(U_TOG_OK){ ????????????printf("ISOCTOG_OKsuccess\n"); ????????????break; ????????} ???????? ????????s=USB_INT_ST&MASK_UIS_H_RES;//USB設(shè)備應(yīng)答狀態(tài)MASK_UIS_H_RES:0x0F ????????if(s==USB_PID_STALL){ ????????????printf("ISOCERROR::STALL:%02X\n",(UINT16)(s)); ????????????while(1){mDelaymS(1000);} ????????} ????????else{ ????????????if(s==USB_PID_NAK){ ????????????????; ????????????} ????????????else{ ????????????????if(s){ ????????????????????printf("ISOCERROR::othererror:%02X%02X\n",(UINT16)(s),(UINT16)USB_INT_ST); ????????????????????while(1){mDelaymS(1000);} ????????????????} ????????????} ????????} ????????len=USB_RX_LEN; ????????if(len>4){ ????????????//len大于0時(shí),RxBuffer卻總?cè)渴浅跏蓟闹? ????????????if(RxBuffer[0]!=0x78&&RxBuffer[1]!=0x78&&RxBuffer[2]!=0x78&&RxBuffer[3]!=0x78){ ????????????????printf("ISOClen::%02X\n",(UINT16)len);//能夠看到len:0x7E,但數(shù)據(jù)在哪里呢 ????????????????for(i=0;i
len = USB_RX_LEN;
? ? if(len > 4) {
? ? ? ? if(RxBuffer[0]!=0x78 && RxBuffer[1]!=0x78 && RxBuffer[2]!=0x78 && RxBuffer[3]!=0x78) {??
? ? ? ? ? ? printf("ISOC len::%02X\n", (UINT16)len);
? ? ? ? ? ? for(i = 0; i < len && i < sizeof(RxBuffer); i ++) {
? ? ? ? ? ? ? ? printf("%02X ", (UINT16)(RxBuffer[i]));
? ? ? ? ? ? }
? ? ? ? ? ? printf("\n");
? ? ? ? }
? ? ? ? //else {
? ? ? ? //? ? printf("ISOC data zero len::%02X\n", (UINT16)len);
? ? ? ? //}
? ? }
? ? mDelayuS(15);
。。。 。。。
}
修改USBHostTransact()函數(shù),在賦值tog時(shí),同時(shí)將應(yīng)答狀態(tài)修改到無(wú)響應(yīng)。
直接調(diào)用這個(gè)函數(shù),而不是在主循環(huán)中嘗試獨(dú)立執(zhí)行每一步。
其次USB設(shè)備通常需要根據(jù)類協(xié)議、廠商協(xié)議來(lái)進(jìn)行初始化。確保前面的初始化的步驟準(zhǔn)確、完善,才可能實(shí)現(xiàn)同步端點(diǎn)上的數(shù)據(jù)傳輸。