?? ch375hft.c
字號:
mCmdParam.ReadX.mDataBuffer = 0x2000; /* 指向文件數據緩沖區的起始地址 */
mCmdParam.ReadX.mSectorCount = 1; /* 讀取扇區數 */
CH375FileReadX( );
// CH375FileClose( ); /* 不做寫操作可以無需關閉 */
}
}
}
}
void xFileNameEnumer( void ) /* 文件名枚舉回調子程序,參考CH375HF6.H文件中的例子 */
{ /* 每搜索到一個文件FileOpen都會調用本回調程序,xFileNameEnumer返回后,FileOpen遞減CH375vFileSize并繼續枚舉直到搜索不到文件或者目錄 */
UINT8 i, c;
P_FAT_DIR_INFO pFileDir;
PUINT8X pNameBuf;
pFileDir = (P_FAT_DIR_INFO)( (PUINT8X)(&DISK_BASE_BUF[0]) + CH375vFdtOffset ); /* 當前FDT的起始地址 */
if ( pFileDir -> DIR_Name[0] == '.' ) return; /* 是本級或者上級目錄名,必須丟棄不處理 */
if ( ( pFileDir -> DIR_Attr & ATTR_DIRECTORY ) == 0 ) { /* 判斷是文件名 */
if ( pFileDir -> DIR_Name[8] == 'H' && pFileDir -> DIR_Name[9] == ' ' /* 過濾文件的擴展名,是".H"文件,則丟棄,不登記不處理 */
|| pFileDir -> DIR_Name[8] == 'E' && pFileDir -> DIR_Name[9] == 'X' && pFileDir -> DIR_Name[10] == 'E' ) return; /* 擴展名是".EXE"的文件,則丟棄 */
}
pNameBuf = & FileNameBuffer[ FileCount ].Name; /* 文件名結構中的文件名緩沖區 */
for ( i = 0; i < 11; i ++ ) { /* 復制文件名,長度為11個字符 */
c = pFileDir -> DIR_Name[ i ];
if ( i == 0 && c == 0x05 ) c = 0xE5; /* 特殊字符 */
if ( c != 0x20 ) { /* 有效字符 */
if ( i == 8 ) { /* 處理擴展名 */
*pNameBuf = '.'; /* 分隔符 */
pNameBuf ++;
}
*pNameBuf = c; /* 復制文件名的一個字符 */
pNameBuf ++;
}
}
*pNameBuf = 0; /* 當前文件名完整路徑的結束符 */
FileNameBuffer[ FileCount ].DirStartClust = CurrentDirStartClust; /* 記錄當前目錄的起始簇號,用于加快文件打開速度 */
FileNameBuffer[ FileCount ].Attr = pFileDir -> DIR_Attr; /* 文件屬性 */
if ( pFileDir -> DIR_Attr & ATTR_DIRECTORY ) { /* 判斷是目錄名 */
printf( "Dir %4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name );
}
else { /* 判斷是文件名 */
printf( "File%4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name );
}
FileCount ++; /* 文件計數 */
if ( FileCount >= MAX_FILE_COUNT ) { /* 文件名結構緩沖區太小,結構數量不足 */
CH375vFileSize = 1; /* 強行提前結束枚舉,本次FileOpen將不再回調xFileNameEnumer而是提前返回,防止緩沖區溢出 */
printf( "FileName Structure Full\n" );
}
}
#else
/* V2.8, V2.9, V3.0及以上版本的子程序庫 */
/* 例子:列舉指定目錄下的所有文件 */
UINT8 ListFile( void )
// 輸入參數mCmdParam.Open.mPathName[]為目錄名字符串,形式與文件名相同,單個斜線則代表根目錄
{
UINT16 ListCount=0; /* 僅用于計數 */
UINT8 status, i, c;
P_FAT_DIR_INFO mFileDir;
printf( "List Directory: %s\n", mCmdParam.Open.mPathName ); /* 顯示目錄名 */
status = CH375FileOpen( ); /* 打開目錄 */
if ( status == ERR_SUCCESS ) { /* 成功打開文件 */
printf( "This is a file, not directory\n" );
status = ERR_MISS_DIR;
}
else if ( status == ERR_OPEN_DIR ) { /* 成功打開目錄 */
while ( 1 ) { /* 依次處理 */
mCmdParam.ReadX.mSectorCount = 1; /* 處理一個扇區 */
mCmdParam.ReadX.mDataBuffer = FILE_DATA_BUF_ADDR; /* 緩沖區 */
status = CH375FileReadX( ); /* 讀取當前目錄項所在的扇區 */
if ( status != ERR_SUCCESS ) break; /* 操作失敗 */
if ( mCmdParam.Read.mSectorCount == 0 ) break; /* 目錄結束 */
mFileDir = FILE_DATA_BUF_ADDR;
for ( i = mCmdParam.Read.mSectorCount * CH375vSectorSize / sizeof( FAT_DIR_INFO ); i != 0; i --, mFileDir ++ ) { /* 計數FDT表項數 */
c = mFileDir -> DIR_Name[0]; /* 檢查文件名首字節 */
if ( c == 0 ) break; /* 文件目錄項結束 */
else if ( c == 0xE5 ) continue; /* 該目錄項已被刪除則跳過 */
else if ( c == 0x05 ) mFileDir -> DIR_Name[0] = i = 0xE5;
if ( ( mFileDir -> DIR_Attr & ATTR_VOLUME_ID ) == 0 ) { /* 不是卷標名(有可能是長文件名的一部分) */
ListCount++;
if ( mFileDir -> DIR_Attr & ATTR_DIRECTORY ) { /* 目錄,不能進行遞歸處理,除非備份很多內部變量 */
printf( "Found %4d# directory, name: ", ListCount ); /* 顯示計數 */
}
else { /* 文件 */
printf( "Found %4d# file, name: ", ListCount ); /* 顯示計數 */
}
for ( c = 0; c != 11; c ++ ) { /* 顯示搜索到的文件名,前11個字符為文件名 */
printf( "%c", mFileDir -> DIR_Name[ c ] );
}
printf( "\n" );
}
}
}
}
CH375FileClose( ); /* 打開目錄用完后必須關閉 */
return( status ); /* 目錄結束則返回ERR_SUCCESS,或者出錯時返回出錯代碼 */
}
#endif
main( ) {
UINT8 i;
LED_OUT_INIT( );
LED_OUT_ACT( ); /* 開機后LED亮一下以示工作 */
mDelaymS( 100 ); /* 延時100毫秒 */
LED_OUT_INACT( );
mInitSTDIO( ); /* 為了讓計算機通過串口監控演示過程 */
printf( "Start\n" );
#if DISK_BASE_BUF_LEN == 0
pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定義CH375的專用緩沖區,而是用緩沖區指針指向其它應用程序的緩沖區便于合用以節約RAM */
#endif
i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */
mStopIfError( i );
/* 其它電路初始化 */
while ( 1 ) {
printf( "Wait Udisk\n" );
while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態,等待U盤插入 */
CH375DiskConnect( );
mDelaymS( 100 );
}
LED_OUT_ACT( ); /* LED亮 */
mDelaymS( 200 ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */
/* 對于檢測到USB設備的,最多等待100*50mS,主要針對有些MP3太慢,對于檢測到USB設備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對DiskReady不過的 */
for ( i = 0; i < 100; i ++ ) { /* 最長等待時間,100*50mS */
mDelaymS( 50 );
printf( "Ready ?\n" );
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */
if ( CH375DiskStatus < DISK_CONNECT ) break; /* 檢測到斷開,重新檢測并計時 */
if ( CH375DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盤總是返回未準備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */
}
if ( CH375DiskStatus < DISK_CONNECT ) { /* 檢測到斷開,重新檢測并計時 */
printf( "Device gone\n" );
continue;
}
if ( CH375DiskStatus < DISK_MOUNTED ) { /* 未知USB設備,例如USB鍵盤、打印機等 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
#if DISK_BASE_BUF_LEN
if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 檢查磁盤數據緩沖區是否足夠大,CH375vSectorSize是U盤的實際扇區大小 */
printf( "Too large sector size\n" );
goto UnknownUsbDevice;
}
#endif
mDelaymS( 20 );
/* 查詢磁盤物理容量 */
/* printf( "DiskSize\n" );
i = CH375DiskSize( );
mStopIfError( i );
printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH375vSectorSize/512) / 2048 ) ); // 顯示為以MB為單位的容量
// 原計算方法 (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * CH375vSectorSize / 1000000 ) 有可能前兩個數據相乘后導致溢出, 所以修改成上式
*/
LED_RUN_ACT( ); /* 開始操作U盤 */
#if CH375_LIB_VER >= 0x30
printf( "List all file \n" );
i = ListAll( ); /* 枚舉整個U盤中的所有文件及目錄 */
mStopIfError( i );
#else
printf( "List all file under Root \n" );
mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/" ); /* 根目錄 */
i = ListFile( ); /* 列出目錄下的所有文件 */
mStopIfError( i );
printf( "List all file under /C51 \n" );
mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/C51" ); /* 子目錄 */
i = ListFile( ); /* 列出目錄下的所有文件 */
if ( i == ERR_MISS_FILE ) {
printf( "Sub-Directory not found \n" );
}
else mStopIfError( i );
#endif
LED_RUN_INACT( );
UnknownUsbDevice:
printf( "Take out\n" );
while ( CH375DiskStatus >= DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態,等待U盤拔出 */
CH375DiskConnect( );
mDelaymS( 100 );
}
LED_OUT_INACT( ); /* LED滅 */
mDelaymS( 200 );
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -