今天拿到芯片嘗試了一下向U盤中寫文件,寫了一個TXT文檔叫做CH376.TXT。返回值什么的都是對的0x14.但是把U盤拿到電腦上一看,就發(fā)現(xiàn)沒有這個文件。而用CH376打開文件就能打開,我很納悶的打開了WINHEX看了一下扇區(qū),發(fā)現(xiàn)CH376在扇區(qū)上寫的位置不對,我U盤的邏輯扇區(qū)32768號扇區(qū)是根目錄,第三簇=32768+8,而CH376把根目錄當成了30208,第三簇=30208+8。請問各位大神,是不是U盤需要經(jīng)過特殊處理,還是說我在芯片上的使用出現(xiàn)了問題?望解答!謝謝。
程序附上,編譯環(huán)境NIOS II 12 SP1。
#include "../inc/ch376inc.h"
#include "../inc/hal.h"
#include "../inc/file_sys.h"
#include
#include
#include
UINT8 buf[64];
void host(void) {
UINT8i, s;
s = mInitCH376Host( ); ?/* 初始化CH376 */
/* 其它電路初始化 */
while ( 1 ) {
printf( "Wait Udisk/SD\n" );
while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { ?/* 檢查U盤是否連接,等待U盤插入,對于SD卡,可以由單片機直接查詢SD卡座的插拔狀態(tài)引腳 */
usleep( 1000*100 ); ?/* 沒必要頻繁查詢 */
? ? ? ? ? ? //printf("USB FAILURE\n");
}
/* 對于檢測到USB設備的,最多等待100*50mS,主要針對有些MP3太慢,對于檢測到USB設備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對DiskReady不過的 */
for ( i = 0; i < 100; i ++ ) { ?/* 最長等待時間,100*50mS */
usleep( 1000*50 );
printf( "Ready ?\n" );
s = CH376DiskMount( ); ?/* 初始化磁盤并測試磁盤是否就緒 */
if ( s == USB_INT_SUCCESS ){
printf("U_DISK INIT SUCCESS");
break; ?/* 準備好 */
}
else if ( s == ERR_DISK_DISCON ) break; ?/* 檢測到斷開,重新檢測并計時 */
if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; ?/* 有的U盤總是返回未準備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */
}
if ( s == ERR_DISK_DISCON ) { ?/* 檢測到斷開,重新檢測并計時 */
printf( "Device gone\n" );
continue;
}
if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) { ?/* 未知USB設備,例如USB鍵盤、打印機等 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
i = CH376ReadBlock( buf ); ?/* 如果需要,可以讀取數(shù)據(jù)塊CH376_CMD_DATA.DiskMountInq,返回長度 */
if ( i == sizeof( INQUIRY_DATA ) ) { ?/* U盤的廠商和產(chǎn)品信息 */
buf[ i ] = 0;
printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr );
}
/*到這里都沒有問題,返回來的U盤信息都是對的*/
/* 創(chuàng)建原文件 */
printf( "Open\n" );
strcpy( buf, "/CH376.TXT" ); ?/* 源文件名,多級目錄下的文件名和路徑名必須復制到RAM中再處理,而根目錄或者當前目錄下的文件名可以在RAM或者ROM中 */
printf("buf:%s\n",buf);
s = CH376FileCreatePath( buf ); ?/* 新建多級目錄下的文件,支持多級目錄路徑,輸入緩沖區(qū)必須在RAM中 */
printf("s=%02x \n",(unsigned short)s );
////////////////////////////////////// 寫入
printf( "Write :" );
strcpy((char *)buf, "兄弟們那個加油哇 呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵" );
s = CH376ByteWrite( buf, strlen((const char *)buf), NULL ); /* 以字節(jié)為單位向當前位置寫入數(shù)據(jù)塊 */
printf("s=%02x \n",(unsigned short)s );
printf("close file " );
s = CH376FileClose( TRUE ); ? /* 關閉文件,對于字節(jié)讀寫建議自動更新文件長度 */
printf("s=%02x \n",(unsigned short)s );
UnknownUsbDevice:
printf( "Take out\n" );
while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { ?/* 檢查U盤是否連接,等待U盤拔出 */
usleep( 1000*100 );
}
usleep( 1000*100 );
}
}
再次感謝