CH372EVT里面的程序是可以用的,你只要修改3個讀寫子函數(shù)以及中斷引腳就可以實現(xiàn)和計算機(jī)的通信
我的程序: #pragma NOAREGS #include #include #include "CH375INC.H" /* 頭文件,在網(wǎng)上下載的CH372或者CH375評估板資料中有 */
sbit CH375_A0 = P3^7; sbit CH375_RD = P3^5; sbit CH375_WR = P3^4;
#define CH375_D0_D7 P1 volatile unsigned char rd_dat;
void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根據(jù)單片機(jī)的時鐘選擇初值 */ }
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時 */ delay2us();
CH375_D0_D7 = cmd; CH375_A0 = 1; /*選擇CH375的命令口*/ // CH375_D0_D7_DIR = output; /*對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸出方向*/ CH375_RD = 1; /*如果I/O默認(rèn)電平是高電平,那么這是可選操作*/
CH375_WR = 0;
CH375_WR = 1;
CH375_A0 = 0; // CH375_D0_D7_DIR = input; /*對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向*/ CH375_D0_D7 = 0xFF; /*對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平*/ //******************** delay2us(); }
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */
CH375_D0_D7 = dat; // CH375_D0_D7_DIR = output; /*對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸出方向*/
CH375_WR = 0;
CH375_WR = 1;
// CH375_D0_D7_DIR = input; /*對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向*/ CH375_D0_D7 = 0xFF; /*對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平*/ //********************
}
unsigned char CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */ // delay1us(); /* 因為MCS51單片機(jī)較慢所以實際上無需延時 */ // ******************** 注釋中是用普通I/O引腳模擬8位并口的時序
// CH375_D0_D7_DIR = input; /*對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向*/ CH375_D0_D7 = 0xFF; /*對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平,便于輸入*/
CH375_RD = 0;
// unsigned char dat; rd_dat = CH375_D0_D7; CH375_RD = 1;
CH375_D0_D7 = 0xFF; /*對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平*/ return( rd_dat ); //********************
}
void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }
void CH375_Init( ) { unsigned char i; /* 測試CH375是否正常工作,可選操作,通常不需要 */ { CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫入測試數(shù)據(jù) */ i = ~ 0x55; /* 返回數(shù)據(jù)應(yīng)該是測試數(shù)據(jù)取反 */ if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); /* 延時50ms */ }
CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ // for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ for ( ;; ) { if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } /* if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */ /* 下述啟用中斷,假定CH375連接在INT0 */ IT0 = 0; /* 置外部信號為低電平觸發(fā) */ IE0 = 0; /* 清中斷標(biāo)志 */ EX0 = 1; /* 允許CH375中斷 */ }
void mCh375Interrupt( ) interrupt 2 using 1 /* 2 外部中斷1; INT1 */ { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機(jī)應(yīng)用程序測試數(shù)據(jù)是否正確 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }
main( ) { Delay50ms( ); /* 延時等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號則不必延時 */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允許中斷 */ while ( 1 ); /* 以下指令開始工作循環(huán),等待PC機(jī)命令進(jìn)行操作 */ }
問題: 1,CH375_D0_D7_DIR = input; /*對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向*/ 這個DIR在這里需要用嗎?我把這個都屏蔽了的。有錯嗎?
2,/* 測試CH375是否正常工作,可選操作,通常不需要 */
CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ 這個子程序,我怎么也通不過,不需要操作嗎??如何繼續(xù)下面的設(shè)置模式啊???
3,我的讀,寫時序都是很符合單片機(jī)的要求的,為何測試還是通不過呢?我應(yīng)該從哪個方面著手檢查?
期待答復(fù),謝謝
原理圖不知道怎么抓拍上來,就簡單說一下吧,采用的是ds1給的非總線擴(kuò)展的那個圖,除了引腳稍微有所調(diào)整,其他的都是一樣的。我還要從哪里檢查比較合適?麻煩給點意見,謝謝
1、CH375_D0_D7_DIR = input;這個是對于可以設(shè)置I/O方向的單片機(jī)來說的,你采用89c2051就不需要了; 2、測試命令 CMD_CHECK_EXIST返回的是什么值? 測試命令通不過的話,說明你的硬件上還存在問題,先檢查晶振是不是正常起振了,再檢查一下連線。測試命令如果過不了的話,下面的設(shè)置模式是不會成功的。
我今天調(diào)試,CMD_CHECK_EXIST返回值 /* 返回數(shù)據(jù)應(yīng)該是測試數(shù)據(jù)取反 */這個已經(jīng)可以做到了
設(shè)置模式2成功與否,我應(yīng)該從哪里得知呢?但是依舊無法識別外部設(shè)備。
void set_usb_mode( unsigned char mode ) { unsigned char i; unsigned char RD_Data; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( mode ); for( i=100; i!=0; i-- ) /* 等待設(shè)置模式操作完成,不超過30uS */ { RD_Data=CH375_RD_DAT_PORT(); if( RD_Data == CMD_RET_SUCCESS ) return; /* 成功 */ } } 觀察窗口RD_Data顯示的是2,這樣代表成功了嗎?但是為何還是無法識別外部硬件呢?我還需要怎么弄呢?請指教,謝謝?。?!
PS:我下載了DRV.EXE和 DRV.ZIP,將DRV.EXE放到了解壓的DRV的DLL動態(tài)鏈接庫同一目錄下,已經(jīng)預(yù)安裝完成了。
觀察窗口RD_Data顯示的是2,這樣代表成功了嗎?但是為何還是無法識別外部硬件呢?我還需要怎么弄呢?請指教,謝謝?。?! ---------- 修正一下:剛剛看了datasheet,if( RD_Data == CMD_RET_SUCCESS ),我調(diào)試可以看到RD_Data=51H,代表操作是成功的,這個和設(shè)置模塊有關(guān)系嗎?我現(xiàn)在關(guān)鍵的問題就是外部設(shè)備依舊無法識別?。?!
如果RD_Data返回51H的話說明設(shè)置模式成功了。前面測試命令過了的話,設(shè)置模式一般都能成功的。按你所說你的設(shè)置模式應(yīng)該是成功的,出現(xiàn)提示未知設(shè)備可能有幾個原因: 1、CH375的GND以及單片機(jī)的GND必須與USB的GND可靠地連接; 2、USB的D+和D-信號線接反了,導(dǎo)致通信失敗; 3、D+和D-不需要串電阻,如果一定要串也不能大于5歐姆; 4、USB信號線必須用標(biāo)準(zhǔn)的USB線;
感謝樓上的luoye268268,我按照這四個依次檢查了,我終于發(fā)現(xiàn),原來當(dāng)初我在接線的時候曾經(jīng)接反了D+ D-,甚至電源和地也接反了,于是燒壞過CH372,雖然后來割了電路板修正,但是片子燒壞我一直沒有注意了,以為不會燒壞,現(xiàn)在換了一個進(jìn)行仿真,終于成功的安裝了驅(qū)動,非常感謝了 同時也感謝hcn的指導(dǎo)。 接下來估計還有更多問題要麻煩你們
樓上的luoye268268,驅(qū)動安裝成功,為什么拔出來之后再插上去,還是無法識別呢?