關(guān)于CH374中斷

弱弱地問一下,因為CH374的INT#是低電平有效,但相應(yīng)的單片機(jī)輸入引腳空閑時就是低電平,怎么設(shè)置讓374INT#輸出是高電平呢?謝謝!

我們CH374芯片內(nèi)置上拉電阻,所以低電平有效,不能設(shè)置成高電平有效。你可以不連接中斷請求輸出引INT#,單片機(jī)程序可以通過查詢中斷標(biāo)志寄存器代替。


哦,那我通過查詢中斷寄存器了,但是還是有問題,就是我獲取設(shè)備描述符時,SETUP階段就不能成功。總是讀到的USB狀態(tài)寄存器為8C,這樣,設(shè)備應(yīng)答狀態(tài)是1100,即設(shè)備應(yīng)答錯誤或是超時無應(yīng)答。。。這樣可能的原因有哪些呢?謝謝!


在函數(shù)UINT8 HostTransact374( UINT8 endp_addr, UINT8 pid, BOOL tog )里,pid明明是等于DEF_USB_PID_SETUP(0x0D)的,為什么在 switch ( pid ) { case DEF_USB_PID_SETUP: case DEF_USB_PID_OUT: if ( r == DEF_USB_PID_ACK ) return( USB_INT_SUCCESS ); else if ( r == DEF_USB_PID_STALL || r == DEF_USB_PID_NAK ) return( r | 0x20 ); else if ( ! M_IS_HOST_TIMEOUT( s ) ) return( r | 0x20 ); // 不是超時/出錯,意外應(yīng)答 break; case DEF_USB_PID_IN: if ( M_IS_HOST_IN_DATA( s ) ) { // DEF_USB_PID_DATA0 or DEF_USB_PID_DATA1 if ( s & BIT_STAT_TOG_MATCH ) return( USB_INT_SUCCESS ); // 不同步則需丟棄后重試 } else if ( r == DEF_USB_PID_STALL || r == DEF_USB_PID_NAK ) return( r | 0x20 ); else if ( ! M_IS_HOST_TIMEOUT( s ) ) return( r | 0x20 ); // 不是超時/出錯,意外應(yīng)答 break; default: return( ERR_USB_UNKNOWN ); // 不可能的情況 break; 會執(zhí)行到case DEF_USB_PID_IN:,從而返回0x20呢,謝謝


上面是我單步執(zhí)行注意到的,還有就是case DEF_USB_PID_SETUP:里什么都沒有呀 ,必然會返回0x20呀。


Setup階段處理在HostCtrlTransfer374()函數(shù)里面,你仔細(xì)看一下程序就知道了,你在執(zhí)行到case DEF_USB_PID_IN:過不了設(shè)備沒返回給主機(jī)數(shù)據(jù),你CH374操作什么設(shè)備?首先保證你硬件連接沒問題,Init374Host( )配置正確。


CH374做主與一個記錄儀通信,硬件應(yīng)該沒問題呀,其實我程序還是有點不明白,是這樣的,在SETUP階段,是您說的那個函數(shù)HostCtrlTransfer374(),其中幾句如下: Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Read374Block( RAM_HOST_TRAN,8,bbb); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP階段,200mS超時 if ( s == USB_INT_SUCCESS ) { 。。。。。。 然后就是執(zhí)行函數(shù)WaitHostTransact374(),此時的PID是DEF_USB_PID_SETUP,在該函數(shù)里會執(zhí)行HostTransact374()函數(shù),而函數(shù)HostCtrlTransfer374()里的s(操作狀態(tài)代碼)就是函數(shù)HostTransact374()的返回值,像我第三樓所說的,在這函數(shù)里的PID仍然是DEF_USB_PID_SETUP,但是case DEF_USB_PID_SETUP:里什么都沒有,必然會返回0x20呀,怎么會有USB_INT_SUCCESS返回呢?萬分感謝您的不吝賜教~


Init374Host( )配置是正確的呀(我的UEN是懸空的) void Init374Host( void ) // 初始化USB主機(jī) { Write374Byte( REG_USB_SETUP, 0x00 );/*REG_USB_SETUP: USB配置 */ SetHostUsbAddr( 0x00 ); Write374Byte( REG_USB_H_CTRL, 0x00 ); Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); // 清所有中斷標(biāo)志 // Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER ); // 允許傳輸完成中斷,因為本程序使用查詢方式檢測USB設(shè)備插拔,所以無需USB設(shè)備檢測中斷 Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER | BIT_IE_DEV_DETECT ); // 允許傳輸完成中斷和USB設(shè)備檢測中斷 Write374Byte( REG_SYS_CTRL, BIT_CTRL_OE_POLAR ); // 對于CH374T或者UEN引腳懸空的CH374S必須置BIT_CTRL_OE_POLAR為1 HostSetBusFree( ); // USB總線空閑 }


DEF_USB_PID_SETUP相當(dāng)于case DEF_USB_PID_OUT,只有返回ACK也就是執(zhí)行if ( r == DEF_USB_PID_ACK ) return( USB_INT_SUCCESS );才會有USB_INT_SUCCESS返回。


哦~是這樣的,沒注意break。。。囧。。。謝謝


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

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