CH374S讀取描述符

操作USB的代碼是CH374EVT中的HOST.C程序,當(dāng)程序運行到HostTransact374()函數(shù)的M_IS_HOST_IN_DATA( s )語句時,結(jié)果總為0。查看CH374INC.H頭文件時,發(fā)現(xiàn)這個宏的定義如下 #define M_IS_HOST_IN_DATA( status ) ( ( (status) & BIT_STAT_DEV_RESP & ~ ( DEF_USB_PID_DATA0 ^ DEF_USB_PID_DATA1 ) )== ( DEF_USB_PID_DATA0 & DEF_USB_PID_DATA1 ) ),其中status的值為USB SETUP階段得到的0x14,而其余的值在頭文件中均有定義,但如果status的值為0x14的話,此宏的結(jié)果必為0,因而也無法得到所需的描述符值,麻煩請問該如何解決這一問題,謝謝!

剛才搞錯了,根據(jù)程序可以得知,讀取描述符需要執(zhí)行兩次HostTransact374()函數(shù),第一次為PID == DEF_USB_PID_SETUP時,此時得到的REG_USB_STATUS值為0x92,HostTransact374()的值為0x14,而當(dāng)?shù)诙螆?zhí)行HostTransact374()時,得到的REG_USB_STATUS值為0x8e,HostTransact374()的值為0x2e,與所需的設(shè)備描述符值0x14不一致。所以想請教出現(xiàn)這種情況的原因是什么?


第一次和第二次發(fā)送HostTransact374(),兩次讀取的都是什么描述符,是不是一樣的描述符?


兩次HostTransact374()都是在HostCtrlTransfer374()里通過WaitHostTransact374()調(diào)用的,第一次是PID == DEF_USB_PID_SETUP時調(diào)用,HostTransact374()得到的結(jié)果為0x14,第二次是當(dāng)PID == DEF_USB_PID_IN時調(diào)用的,HostTransact374()得到的結(jié)果為0x2e.代碼如下: uint8_t HostCtrlTransfer374( puint8_t ReqBuf, puint8_t DatBuf, puint8_t RetLen )

{ uint8_t s, len, count, total; uint8_t tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, 0, 200 ); //第一次通過WaitHostTransact374()調(diào)用HostTransact374() if ( s == USB_INT_SUCCESS ) { tog = 1; total = *( ReqBuf + 6 ); if ( total && DatBuf ) { len = total; if ( *ReqBuf & 0x80 ) { while ( len ) { mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_IN, tog, 200 ); //第二次調(diào)用 if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count == 0 || ( count & ( UsbDevEndpSize - 1 ) ) ) break; tog = tog ? 0 : 1; } tog = 0; } else { while ( len ) { mDelayuS( 100 ); count = len >= UsbDevEndpSize ? UsbDevEndpSize : len; Write374Block( RAM_HOST_TRAN, count, DatBuf ); Write374Byte( REG_USB_LENGTH, count ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); if ( s != USB_INT_SUCCESS ) break; DatBuf += count; len -= count; tog = tog ? 0 : 1; } tog = 1; } total -= len; } if ( s == USB_INT_SUCCESS ) { Write374Byte( REG_USB_LENGTH, 0 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, ( tog ? DEF_USB_PID_IN : DEF_USB_PID_OUT ), 1, 200 ); if ( tog && s == USB_INT_SUCCESS ) { if ( Read374Byte( REG_USB_LENGTH ) ) s = USB_INT_BUF_OVER; } } } if ( RetLen ) *RetLen = total; return( s ); }


你是想獲取描述符?如果是這樣的話,發(fā)送HostCtrlTransfer374后如果成功的話,不需要發(fā)IN令牌讀取數(shù)據(jù),數(shù)據(jù)已經(jīng)在DatBuf中


謝謝您的回答!將IN令牌讀取數(shù)據(jù)去掉后, GetDeviceDescr()和SetUsbAddress()運行正確,但是當(dāng)執(zhí)行到GetConfigDescr()時,HostCtrlTranact374的返回值為0x20,表示USB反應(yīng)超時,所以想請教一下,這種問題會不會是由USB設(shè)備的描述符不正確造成的?現(xiàn)在的描述符是: uint8_t SetupGetDevDescr[] = { 0x80, 0x06, 0x00, 0x01, 0x00, 0x00, 0x12, 0x00 };

uint8_t SetupGetCfgDescr[] = { 0x80, 0x06, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00 };

uint8_t SetupSetUsbAddr[] = { 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 };

uint8_t SetupSetUsbConfig[] = { 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };


描述符要根據(jù)實際設(shè)備的種類修改的,你獲取配置備描述的請求是正確的,如果你能獲取設(shè)備描述符,那么獲取配置描述符的可能性非常大,因為兩者沒有什么區(qū)別,除非你BUF數(shù)據(jù)傳入到形參中有問題,或者BUF賦值的有問題


謝謝您的回答,GetDeviceDescr()和GetConfigDescr()的參數(shù)buf都是沒有賦值和初始化的,只是將其定義為一個uint8_t的數(shù)組變量,程序中的聲明是這樣的: uint8_t buf[64]; 除此之外,主函數(shù)并沒有其他的對buf的操作,而且GetDeviceDescr()可以讀取的話,那GetConfigDescr()也應(yīng)該可以的,并且如果我將buf初始化為0x00后,那么程序HostCtrlTranact374()直接返回0x17,表示buf太長,此時甚至GetDeviceDescr()都無法讀取。所以我懷疑可能是其他方面的原因,不知道貴公司的工程師有沒有碰到過這中問題,還請不吝賜教啦! 謝謝


初始化BUF會對您獲取設(shè)備描述符產(chǎn)生影響?這個不會的,除非你的BUF類有問題。你監(jiān)測下在獲取配置描述符時,WaitHostTransact374返回的S值是多少(看SETUP有沒有成功)?順便把你的硬件原理圖發(fā)送至我郵箱


是的,初始化后會執(zhí)行if ( len < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL ) s = USB_INT_BUF_OVER; 從而s的值變?yōu)?x17?,F(xiàn)在無法獲取配置描述符,WaitHostTransact374返回0x20,而在獲取設(shè)備描述符和設(shè)定USB地址時,WaitHostTransact374返回0x14,usb的硬件原理圖已發(fā)送。 謝謝!


Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); 這個函數(shù)之后調(diào)用下這個函數(shù): UINT8 buf[8]; Read374Block( RAM_HOST_TRAN, 8, buf ); 看下buf里面的數(shù)據(jù)是什么樣的數(shù)據(jù),是不是你寫進去的數(shù)據(jù)。


你自己想想初始化BUF會對獲取設(shè)備描述符有影響,可能么?!BUF只是用來裝設(shè)備返回的數(shù)據(jù)的,初始化與不初始化,對設(shè)備是否返回數(shù)據(jù)是沒有影響的,你最好先把這個問題解決。len值是多少?


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

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