我用的STC單片機(jī),型號為89LE58RD+(支持到80Mhz),外部RAM32k,選用的是3.3V供電的CH375V。單片機(jī)24Mhz晶振,在往U盤寫數(shù)據(jù)時不穩(wěn)定(扇區(qū)方式,文件方式),成功時速度能達(dá)到75k字節(jié)/秒。出錯的情況有以下幾種(1)很多時候?qū)懙揭欢〞r候就不動了,好像在writeX函數(shù)里出不來;(2)有時候能寫完,但是文件打不開,(3)有時候文件名都是錯誤的,而且刪不掉!我的程序如下:請幫忙解決!!是否3.3V的沒有5V的穩(wěn)定??
#include #include #include #include #include
//#define EN_DISK_WRITE #define LIB_CFG_DISK_IO 3 /* 磁盤讀寫的數(shù)據(jù)的復(fù)制方式,1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_FILE_IO 3 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */
#define CH375_CMD_PORT_ADDR 0x8041 /* CH375命令端口的I/O地址 */
#define CH375_DAT_PORT_ADDR 0x8040 /* CH375數(shù)據(jù)端口的I/O地址 */
#define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0300 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */
#define FILE_DATA_BUF_LEN 0x7800//0x7800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */
#define CH375_INT_WIRE INT1 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ //#define CH375_INT_NO 1// 0 /* CH375中斷號, CH375的中斷線INT#引腳連接單片機(jī)的INT0引腳 */ //#define CH375_INT_FLAG IE0 /* 外部中斷0請求標(biāo)志,IE0,CH375中斷標(biāo)志 */ //#define CH375_INT_EN EX0 /* 開外部中斷0,EX0,CH375中斷允許 */
#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */ //#define NO_DEFAULT_CH375_INT
#include "..\CH375HF6.H" /* 如果不需要支持FAT32,那么請選用CH375HF4.H */
void mDelay100mS( )/* 延時100毫秒,不精確 */ { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }
/* 將程序空間的字符串復(fù)制到內(nèi)部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }
/* 檢查操作狀態(tài),如果錯誤則顯示錯誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯誤 并且P1_4閃爍*/ while ( 1 ) { mDelay100mS( ); mDelay100mS( ); } }
/* 為printf和getkey輸入輸出初始化串口 */ void serialinit( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xe6; //0xf3; // /* 0xf3 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }
//unsigned char xdata FILE_DATA_BUF[ FILE_DATA_BUF_LEN ] _at_ FILE_DATA_BUF_ADDR; //在SRAM中指定位置定義一個數(shù)組
main( ) {
UINT8 i;//,jj,s,d;
UINT16 cishu,ij;//flag=0, /* 因為演示板的RAM容量只有32KB,所以NewSize限制為16位,實際上如果文件大于32256字節(jié),應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計 */
AUXR = 0x02;//禁止訪問內(nèi)部擴(kuò)展RAM
mDelay100mS( );// mDelay100mS( ); /* 延時100毫秒 */ serialinit( ); /*串口初始化, */
//for(ij=0;ij // {FILE_DATA_BUF[ ij ] = 0x80;}
printf( "Start\n" ); mDelay100mS( );// mDelay100mS( );// mDelay100mS( ); i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i );
// IE1 = 0;//IE0 = 0;// /* 清中斷請求標(biāo)志 */ // IT1 = 0; // EX1 = 1;//EX0 = 1;// /* 允許CH375中斷 */ // EA = 1; /* 初始化完成,開中斷 */
mDelay100mS( );// while ( 1 ) { mDelay100mS( ); printf( "Wait Udisk\n" ); // while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 等待U盤插入中斷,查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設(shè)備連接則返回成功,CH375DiskConnect同時會更新全局變量CH375DiskStatus */ mDelay100mS( );
} mDelay100mS( ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ mDelay100mS( ); /* 檢查U盤是否準(zhǔn)備好*/ for ( i = 0; i < 5; i ++ ) { mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */ }
#ifdef EN_DISK_WRITE /* 產(chǎn)生新文件 */
printf( "Create\n" ); mDelay100mS( ); mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/FDATA.TXT" );
mDelay100mS( ); i = CH375FileCreate( ); mStopIfError( i ); printf( "Write\n" );
mDelay100mS( ); mDelay100mS( ); mDelay100mS( ); mDelay100mS( ); mDelay100mS( );
//mCmdParam.Write.mSectorCount = SecCount; /* 寫入所有扇區(qū)的數(shù)據(jù) */ for(cishu=0;cishu<300;cishu++) {
mCmdParam.Locate.mSectorOffset = (cishu)*60+60; //1,寫60個扇區(qū)(30k),移到文件的尾部,以扇區(qū)為單位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); i = CH375FileLocate(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); mCmdParam.WriteX.mSectorCount = 60; /******************************************************************/
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
mCmdParam.WriteX.mDataBuffer = 0x0300;
/******************************************************************/ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
// CH375FileWrite(); //在原文件的后面添加數(shù)據(jù) // mDelay100mS( ); // mDelay100mS( );
CH375FileWriteX(); //在原文件的后面添加數(shù)據(jù)
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); mCmdParam.Modify.mFileTime = 0xffff; /* 輸入?yún)?shù): 新的文件時間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時間 */ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2007, 8, 10 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileDate = 0xffff; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
mCmdParam.Modify.mFileSize = CH375vFileSize; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // mCmdParam.Modify.mFileSize = NewSize; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限,如果文件長度大于64KB,那么NewSize必須為UINT32 */ i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長度 */ mStopIfError( i ); // printf( "6\n" );
}
mCmdParam.Close.mUpdateLen = 0; /* 不要自動計算文件長度,如果自動計算,那么該長度總是512的倍數(shù) */
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); i = CH375FileClose( ); mStopIfError( i );
printf( "Close\n" ); #endif printf( "Take out\n" ); mDelay100mS( ); mDelay100mS( ); // while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 等待中斷,查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ while ( CH375DiskStatus >= DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ if ( CH375DiskConnect( ) != ERR_SUCCESS ) break; mDelay100mS( ); } mDelay100mS( ); mDelay100mS( ); mDelay100mS( ); mDelay100mS( ); } }