我寫了一個測試板數(shù)據(jù)傳輸測試軟件,工作過程如下: 主程序調(diào)用mDownloadData函數(shù)向單片機寫一組數(shù)據(jù),單片機收到數(shù)據(jù)后, 向端口對數(shù)據(jù)處理,發(fā)出中斷,通知上位機讀取處理過的數(shù)據(jù) 發(fā)送數(shù)據(jù)是使用DEF_CMD_DOWN_DATA命令 上位機程序片斷如下: //-------------------------------------------------------------- // 中斷服務程序是由CH375驅(qū)動程序中斷后通過DLL在應用層模擬調(diào)用的 VOID CALLBACK mInterruptEvent( PUCHAR iBuffer ) { UINT iKeyCode; CString csWindow = "UsbTest"; HWND hWnd = ::FindWindowEx(NULL,NULL,NULL,csWindow); if ( IsWindow(hWnd) ) {// CH375產(chǎn)生中斷后,產(chǎn)生一個消息通知主程序 if ( iBuffer[0] == 1 ) // 檢查中斷特征數(shù)據(jù) { //.... } else { if ( iBuffer[0] == 2 ) { //... } else { // 中斷特征數(shù)據(jù)為3,表明有上傳數(shù)據(jù) if ( iBuffer[0] == 3 ) // 檢查中斷特征數(shù)據(jù) { PostMessage( hWnd, IDC_INT_READ, iBuffer[0] ,iKeyCode); } } } }

} LONG CUsbTestDlg::OnRead(UINT wParam,LONG lParam) { mCOMMAND_PACKET mDemoReq; ULONG i,nLength; UCHAR iBuffer[4096];

wParam = 32; if ( wParam > 4096 ) { AfxMessageBox("單次上傳數(shù)據(jù)長度超過4096字節(jié)"); return( FALSE ); } nLength = wParam; if ( CH375ReadData( mIndex, iBuffer, &nLength ) ) // 通過CH375接收數(shù)據(jù),成功 { return( nLength ); } else AfxMessageBox("CH375ReadData 上傳數(shù)據(jù)失敗");

return( 0 ); } UINT CUsbTestDlg::mDownloadData( UCHAR *iBuffer, UINT iLength ) { mCOMMAND_PACKET mDemoReq; ULONG mLength;

if ( iLength > 4096 ) { AfxMessageBox( "單次下傳數(shù)據(jù)長度超過4096字節(jié)"); return( FALSE ); } mDemoReq.mCommandCode = DEF_CMD_DOWN_DATA; // 連續(xù)下傳數(shù)據(jù)塊 mDemoReq.mCommandCodeNot = ~ DEF_CMD_DOWN_DATA; mDemoReq.mBufferID = ACCESS_MCS51_XRAM; mDemoReq.mBufferAddr = 0x8200; mDemoReq.mLength = iLength; // 傳輸數(shù)據(jù)總長度 mLength = CONST_CMD_LEN; // 命令包的長度 if ( CH375WriteData( mIndex, &mDemoReq, &mLength ) ) // 通過CH375發(fā)送命令包,成功 { mLength = iLength; if ( ( mLength % 64 ) == CONST_CMD_LEN ) mLength ++; if ( CH375WriteData( mIndex, iBuffer, &mLength ) ) ; else { AfxMessageBox("CH375WriteData 下傳數(shù)據(jù)失敗"); mLength = 0; } } else { AfxMessageBox("CH375WriteData 發(fā)送命令失敗,DEF_CMD_DOWN_DATA"); mLength = 0; }

return( mLength ); } //--------------------------------------- 下位機程序片斷如下: / /* 上傳中斷數(shù)據(jù)子程序(通過中斷端點上傳),可選子程序 */ void LoadIntData( unsigned char c1, unsigned char c2 ) { unsigned int i; for ( i=1000; i!=0; i-- ) { /* 等待發(fā)送中斷數(shù)據(jù)完成,因為PC機每隔1毫秒就讀取中斷數(shù)據(jù),所以最多等待1毫秒 */ if ( FLAG_INT_WAIT == 0 ) break; /* 前次中斷數(shù)據(jù)已經(jīng)被PC機取走 */ } /* 如果未與計算機相連,或者計算機中的應用程序未運行,則會出現(xiàn)超時,否則不超過1毫秒中斷數(shù)據(jù)就應該被PC機取走 */ EX0 = 0; /* 為了防止中途被中斷而亂了順序,必須先禁止中斷 */ CH375_CMD_PORT = CMD_WR_USB_DATA5; /* 向USB端點1的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ Delay2us( ); CH375_DAT_PORT = 2; /* 后續(xù)數(shù)據(jù)長度 */ /* 雖然每次可以上傳8個字節(jié), 但是本程序中用于鍵盤中斷, 所以每次只需要傳輸兩個字節(jié) */ FLAG_INT_WAIT = 1; /* 置中斷等待標志 */ CH375_DAT_PORT = c1; /* 發(fā)送中斷數(shù)據(jù)1 */ CH375_DAT_PORT = c2; /* 發(fā)送中斷數(shù)據(jù)2 */ EX0 = 1; /* 允許中斷 */ }

/* CH375中斷服務程序INT0,使用寄存器組1 */ void mCH375Interrupt( ) interrupt 0 using 1 {

CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態(tài)并取消中斷請求 */ Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */ InterruptStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ IE0 = 0; /* 清中斷標志,對應于INT0中斷 */ if ( InterruptStatus == USB_INT_EP2_OUT ) { /* 批量端點下傳成功 */ CH375_CMD_PORT = CMD_RD_USB_DATA; Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */ length = CH375_DAT_PORT; /* 首先讀取后續(xù)數(shù)據(jù)長度 */ if ( length == CONST_CMD_LEN ) { /* 命令塊長度總是CONST_CMD_LEN,分析并處理命令 */ for ( i=0; i if ( CMD_PKT.mCommandCode != (unsigned char)( ~ CMD_PKT.mCommandCodeNot ) ) return; switch ( CMD_PKT.mCommandCode ) { case DEF_CMD_GET_INFORM: break; case DEF_CMD_TEST_DATA:

break; case DEF_CMD_CLEAR_UP: break; case DEF_CMD_UP_DATA:

break; case DEF_CMD_DOWN_DATA:

break; default: break; } } else if ( length == 0 ) return; else { if ( CMD_PKT.mCommandCode == DEF_CMD_DOWN_DATA ) {

CurrentRamLen -= length; while ( length-- ) { *CurrentRamAddr = CH375_DAT_PORT; CurrentRamAddr ++; } /********************************************************* 我添加的代碼 **********************************************************/ LoadUpData( InformString1, 32 ); LoadIntData(1, 127 ); /***********************************************************/ } else { /* 未定義的命令 */ while ( length -- ) c1 = CH375_DAT_PORT; /* 丟棄數(shù)據(jù) */ } } } else if ( InterruptStatus == USB_INT_EP2_IN ) { }

} else if ( InterruptStatus == USB_INT_EP1_IN ) { } else { /* 內(nèi)置固件的USB方式下不應該出現(xiàn)其它中斷狀態(tài) */ } }