CH374設(shè)備模式檢測(cè)不到有傳輸中斷

我用CH374T(3.3V)工作在設(shè)備模式,可一插入電腦后,只檢測(cè)到有總線復(fù)位,掛起及換醒的中斷,但就沒有傳輸中斷,所以就提交不到Descriptors,電腦無法得知此設(shè)備。請(qǐng)問是什么問題呢?

PC提示找到新硬件了嗎?你是如何判斷產(chǎn)生總線復(fù)位,掛起及換醒的中斷的?可能是你沒有正確的初始化!把你的程序貼出來看看!


PC找到無法適別的硬件。我是簡(jiǎn)單通過LED燈后指示發(fā)生什么中斷的。以下的部分初始化程序,基本上與DEMO的一樣。 /* CH374初始化子程序 */ void CH374DeviceInit( void ) { //if (Read374Byte(REG_SYS_INFO) & 1) RLED = 0; Write374Byte( REG_USB_SETUP, 0x00 ); Write374Byte( REG_USB_ADDR, 0x00 ); Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_NAK( 0 ) ); Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( 0 ) ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( 0 ) ); Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); // 清所有中斷標(biāo)志 Write374Byte( REG_INTER_EN, BIT_IE_TRANSFER | BIT_IE_BUS_RESET | BIT_IE_USB_SUSPEND ); // 允許傳輸完成中斷和USB總線復(fù)位中斷以及USB總線掛起中斷,芯片喚醒完成中斷 Write374Byte( REG_SYS_CTRL, BIT_CTRL_OE_POLAR | BIT_CTRL_USB_POWER); // 對(duì)于CH374T或者UEN引腳懸空的CH374S必須置BIT_CTRL_OE_POLAR為1 Write374Byte( REG_USB_SETUP, BIT_SETP_TRANS_EN ); // 啟動(dòng)USB設(shè)備 /* 下面啟用USB中斷,CH374的INT#引腳可以連接到單片機(jī)的中斷引腳,中斷為低電平有效或者下降沿有效, 如果不使用中斷,那么也可以用查詢方式,由單片機(jī)程序查詢CH374的INT#引腳為低電平 */ IT0 = 0; /* 置外部信號(hào)為低電平觸發(fā) */ IE0 = 0; /* 清中斷標(biāo)志 */ EX0 = 1; /* 允許CH374中斷,假定CH374的INT#引腳連接到單片機(jī)的INT0 */ }

void ch374intr() interrupt 0 {

u8 cnt, SetupReq, SetupLen; u8 dat, cmd; u8 *pDescr; //u8 *buf; USB_DATA_PKT udp;

#define int_status dat /* 節(jié)約一個(gè)變量存儲(chǔ)單元 */ /* IE0 = 0; 清中斷標(biāo)志,與單片機(jī)硬件有關(guān),對(duì)應(yīng)于INT0中斷 */ int_status = Read374Byte( REG_INTER_FLAG ); // 獲取中斷狀態(tài) if ( int_status & BIT_IF_BUS_RESET ) { // USB總線復(fù)位 Write374Byte( REG_USB_ADDR, 0x00 ); // 清USB設(shè)備地址 Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_NAK( 0 ) ); Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( 0 ) ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( 0 ) ); Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_BUS_RESET ); // 清中斷標(biāo)志 } else if ( int_status & BIT_IF_TRANSFER ) { /* transfer complete */ int_status = Read374Byte( REG_USB_STATUS ); /* get usb status*/ //RLED = 0; switch( int_status & BIT_STAT_PID_ENDP ) { // USB設(shè)備中斷狀態(tài) case USB_INT_EP2_OUT: { // bulk endpoint out if ( int_status & BIT_STAT_TOG_MATCH ) { // 僅同步包 cnt = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, cnt, (u8 *)&udp.down ); if ( cnt == 0 ) { /* 長度為0,沒有數(shù)據(jù),在某些應(yīng)用中也可以將長度0定義為一種特殊命令 */ Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ); /* 同步觸發(fā)位不變,設(shè)置USB端點(diǎn)2的IN正忙,返回NAK */ RLED = 0; return; } if ( udp.down.mCommand != (u8)( ~ udp.down.mCommandNot ) ) /* 命令包反碼校驗(yàn)通過,否則放棄該下傳包 */ { RLED = 0; return; } if ( udp.down.mCommand == USB_CMD_SET_LED ) { RLED = (bit)udp.down.mBuffer[0]; GLED = (bit)(udp.down.mBuffer[0] >> 1); } else if ( udp.down.mCommand == USB_CMD_GET_STATUS ) { cmd = udp.down.mBuffer[0]; udp.up.hadr = ~cmd; udp.up.mLength = 1; udp.up.mBuffer[0] = 0xaa; //buf = (u8 *)&udp.up; cnt = 3; } else if ( udp.down.mCommand == USB_CMD_GET_DATA ) { pvdata = udp.up.mBuffer; vcnt = get_video(pvdata); udp.up.hadr = 0xaa; udp.up.mLength = sizeof(*pvdata); //buf = (u8 *)&udp.up; cnt = udp.up.mLength + 2; } else if ( udp.down.mCommand == USB_CMD_GET_REG ) { cmd = udp.down.mCommand; udp.up.hadr = cmd; udp.up.mLength = 1; udp.up.mBuffer[0] = get_reg(udp.down.mBuffer[0]); //buf = (u8 *)&udp.up; cnt = 3; } else if ( udp.down.mCommand == USB_CMD_SET_REG ) { set_reg(udp.down.mBuffer[0], udp.down.mBuffer[1]); dat = get_reg(udp.down.mBuffer[0]); cmd = udp.down.mCommand; udp.up.hadr = cmd; udp.up.mLength = 1; udp.up.mBuffer[0] = dat; //buf = (u8 *)&udp.up; cnt = 3; } else if ( udp.down.mCommand == USB_CMD_TEST_RINTV ) { TL0 = 0; TH0 = 0; cntt = 0; rintvl = 1; cmd = udp.down.mCommand; udp.up.hadr = TH0; //buf = (u8 *)&udp.up; cnt = 1; } //cnt = pudp->up.mLength + (UINT8)( & ( (USB_UP_PKT *)0 ) -> mBuffer ); Write374Byte( REG_USB_LENGTH, cnt ); Write374Block( RAM_ENDP1_TRAN, cnt, (u8 *)&udp.up ); Write374Byte( REG_USB_ENDP2, Read374Byte( REG_USB_ENDP2 ) ^ BIT_EP2_RECV_TOG); Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_ACK( Read374Byte( REG_USB_ENDP1 ), cnt )); } //end of if ( int_status & BIT_STAT_TOG_MATCH ) break; } case USB_INT_EP2_IN: { // 批量端點(diǎn)上傳成功,未處理 Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_TRAN_TOG ); // Write374Index( REG_USB_ENDP2 ); // 對(duì)于并口連接可以用本行及下面一行代替上一行的程序,減少寫一次index的時(shí)間,提高效率 // Write374Data( M_SET_EP2_TRAN_NAK( Read374Data0( ) ) ^ BIT_EP2_TRAN_TOG ); break; } case USB_INT_EP1_IN: { // 中斷端點(diǎn)上傳成功,未處理 Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ^ BIT_EP1_TRAN_TOG ); break; } case USB_INT_EP0_SETUP: { USB_SETUP_REQ SetupReqBuf; cnt = Read374Byte( REG_USB_LENGTH ); RLED = 0; if ( cnt == sizeof( USB_SETUP_REQ ) ) { Read374Block( RAM_ENDP0_RECV, cnt, (u8 *)&SetupReqBuf ); SetupLen = SetupReqBuf.wLengthL; if ( SetupReqBuf.wLengthH || SetupLen > 0x7F ) SetupLen = 0x7F; // 限制總長度 cnt = 0; // 默認(rèn)為成功并且上傳0長度 if ( ( SetupReqBuf.bType & DEF_USB_REQ_TYPE ) != DEF_USB_REQ_STAND ) { /* 只支持標(biāo)準(zhǔn)請(qǐng)求 */ cnt = 0xFF; // 操作失敗 } else { // 標(biāo)準(zhǔn)請(qǐng)求 SetupReq = SetupReqBuf.bReq; // 請(qǐng)求碼 switch( SetupReq ) { case DEF_USB_GET_DESCR: switch( SetupReqBuf.wValueH ) { case 1: pDescr = (u8 *)( &MyDevDescr[0] ); cnt = sizeof( MyDevDescr ); break; case 2: pDescr = (u8 *)( &MyCfgDescr[0] ); cnt = sizeof( MyCfgDescr ); break; case 3: switch( SetupReqBuf.wValueL ) { case 1: pDescr = (u8 *)( &MyManuInfo[0] ); cnt = sizeof( MyManuInfo ); break; case 2: pDescr = (u8 *)( &MyProdInfo[0] ); cnt = sizeof( MyProdInfo ); break; case 0: pDescr = (u8 *)( &MyLangDescr[0] ); cnt = sizeof( MyLangDescr ); break; default: cnt = 0xFF; // 操作失敗 break; } break; default: cnt = 0xFF; // 操作失敗 break; } if ( SetupLen > cnt ) SetupLen = cnt; // 限制總長度 cnt = SetupLen >= RAM_ENDP0_SIZE ? RAM_ENDP0_SIZE : SetupLen; // 本次傳輸長度 Write374Block( RAM_ENDP0_TRAN, cnt, pDescr ); /* 加載上傳數(shù)據(jù) */ SetupLen -= cnt; pDescr += cnt; break; case DEF_USB_SET_ADDRESS: SetupLen = SetupReqBuf.wValueL; // 暫存USB設(shè)備地址 break; case DEF_USB_GET_CONFIG: Write374Byte( RAM_ENDP0_TRAN, UsbConfig ); if ( SetupLen >= 1 ) cnt = 1; break; case DEF_USB_SET_CONFIG: UsbConfig = SetupReqBuf.wValueL; break; case DEF_USB_CLR_FEATURE: if ( ( SetupReqBuf.bType & 0x1F ) == 0x02 ) { // 不是端點(diǎn)不支持 switch( SetupReqBuf.wIndexL ) { case 0x82: Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ); break; case 0x02: Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ); break; case 0x81: Write374Byte(


(1)Write374Byte( REG_USB_SETUP, BIT_SETP_TRANS_EN ); // 啟動(dòng)USB設(shè)備,你并沒有啟用上拉電阻,計(jì)算機(jī)根本不會(huì)檢測(cè)到設(shè)備插入,374也不會(huì)產(chǎn)生任何中斷,不知道你所說的總線復(fù)位,喚醒中斷是如何獲得的。 (2)中斷程序里面不允許“return”,否則程序會(huì)跑飛 (3)建議先用示例程序,熟悉374的操作流程后,再根據(jù)自己的需要進(jìn)行修改。


硬件電路的+U腳已有上拉,CH374內(nèi)部還需再拉高嗎? 總線復(fù)位,喚醒中斷確實(shí)是檢測(cè)得到,我是在相應(yīng)的中斷標(biāo)志檢測(cè)入口處加LED的顯示,那就很容易知道那個(gè)中斷發(fā)生了。


不是內(nèi)部需要上拉是外部不需要上拉,我們374芯片內(nèi)部有上拉 正確的方式應(yīng)該是: Write374Byte( REG_USB_SETUP, BIT_SETP_TRANS_EN | BIT_SETP_PULLUP_EN ); // 啟動(dòng)USB設(shè)備


但就一直沒檢測(cè)到傳輸中斷標(biāo)志。我之前是用CH372B的,因?yàn)樗恢С值葧r(shí)傳輸,所以我不得不換用CH374T的。


你仔細(xì)檢查下在產(chǎn)生只檢測(cè)到有總線復(fù)位,掛起及換醒的中斷之后,你有沒有去清中斷寄存器,如果不清的話就會(huì)出現(xiàn)你說的上面的現(xiàn)象,不斷的出現(xiàn)復(fù)位,掛起及喚醒中斷。


很郁悶?。∥矣肈EMO示例程序的從模式部分還是不行,就是檢測(cè)不到有傳輸中斷標(biāo)志!中斷寄存器都清過了,初始化時(shí)寫入的寄存器再讀回也是正確的。一插入電腦后,先來一個(gè)總線復(fù)位中斷,再來幾會(huì)掛起及換醒的中斷之后,就提示是無法適別的設(shè)備。怎么也沒有傳輸中斷這個(gè)發(fā)生,程序就沒法提交Descriptors。怎么回這樣的呢?為什么插入電腦后CH374T產(chǎn)生不了傳輸中斷呢?難道IC壞了?


(1)DEMO示例程序肯定不會(huì)有問題。 (2)可能是你程序中某些地方?jīng)]處理好,方便的話,你把整個(gè)程序結(jié)構(gòu)整理一下,便于我們分析,打包上傳。我們來測(cè)試一下。


問題解決了!是硬件的問題。原來我是用CH372B的,配的是12MHz晶振,后來因?yàn)橐С值葧r(shí)傳輸就直接換用CH374T,卻不知道要用24MHz晶振。直是傻傻的錯(cuò)誤! 但之后又發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,DEMO示例程序中的Read374Block函數(shù)竟然編譯出死循環(huán)! void Read374Block( u8 mAddr, u8 mLen, u8 *mBuf ) /* 從指定起始地址讀出數(shù)據(jù)塊 */ { Write374Index( mAddr ); while ( mLen -- ) *mBuf++ = Read374Data( ); }

我在這附上了圖片,R5就是保存著mLen的值,但只是做遞減就不對(duì)R5做判斷。真奇怪的現(xiàn)象,請(qǐng)問是什么原因呢?200842410311457.jpg


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

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