我是用51單片機控制ch375來讀u盤的, 但是現(xiàn)在連初期的測試工作狀態(tài)都通不過,以下是我的程序,還請高人指點 看看哪里需要改進?謝謝!
/* 2004.06.05 **************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, KC7.0@MCS51 ** **************************************** */ /* CH375 主機文件系統(tǒng)接口 */ /* 支持: FAT12/FAT16/FAT32 */
/* MCS-51單片機C語言的U盤文件讀寫示例程序, 適用于89C52或者更大程序空間的單片機 */ /* 該程序?qū)盤中的/C51/CH375HFT.C文件中的小寫字母轉(zhuǎn)成大寫字母后, 寫到新建的文件NEWFILE.TXT中, 如果找不到原文件CH375HFT.C, 那么該程序?qū)@示C51子目錄下所有以CH375開頭的文件名, 并新建NEWFILE.TXT文件并寫入提示信息, 如果找不到C51子目錄, 那么該程序?qū)@示根目錄下的所有文件名, 并新建NEWFILE.TXT文件并寫入提示信息 */ /* CH375的INT#引腳采用查詢方式處理, 數(shù)據(jù)復制方式為"單DPTR復制", 所以速度較慢, 適用于所有MCS51單片機 */
/* C51 CH375HFT.C */ /* LX51 CH375HFT.OBJ , CH375HF6.LIB 如果將CH375HF6換成CH375HF4就可以不支持FAT32 */ /* OHX51 CH375HFT */
#include #include
/* 以下定義的詳細說明請看CH375HF6.H文件 */ #define LIB_CFG_DISK_IO 1 /* 磁盤讀寫的數(shù)據(jù)的復制方式,1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復制方式,0為"外部子程序",1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */ #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地址 */ /* 62256提供的32KB的RAM分為兩部分: 0000H-01FFH為磁盤讀寫緩沖區(qū), 0200H-7FFFH為文件數(shù)據(jù)緩沖區(qū) */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define DISK_BASE_BUF_LEN 4096 /* 默認的磁盤數(shù)據(jù)緩沖區(qū)大小為512字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤,為0則禁止在.H文件中定義緩沖區(qū)并由應用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_ADDR 0x1000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以外部RAM剩余長度為32256字節(jié) */ #define FILE_DATA_BUF_LEN 0x6800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ /* 如果準備使用雙緩沖區(qū)交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
#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 "CH375HF6.H" /* 如果不需要支持FAT32,那么請選用CH375HF4.H */
/* 在P1.4連接一個LED用于監(jiān)控演示程序的進度,低電平LED亮,當U盤插入后亮 */ //sbit P1_4 = P1^4; //#define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高電平 */ //#define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅(qū)動LED顯示 */ //#define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅(qū)動LED顯示 */ //sbit P1_5 = P1^5; /* 在P1.5連接一個LED用于監(jiān)控演示程序的進度,低電平LED亮,當對U盤操作時亮 */ //#define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低電平驅(qū)動LED顯示 */ //#define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低電平驅(qū)動LED顯示 */ //sbit P1_6 = P1^6; /* 在P1.6連接一個LED用于監(jiān)控演示程序的進度,低電平LED亮,當對U盤寫操作時亮 */ //#define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低電平驅(qū)動LED顯示 */ //#define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低電平驅(qū)動LED顯示 */
/* 延時100毫秒,不精確 */ UINT8 c;
void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; } ///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////以下是自己新加入的代碼///////////////////
/* 本例用I/O引腳模擬產(chǎn)生CH375的并口讀寫時序 */ /* 單片機的引腳 CH375芯片的引腳 P3.2 INT# P1.0 A0 P1.1 CS# 如果模擬出的并口上只有CH375,那么CS#可以直接接低電平,強制片選 P1.2 WR# P1.3 RD# P0(8位端口) D7-D0 */ sbit CH375_A0 = P1^0; sbit CH375_CS = P1^1; sbit CH375_WR = P1^2; sbit CH375_RD = P1^3;
void mDelay1_2uS( ) /* 至少延時1.2uS,根據(jù)單片機主頻調(diào)整 */ { return; }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P0 = 0xFF; /* 并口輸入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時1uS */ P0 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ CH375_RD = 1; CH375_CS = 0; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { //*(UINT8XV *)0XBCF0 = mData; //return; P0 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口 */ CH375_RD = 1; CH375_CS = 0; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /* 至少延時1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延時1.2uS */ P0 = 0xFF; /* 輸入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 輸出有效寫控制信號, 讀CH375芯片的數(shù)據(jù)端口 */ CH375_WR = 1; CH375_CS = 0; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mData = P0; /* 從CH375的并口輸入數(shù)據(jù) */ CH375_RD = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }
/* 為printf和getkey輸入輸出初始化串口 void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xfD; /* 24MHz晶振, 9600bps TR1 = 1; TI = 1;
}*/
main( ) { mDelay100mS( ); /* 延時100毫秒 */ CH375_PORT_INIT( ) ; mDelay100mS( ); xWriteCH375Cmd(CMD_CHECK_EXIST); xWriteCH375Data(0xaa); c=xReadCH375Data(); while(1);
}