CH554如何HOST如何進(jìn)行USB同步傳輸

您好。我現(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)配置如下圖。

image.png

image.png


您好,按照您的回復(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í)行每一步。

image.png


其次USB設(shè)備通常需要根據(jù)類協(xié)議、廠商協(xié)議來(lái)進(jìn)行初始化。確保前面的初始化的步驟準(zhǔn)確、完善,才可能實(shí)現(xiàn)同步端點(diǎn)上的數(shù)據(jù)傳輸。


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

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