/* CH375中斷服務(wù)程序,假定CH375的INT#引腳連接到單片機的INT0,使用寄存器組1 */ void mCH375Interrupt( void ) interrupt 0 using 1 { UINT8 cnt; UINT8 dat; EX0 = 0; #define IntStatus dat /* 節(jié)約一個變量存儲單元 */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ IntStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ IE0 = 0; EX0 = 1;// 清中斷標志,與單片機硬件有關(guān),對應(yīng)于INT0中斷 */ if ( IntStatus == USB_INT_EP2_OUT ) { /* 批量端點下傳成功,接收到命令包 */
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ cnt = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ Print("EP2_OUT."); if( cnt ==1 ) { dat = CH375_RD_DAT_PORT( ); P1 = dat ; if( dat ==0x22 ) { P1 = dat ; CH375_WR_CMD_PORT(CMD_SET_ENDP5); CH375_WR_DAT_PORT(0x0E); Print("ML."); ClrScreen(); } else { P1 = dat ; CH375_WR_CMD_PORT(CMD_WR_USB_DATA5); CH375_WR_DAT_PORT(0x01); CH375_WR_DAT_PORT(dat); Print("SJ."); }
}
} else if ( IntStatus == USB_INT_EP2_IN ) { /* 批量數(shù)據(jù)發(fā)送成功,狀態(tài)包已發(fā)送 */ /* 釋放當前USB緩沖區(qū),收到上傳成功中斷后,必須解鎖USB緩沖區(qū),以便繼續(xù)收發(fā) */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); GotoXY(0,0); Print("EP2_IN."); } else if ( IntStatus == USB_INT_EP1_IN ) { /* 中斷數(shù)據(jù)發(fā)送成功,本程序未用到 */ //GotoXY(0,1); Print("EP1_IN."); CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當前USB緩沖區(qū) */ CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); CH375_WR_DAT_PORT(0x01); CH375_WR_DAT_PORT(0x55); ClrScreen(); }
/* 內(nèi)置固件的USB方式下不應(yīng)該出現(xiàn)其它中斷狀態(tài) */ } 大家?guī)兔匆幌?,這是CH375的中斷,主機先發(fā)送個數(shù)據(jù),然后向端口1發(fā)送數(shù)據(jù),在端口1的發(fā)送完中斷中向端口2發(fā)數(shù)據(jù),本來主機發(fā)一次,端口1,2分別上傳一次,但在主機端如果不讀端口2,端口1就發(fā)兩次,為什么?