我是一個初學(xué)者,下面的圖是我參考CH375做的一個usb的串口擴展電路,有沒有完整的程序???小妹不勝感激~~ UploadImages/20085513445963.doc
不知道你的要求是什么,看了一下你的電路,其實并不是USB擴展串口,是MCU通過串口來操作CH375這種方式只能用在CH375做HOST的情況下,做DEVICE則只能用并口!
如果我是MCU通過串口來操作CH375對U盤進行讀寫,那程序該如何寫呢?
關(guān)鍵是3個低層的讀寫子函數(shù).到在線下載里搜索CH375LIB.ZIP.找到MCS51下面的FILELIB5 里面有相關(guān)例子供你參考: void CH375_PORT_INIT( ) { SCON = 0xD0; 設(shè)置串口為9位數(shù)據(jù) 設(shè)置波特率和其它串口參數(shù) }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; //第9位為1說明是命令 SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; //第9位為0說明是數(shù)據(jù) SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } */
謝謝,非常有用!
讀寫子程序做了相應(yīng)的修改后,主程序是否也要做相應(yīng)的修改? main( ) { UINT8 i, month, hour; UINT16 date, adc, len; CH375_PORT_INIT( ); /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ LED_OUT_INIT( ); LED_OUT_ACT( ); /* 開機后LED亮一下以示工作 */ mDelay100mS( ); /* 延時100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 為了讓計算機通過串口監(jiān)控演示過程 */ printf( "Start\n" );
如何該為串口的呢?
串口只用來操作375就不能用來監(jiān)視程序,printf( "Start\n" );就不能用了,還有mInitSTDIO( ); 要把串口初試化成9位數(shù)據(jù)!
這是我的整個簡單的程序,請幫忙看看有什么問題好嗎? #include #include
#define MAX_BYTE_IO 35 /* 以字節(jié)為單位單次讀寫文件時的最大長度,默認值是29,值大則占用內(nèi)存多,值小則超過該長度必須分多次讀寫 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"內(nèi)部復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */ #define LIB_CFG_UPD_SIZE 1 /* 在添加數(shù)據(jù)后是否自動更新文件長度: 0為"不更新",1為"自動更新" */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define DISK_BASE_BUF_LEN 2048 /* 默認的磁盤數(shù)據(jù)緩沖區(qū)大小為512字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤,為0則禁止在.H文件中定義緩沖區(qū)并由應(yīng)用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */ #define FILE_DATA_BUF_LEN 0x0800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */
#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ #define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */ #include "..\CH375HF5.H" void CH375_PORT_INIT( ) { SCON = 0xD0; 設(shè)置串口為9位數(shù)據(jù)設(shè)置波特率和其它串口參數(shù) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯誤 */ while ( 1 ) { mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } } /* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; } main( ) { UINT8 i, month, hour; UINT16 date, adc, len; CH375_PORT_INIT( ); mDelay100mS( ); /* 延時100毫秒 */ mInitSTDIO( ); #if DISK_BASE_BUF_LEN == 0 pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定義CH375的專用緩沖區(qū),而是用緩沖區(qū)指針指向其它應(yīng)用程序的緩沖區(qū)便于合用以節(jié)約RAM */ #endif
i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i ); while ( 1 ) { printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ mDelay100mS( ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ mDelay100mS( ); /* 檢查U盤是否準備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盤總是返回未準備好,不過可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 檢查磁盤數(shù)據(jù)緩沖區(qū)是否足夠大,CH375vSectorSize是U盤的實際扇區(qū)大小 */ printf( "Too large sector size\n" ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue; } #endif /* 如果MY_ADC.TXT文件已經(jīng)存在則添加數(shù)據(jù)到尾部,如果不存在則新建文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,該文件在根目錄下 */ i = CH375FileOpen( ); /* 打開文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已經(jīng)被打開,移動文件指針到尾部以便添加數(shù)據(jù) */ printf( "File size = %ld\n", CH375vFileSize ); /* V1.5以上子程序庫在成功打/* 如果MY_ADC.TXT文件已經(jīng)存在則添加數(shù)據(jù)到尾部,如果不存在則新建文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,該文件在根目錄下 */ i = CH375FileOpen( ); /* 打開文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已經(jīng)被打開,移動文件指針到尾部以便添加數(shù)據(jù) */ printf( "File size = %ld\n", CH375vFileSize ); /* V1.5以上子程序庫在成功打 /* 如果MY_ADC.TXT文件已經(jīng)存在則添加數(shù)據(jù)到尾部,如果不存在則新建文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,該文件在根目錄下 */ i = CH375FileOpen( ); /* 打開文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已經(jīng)被打開,移動文件指針到尾部以便添加數(shù)據(jù) */ printf( "File size = %ld\n", CH375vFileSize ); printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); i = CH375FileOpen( ); /* 打開文件 */ if ( i == ERR_SUCCESS ) { /* 文件存在并且已經(jīng)被打開,移動文件指針到尾部以便添加數(shù)據(jù) */ printf( "File size = %ld\n", CH375vFileSize ); /* V1.5以上子程序庫在成功打 printf( "Locate tail\n" ); mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate( ); mStopIfError( i ); } else if ( i == ERR_MISS_FILE ) { /* 沒有找到文件,必須新建文件 */
printf( "Create\n" ); mCopyCodeStringToIRAM(mCmdParam.Create.mPathName, "/MY_ADC.TXT" ) i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); } else mStopIfError( i ); /* 打開文件時出錯 */ printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 1; /* 自動計算文件長度,以字節(jié)為單位寫文件,建議讓程序庫關(guān)閉文件以便自動更新文件長度 */ i = CH375FileClose( ); /* 關(guān)閉文件 */ mStopIfError( i ); printf( "Take out\n" ); while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ mDelay100mS( ); mDelay100mS( ); } }
編譯過了嗎?操作375的三個讀寫子函數(shù)呢?
還沒編譯,不好意思 讀寫子程序忘記放上去了!
把三個讀寫子函數(shù)放上去之后,你在你的主程序一上電的時候延時100MS后就進行測試命令,看下輸出的數(shù)據(jù)是不是你輸入數(shù)據(jù)的取反,375默認的波特率是9600,同時你可以直接利用我們的CH375LIB5下面的例子程序來進行測試
我用上面的程序進行編譯,出現(xiàn)一個錯誤: File0:ERROR 129 IN LINE 765 OF CH375HF5.H:missing';'before '_at_' CH375HF5.H是公司提供的,她說在'_at_'缺了個";",我就不知道怎么辦了,是否要將CH375HF5進行修改呢?
現(xiàn)在編譯通過了,那下一步如何進行調(diào)試CH375呢?有測試工具嗎?測試命令是什么?