請教ch375V寫U盤為何不穩(wěn)定?

我用的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( ); } }

請問CH375V和CH375 5V的是完全兼容的嗎?他的封裝,引腳排列和CH375 都一樣嗎,你有專門介紹CH375V的資料沒有,我也想用他。有的話麻煩給我傳一下。謝謝!我的E-mail:個人信息保護(hù),已隱藏, QQ:707848835,歡迎加為好友交流。:)


實際程序在寫的時候,中間是不需要加延時的,同時,在寫完之后在一次的更新文件長度,這樣可能會加快寫的速度,并且你在調(diào)用寫函數(shù)的時候,沒有必要在家LOCATE函數(shù),在每次寫完之后,文件的指針是指向文件的末尾的


我按hcn的建議試了還是一樣?。〗?jīng)常寫了一部分就停了?急盼解決?。?!


實際在寫的過程中就寫函數(shù)在,別的都不在: for(cishu=0;cishu<300;cishu++) { mCmdParam.WriteX.mDataBuffer = 0x0300; CH375FileWriteX(); //在原文件的后面添加數(shù)據(jù) } 同時,你的緩沖區(qū)需要有30K才可以,或者你可以一次寫16K的數(shù)據(jù)下去。


同樣是上面的程序,在375的評估板上寫很穩(wěn)定,為什么在3.3V的板子上就不穩(wěn)定了?是不是3.3V的沒有5V的穩(wěn)定??


你的芯片供電是多少,是3。3V嗎??


是3.3v啊!還是有問題!十次能成功一次,我要寫8M的數(shù)據(jù),這和單片機(jī)的晶振有關(guān)嗎?


我使用的是AVR的MEGA64,寫txt文件時發(fā)現(xiàn),當(dāng)單片機(jī)時鐘設(shè)為4MHZ以下時很正常,以上的頻率就會出現(xiàn)寫不進(jìn)去的問題。請問如何解決?


先看你的程序停在什么地方了 請問是總線方式,還是非總線方式? 要是總線方式,就把你的時序降下來;非總線方式,那就要查你的三個讀寫子函數(shù)的時序,


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频