這是從讀寫U盤的程序中修改出來的,就是一個簡單的發(fā)送數(shù)據(jù)給PC機的程序,單片機用的是MSP430F149,CH375工作電壓接的3.3V,調試工具用的是DEBUG372.EXE,直接就點擊使用了(也不知道是不是還要安裝驅動什么的)但是顯示無法打開設備,郁悶呀,小弟剛學,比較菜,請各位大蝦多多指教啊 謝謝了
#include #include #include #include "CH375HF8.H"
/* 以下定義的詳細說明請看CH375HF8.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復制方式,0為"外部子程序",1為"內部復制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */
#define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375數(shù)據(jù)端口的I/O地址 */ #define CH375_INT_WIRE ( P1IN & 0x10 ) /* P1.4, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */
/* 由于MSP430不開放系統(tǒng)總線,所以用I/O引腳模擬產生CH375的并口讀寫時序 */ /* 本例中的硬件連接方式如下(實際應用電路可以參照修改下述3個并口讀寫子程序) */ /* MSP430單片機的引腳 CH375芯片的引腳 P1.4 INT# P1.7 A0 P1.6 WR# P1.5 RD# CS 接地 P4(8位端口) D7-D0 */
void mDelaymS( UINT16 ms ) { UINT16 i; while ( ms -- ) for ( i = 2000; i != 0; i -- ); }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { P1OUT = ( P1OUT | 0x60 ) & 0x7F; /* 設置A0為低電平,CS,WR,RD默認為高電平 */ P1DIR = ( P1DIR | 0xE0 ) & 0xEF; /* 設置INT#為輸入,設置CS,WR,RD,A0為輸出 */ P4DIR = 0; /* 設置8位并口輸入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調用的子程序,向CH375寫命令 */ { _NOP( ); _NOP( ); _NOP( ); /* 至少延時2uS,實際由于模擬I/O較慢而只需少量延時 */ P1DIR |= 0x70; /* 設置P1口A0,CS,WR,RD為輸出控制信號 */ P4OUT = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ P4DIR = 0xFF; /* 寫操作所以數(shù)據(jù)輸出 */ P1OUT |= BIT7; /* 指向CH375芯片的命令端口, A0(P1.7)=1; */ P1OUT &= 0xBF; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口, A0(P1.7)=1; WR=(P1.6)=0; RD(P1.5)=1; */ _NOP( ); /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度為100nS */ P1OUT |= 0x60; /* 輸出無效的控制信號, 完成操作CH375芯片, A0(P1.7)=0; WR=(P1.6)=1; RD(P1.5)=1; */ //P1OUT &= 0x6F; /* 輸出A0(P1.3)=0; 可選操作 */ P4DIR = 0; /* 禁止數(shù)據(jù)輸出 */ _NOP( ); _NOP( ); _NOP( ); _NOP( ); _NOP( ); /* 至少延時2uS,實際由于模擬I/O較慢而只需少量延時 */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調用的子程序,向CH375寫數(shù)據(jù) */ { P4OUT = mData; /* 向CH375的并口輸出數(shù)據(jù) */ P4DIR = 0xFF; /* 寫操作所以數(shù)據(jù)輸出 */ P1OUT &= 0xBF; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口, A0(P1.7)=0; WR=(P1.6)=0; RD(P1.5)=1; */ _NOP( ); /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度為100nS */ P1OUT |= 0x60; /* 輸出無效的控制信號, 完成操作CH375芯片, A0(P1.3)=7; WR=(P1.6)=1; RD(P1.5)=1; */ P4DIR = 0; /* 禁止數(shù)據(jù)輸出 */ _NOP( ); /* 至少延時1uS,實際由于模擬I/O較慢而不一定有必要 */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; _NOP( ); /* 至少延時1uS,實際由于模擬I/O較慢而不一定有必要 */ P4DIR = 0; /* 讀操作所以數(shù)據(jù)輸入 */ P1OUT &= 0x5F; /* 輸出有效讀控制信號, 讀CH375芯片的數(shù)據(jù)端口, A0(P1.7)=0; WR=(P1.6)=1; RD(P1.5)=0; */ _NOP( ); /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度為100nS */ mData = P4IN; /* 從CH375的并口輸入數(shù)據(jù) */ P1OUT |= 0x60; /* 輸出無效的控制信號, 完成操作CH375芯片, A0(P1.7)=0; WR=(P1.6)=1; RD(P1.5)=1; */ return( mData ); }
void CH375_INIT() { unsigned char i; xWriteCH375Cmd(CMD_CHECK_EXIST);/* 測試CH375是否正常工作 */ xWriteCH375Data( 0x55 ); /* 寫入測試數(shù)據(jù) */ i = ~ 0x55; /* 返回數(shù)據(jù)應該是測試數(shù)據(jù)取反 */ if ( xReadCH375Data( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { xWriteCH375Cmd( CMD_RESET_ALL ); /* 多次重復發(fā)命令,執(zhí)行硬件復位 */ xReadCH375Data( ); } xWriteCH375Cmd( 0 ); mDelaymS( 5); /* 延時50ms */ }
/* 設置USB工作模式, 必要操作 */ xWriteCH375Cmd( CMD_SET_USB_MODE ); xWriteCH375Data( 2 ); /* 設置為使用內置固件的USB設備方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( xReadCH375Data( ) == CMD_RET_SUCCESS ) break; } /* if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */ /* 下述啟用中斷,假定CH375連接在INT0 */ P1IES |= BIT4; /* 置外部信號為低電平觸發(fā) */ P1IFG &=~(BIT4); /* 清中斷標志 */ P1IE |=BIT4; /* 允許CH375中斷 */ }
/* CH375中斷服務程序 */ #pragma vector=PORT1_VECTOR __interrupt void p1int(void) { unsigned char InterruptStatus; unsigned char i; unsigned char buffer[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; xWriteCH375Cmd( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus = xReadCH375Data( ); /* 獲取中斷狀態(tài) */ xWriteCH375Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ for ( i = 0; i < 64; i ++ ) xWriteCH375Data( buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應用程序測試數(shù)據(jù)是否正確 */ if (InterruptStatus==USB_INT_EP2_IN){ /* 批量數(shù)據(jù)發(fā)送成功 */ xWriteCH375Cmd( CMD_UNLOCK_USB ); /* 釋放當前USB緩沖區(qū) */ } }
main(){ mDelaymS(2); CH375_PORT_INIT(); CH375_INIT(); while (1); }