請教375A無法正常讀寫U盤的問題(源程序及原理圖)??!

我使用375A開發(fā)產品,控制器為LPC2114,但是一直無法正常讀寫U盤。有以下問題請教

出現(xiàn)的現(xiàn)象如下: 1、初始化及查詢U盤狀態(tài)均成功,但無法創(chuàng)建文件,創(chuàng)建文件時總是返回0x1F。 2、如果先用PC機在U盤上創(chuàng)建文件,追加數(shù)據的話加的都是空字符,如果覆蓋原數(shù)據則可以成功。 即mCmdParam.Locate.mSectorOffset = 0xffffffff的話程序一直在CH375FileLocate( )中運行,出不來。 如mCmdParam.Locate.mSectorOffset = 0能正常添加,但是后果是原來數(shù)據被覆蓋。 如mCmdParam.Locate.mSectorOffset = 1也能正常返回,但是添加的全空字符。 而且挑U盤挑的利害,3、4個U盤只有一個可用。

已經試過的方法: 1、文件名字前的/和\\, 2、命令和數(shù)據寫函數(shù)里的延時mDelay()的參數(shù)20、30、40、50都試過了。 3、U盤已經格式化N(N>100)次了. 4、數(shù)據線應該沒什么問題,因為同一套數(shù)據線我控制LCD都是正確的,而且調試U盤時我已經把LCD模塊去掉了, 不存在相互影響的問題。

疑問: 1、我是用ARM控制375A,3.3V推5V的芯片是否有需要特別注意的地方? 2、是否需要更換375A芯片?[Emot]1[/Emot]

#include "config.h" #include #include

#define LIB_CFG_FILE_IO 1 /*文件讀寫的數(shù)據的復制方式,0:外部子程序,1:內部復制*/ #define LIB_CFG_INT_EN 0 /*CH375的INT#引腳連接方式,0:查詢方式,1:中斷方式*/ #define FILE_DATA_BUF_LEN 0x2000 /*外部RAM的文件數(shù)據緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據長度*/ #define CH375_INT_WIRE (IO0PIN & 0x08) /*P0.3,USB_INT#*/

#include "CH375HF9.H"

/************************ **管腳定義部分 ************************/

#define BEEP (1<<7)

#define USB_A0 (1<<2) //P0.2 #define USB_INT (1<<3) //P0.3 #define USB_CS (1<<4) //P0.4 #define USB_WR (1<<5) //P0.5 #define USB_RD (1<<6) //P0.6

/**************************************************************************** * 名稱:mDelay(uint32 DelayTime) * 功能:延時函數(shù)。 ****************************************************************************/ void mDelay(uint32 DelayTime) /*延時函數(shù),實際延遲時間待定,DelayTime=30大約延時1.2uS*/ { uint32 i; for( i = DelayTime; i != 0; i--) ; }

/**************************************************************************** * 名稱:DelayNS() * 功能:延時函數(shù)。 ****************************************************************************/ void DelayNS(uint32 dly) { uint32 i;

for(; dly>0; dly--) for(i=0; i<50000; i++); }

/**************************************************************************** * 名稱:BEEPTest() * 功能:蜂鳴器。 ****************************************************************************/ void BEEPTest(uint8 Times) { uint8 i; for(i=0;i { IO0CLR = BEEP; DelayNS(50); IO0SET = BEEP; DelayNS(50); } }

/**************************************************************************** **************************************************************************** ***************************USB程序部分************************************** **************************************************************************** ****************************************************************************/

/**************************************************************************** * 名稱:CH375_PORT_INIT() * 功能:ARM的375接口初始化。 ****************************************************************************/ void CH375_PORT_INIT() /*使用GPIO模擬總線,初始化設置*/ { IO0SET |= (USB_CS|USB_WR|USB_RD);//0x00000070; /*設置CS、WR和RD默認為高電平*/ IO0DIR &= 0xFFFF00F7; /*設置8位并口和INT#為輸入*/ IO0DIR |= (USB_CS|USB_WR|USB_RD|USB_A0);//0x00000074; /*設置CS、WR、RD、A0為輸出*/ }

/**************************************************************************** * 名稱:xWriteCH375Cmd( uint8 mCmd ) * 功能:375的寫命令函數(shù),供庫調用。 ****************************************************************************/

void xWriteCH375Cmd( uint8 mCmd ) { mDelay(30); /*延時至少1uS*/ IO0CLR |= 0x0000FF00; /*清并口,也就是將數(shù)據線上的0至上*/ IO0SET |= (((uint32)mCmd << 8 ) | USB_A0); /*將數(shù)據線上的1至上,同時將A0(P0.2)=1,寫命令方式*/ IO0DIR |= 0x0000FF74; /*置GIPO口的方向,設置數(shù)據線的方向以及WR、RD、CS、A0的方向為輸出*/ IO0CLR |= USB_CS|USB_WR;//0x00000030; /*輸出CS(P0.4)=0、WR(P0.5)=0、A0(P0.2)=1、RD(P0.6)=1*/ IO0DIR = IO0DIR; IO0DIR = IO0DIR;/*無意義,只是為了小的延時,375要求其寫信號脈寬至少為100nS*/ IO0SET |= USB_CS|USB_WR|USB_RD;//0x00000070; /*輸出CS(P0.4)=1、WR(P0.5)=1、A0(P0.2)=1、RD(P0.6)=1,寫操作結束*/ IO0CLR |= USB_A0;//0x00000004; /*可選操作,輸出A0(P0.2)=1*/ IO0DIR &= 0xFFFF00FF; /*禁止數(shù)據輸出*/ mDelay(30); /*延時至少1uS*/ }

/**************************************************************************** * 名稱:xWriteCH375Data( uint8 mData ) * 功能:375的寫數(shù)據函數(shù),供庫調用。 ****************************************************************************/

void xWriteCH375Data( uint8 mData ) { //mDelay(30); IO0CLR |= 0x0000FF00; IO0SET |= ((uint32)mData << 8); /*向總線上寫數(shù)據*/ IO0DIR |= 0x0000FF00; /*數(shù)據線方向*/ IO0CLR |= USB_CS|USB_WR|USB_A0;//0x00000034; /*輸出輸出CS(P0.4)=0、WR(P0.5)=0、A0(P0.2)=0、RD(P0.6)=1*/ IO0DIR = IO0DIR; IO0DIR = IO0DIR;/*無意義,只是為了小的延時,375要求其寫信號脈寬至少為100nS*/ IO0SET |= USB_CS|USB_WR|USB_RD;//0x00000030; /*輸出CS(P0.4)=1、WR(P0.5)=1、A0(P0.2)=0、RD(P0.6)=1*/ IO0DIR &= 0xFFFF00FF; /*禁止數(shù)據輸出*/ mDelay(30); /*延時至少1uS*/ }

/**************************************************************************** * 名稱:xReadCH375Data( void ) * 功能:375的寫數(shù)據函數(shù),供庫調用。 ****************************************************************************/

uint8 xReadCH375Data( void ) { uint8 mData; mDelay(30); IO0DIR &= 0xFFFF00FF; /*總線方向*/ IO0CLR |= USB_CS|USB_RD|USB_A0;//0x00000054; /*輸出CS(P0.4)=0、WR(P0.5)=1、A0(P0.2)=0、RD(P0.6)=0*/ IO0DIR = IO0DIR; IO0DIR = IO0DIR;/*無意義,只是為了小的延時,375要求其寫信號脈寬至少為100nS*/ mData = (uint8)((IO0PIN)>>8);/*讀數(shù)*/ IO0SET |= (USB_CS|USB_RD|USB_WR);//0x00000070; /*輸出CS(P0.4)=1、WR(P0.5)=1、A0(P0.2)=0、RD(P0.6)=1*/ return (mData); /*返回數(shù)據*/ }

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@ @@ 主程序 @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

uint8 a,b,c; uint8 check; int main (void) {// add user source code

//uint32 TempMONTH; //uint32 TempDAY; //UARTMODE Uart0Set; uint8 i,SecCount; uint16 NewSize,Count; /*因為RAM容量有限,所以NewSize限制為16位,實際如果文件較大,應分幾次讀寫并且將NewSize改為uint32以便累計*/ uint8 *pCodeStr; PINSEL0 = 0x00000005; //除UART0,所有管腳設置為GPIO PINSEL1 = 0x00000000; DelayNS(10); // 延時,防止JTAG調試時,芯片復位后蜂鳴器馬上蜂鳴(直到重新設置PINSEL0) IO0DIR = BEEP; IO0SET = BEEP; IO0DIR &= 0xFFFFFFF7; //USB_INT輸入 CH375_PORT_INIT( ); DelayNS(50); if(CH375LibInit() == ERR_SUCCESS) //初始化375程序庫和CH375芯片,操作成功返回0 BEEPTest(1); else ; while( CH375DiskStatus != DISK_CONNECT ) //查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 { if( CH375DiskConnect() == ERR_SUCCESS ) //有U盤插入時返回成功,同時更新變量CH375DiskStatus { c = CH375DiskStatus; break; } DelayNS(50); } BEEPTest(2); DelayNS(100); for( i = 0; i < 5;i++) //有的U盤總是顯示未準備好,但可以被忽略 { DelayNS(50); if(CH375DiskReady() == ERR_SUCCESS) break; } strcpy( (char *)mCmdParam.Open.mPathName, "\\NEW.TXT" ); a = CH375FileOpen();

//if(CH375FileOpen() == ERR_SUCCESS)//沒找到就創(chuàng)建新的,找到就繼續(xù)添加 if(a == ERR_SUCCESS) { BEEPTest(1); mCmdParam.Locate.mSectorOffset = 1; c = CH375FileLocate( ); if(c == ERR_SUCCESS) BEEPTest(1); else ; //mCmdParam.Write.mSectorOffset = 10;//要寫入的扇區(qū)數(shù)量 pCodeStr = (uint8 *)"Welcom to my new programe!!"; for ( i = 0; i != 255; i ++ ) { if ( ( FILE_DATA_BUF[i] = *pCodeStr ) == 0 ) break; pCodeStr++; } NewSize = CH375vFileSize+i; mCmdParam.Write.mSectorCount = 1; if(CH375FileWrite() == ERR_SUCCESS) BEEPTest(1); else ; } else { pCodeStr = (uint8 *)"XX科技有限公司歡迎你\n"; for ( i = 0; i != 255; i ++ ) { if ( ( FILE_DATA_BUF[i] = *pCodeStr ) == 0 ) break; pCodeStr++; } NewSize = i; SecCount = 1; strcpy((char *)mCmdParam.Create.mPathName,"\\NEW.TXT"); for(i =0;i<5;i++) { a = CH375FileCreate(); //if(CH375FileCreate( ) == ERR_SUCCESS) if(a == ERR_SUCCESS) { BEEPTest(1); break; } } mCmdParam.Write.mSectorCount = SecCount; if(CH375FileWrite() == ERR_SUCCESS) BEEPTest(1); else ; } mCmdParam.Modify.mFileAttr = 0xff; mCmdParam.Modify.mFileTime = 0xffff; mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(2007,2,4); mCmdParam.Modify.mFileSize = NewSize; if(CH375FileModify() == ERR_SUCCESS) BEEPTest(1); else ; mCmdParam.Close.mUpdateLen = 0; if(CH375FileClose() == E


原理圖如下UploadImages/2007227918694.doc


寫命令函數(shù)存在問題: void xWriteCH375Cmd( uint8 mCmd ) { mDelay(30); /*延時至少1uS*/ IO0CLR |= 0x0000FF00; /*清并口,也就是將數(shù)據線上的0至上*/ IO0SET |= (((uint32)mCmd << 8 ) | USB_A0); /*將數(shù)據線上的1至上,同時將A0(P0.2)=1,寫命令方式*/ IO0DIR |= 0x0000FF74; /*置GIPO口的方向,設置數(shù)據線的方向以及WR、RD、CS、A0的方向為輸出*/ IO0CLR |= USB_CS|USB_WR;//0x00000030; /*輸出CS(P0.4)=0、WR(P0.5)=0、A0(P0.2)=1、RD(P0.6)=1*/ IO0DIR = IO0DIR; IO0DIR = IO0DIR;/*無意義,只是為了小的延時,375要求其寫信號脈寬至少為100nS*/ IO0SET |= USB_CS|USB_WR|USB_RD;//0x00000070; /*輸出CS(P0.4)=1、WR(P0.5)=1、A0(P0.2)=1、RD(P0.6)=1,寫操作結束*/ --------------------A0應該設置成0 IO0CLR |= USB_A0;//0x00000004; /*可選操作,輸出A0(P0.2)=1*/ --------------------A0應該設置成0 IO0DIR &= 0xFFFF00FF; /*禁止數(shù)據輸出*/ mDelay(30); /*延時至少1uS*/ --------------延時可改小點 }


謝謝你的回復, 不過我看了一下,我的程序本來就是你說的那樣,A0=0,只是注釋沒寫對。 期待你新的建議。


按照上面所說的問題,因為LPC的ARM引腳可以承受5V的電壓,可以直接按照5V的連線就可以了,挑盤很厲害以及操作不成功,這個問題你可以檢查下你的硬件,例如供電是否為5V(插上U盤之后USB口的電壓),USB口的UD+和UD-串接的電阻是否過大


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

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