?? ch374hft.c
字號:
CH374FileReadX( );
// CH374FileClose( ); /* 不做寫操作可以無需關(guān)閉 */
}
}
}
}
void xFileNameEnumer( void ) /* 文件名枚舉回調(diào)子程序,參考CH374HF6.H文件中的例子 */
{ /* 每搜索到一個文件FileOpen都會調(diào)用本回調(diào)程序,xFileNameEnumer返回后,F(xiàn)ileOpen遞減CH374vFileSize并繼續(xù)枚舉直到搜索不到文件或者目錄 */
UINT8 i, c;
P_FAT_DIR_INFO pFileDir;
PUINT8X pNameBuf;
pFileDir = (P_FAT_DIR_INFO)( pDISK_BASE_BUF + CH374vFdtOffset ); /* 當前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; /* 文件名結(jié)構(gòu)中的文件名緩沖區(qū) */
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; /* 當前文件名完整路徑的結(jié)束符 */
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 ++; /* 文件計數(shù) */
if ( FileCount >= MAX_FILE_COUNT ) { /* 文件名結(jié)構(gòu)緩沖區(qū)太小,結(jié)構(gòu)數(shù)量不足 */
CH374vFileSize = 1; /* 強行提前結(jié)束枚舉,本次FileOpen將不再回調(diào)xFileNameEnumer而是提前返回,防止緩沖區(qū)溢出 */
printf( "FileName Structure Full\n" );
}
}
main( ) {
UINT8 i;
LED_OUT_INIT( );
LED_OUT_ACT( ); /* 開機后LED亮一下以示工作 */
CH374DelaymS( 100 ); /* 延時100毫秒 */
LED_OUT_INACT( );
mInitSTDIO( ); /* 為了讓計算機通過串口監(jiān)控演示過程 */
printf( "Start\n" );
#if DISK_BASE_BUF_LEN == 0
pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定義CH374的專用緩沖區(qū),而是用緩沖區(qū)指針指向其它應用程序的緩沖區(qū)便于合用以節(jié)約RAM */
#endif
i = CH374LibInit( ); /* 初始化CH374程序庫和CH374芯片,操作成功返回0 */
mStopIfError( i );
/* 其它電路初始化 */
while ( 1 ) {
printf( "Wait Udisk\n" );
#ifdef UNSUPPORT_USB_HUB
/* 如果不需要支持USB-HUB,那么等待U盤插入的程序與CH375相似,都是通過CH374DiskConnect查詢連接,已連接則通過CH374DiskReady等待就緒,然后讀寫 */
while ( CH374DiskStatus < DISK_CONNECT ) { /* 查詢CH374中斷并更新中斷狀態(tài),等待U盤插入 */
CH374DiskConnect( );
CH374DelaymS( 50 ); /* 沒必要頻繁查詢 */
}
LED_OUT_ACT( ); /* LED亮 */
CH374DelaymS( 200 ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */
/* 對于檢測到USB設備的,最多等待100*50mS,主要針對有些MP3太慢,對于檢測到USB設備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對DiskReady不過的 */
for ( i = 0; i < 100; i ++ ) { /* 最長等待時間,100*50mS */
CH374DelaymS( 50 );
printf( "Ready ?\n" );
if ( CH374DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */
if ( CH374DiskStatus < DISK_CONNECT ) break; /* 檢測到斷開,重新檢測并計時 */
if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盤總是返回未準備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */
}
if ( CH374DiskStatus < DISK_CONNECT ) { /* 檢測到斷開,重新檢測并計時 */
printf( "Device gone\n" );
continue; /* 重新等待 */
}
if ( CH374DiskStatus < DISK_MOUNTED ) { /* 未知USB設備,例如USB鍵盤、打印機等 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
#else
/* 如果需要支持USB-HUB,那么必須參考本例中下面的等待程序 */
while ( 1 ) { /* 支持USB-HUB */
CH374DelaymS( 50 ); /* 沒必要頻繁查詢 */
if ( CH374DiskConnect( ) == ERR_SUCCESS ) { /* 查詢方式: 檢查磁盤是否連接并更新磁盤狀態(tài),返回成功說明連接 */
CH374DelaymS( 200 ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */
/* 對于檢測到USB設備的,最多等待100*50mS,主要針對有些MP3太慢,對于檢測到USB設備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對DiskReady不過的 */
for ( i = 0; i < 100; i ++ ) { /* 最長等待時間,100*50mS */
CH374DelaymS( 50 );
printf( "Ready ?\n" );
if ( CH374DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */
if ( CH374DiskStatus < DISK_CONNECT ) { /* 檢測到斷開,重新檢測并計時 */
printf( "Device gone\n" );
break; /* 重新等待 */
}
if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盤總是返回未準備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */
if ( CH374DiskStatus == DISK_CONNECT ) { /* 有設備連接 */
if ( CH374vHubPortCount ) { /* 連接了一個USB-HUB,但可能沒有U盤 */
printf( "No Udisk in USB_HUB\n" );
break;
}
else { /* 未知USB設備,有可能是U盤反應太慢,所以要再試試 */
}
}
}
if ( CH374DiskStatus >= DISK_MOUNTED ) { /* 是U盤 */
break; /* 開始操作U盤 */
}
if ( CH374DiskStatus == DISK_CONNECT ) { /* 多次嘗試還是不行,估計不是U盤 */
if ( CH374vHubPortCount ) { /* 連接了一個USB-HUB,但可能沒有U盤 */
/* 在while中等待HUB端口有U盤 */
}
else { /* 未知USB設備,例如USB鍵盤、打印機等,而且已經(jīng)試了很多次還不行 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
}
}
}
LED_OUT_ACT( ); /* LED亮 */
#endif
#if DISK_BASE_BUF_LEN
if ( DISK_BASE_BUF_LEN < CH374vSectorSize ) { /* 檢查磁盤數(shù)據(jù)緩沖區(qū)是否足夠大,CH374vSectorSize是U盤的實際扇區(qū)大小 */
printf( "Too large sector size\n" );
goto UnknownUsbDevice;
}
#endif
CH374DelaymS( 20 );
/* 查詢磁盤物理容量 */
// printf( "DiskSize\n" );
// i = CH374DiskSize( );
// mStopIfError( i );
// printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * ( CH374vSectorSize / 512 ) >> 11 ) ); /* 顯示為以MB為單位的容量 */
printf( "Current disk sector size = %d Bytes \n", CH374vSectorSize ); /* CH374vSectorSize是U盤的實際扇區(qū)大小 */
LED_RUN_ACT( ); /* 開始操作U盤 */
printf( "List all file \n" );
i = ListAll( ); /* 枚舉整個U盤中的所有文件及目錄 */
mStopIfError( i );
LED_RUN_INACT( );
UnknownUsbDevice:
printf( "Take out\n" );
while ( 1 ) { /* 支持USB-HUB */
CH374DelaymS( 10 ); /* 沒必要頻繁查詢 */
if ( CH374DiskConnect( ) != ERR_SUCCESS ) break; /* 查詢方式: 檢查磁盤是否連接并更新磁盤狀態(tài),返回成功說明連接 */
}
LED_OUT_INACT( ); /* LED滅 */
CH374DelaymS( 200 );
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -