请教375A无法正常读写U盘的问题(源程序及原理图)!!

我使用375A开发产品,控制器为LPC2114,但是一直无法正常读写U盘。有以下问题请教

出现的现象如下: 1、初始化及查询U盘状态均成功,但无法创建文件,创建文件时总是返回0x1F。 2、如果先用PC机在U盘上创建文件,追加数据的话加的都是空字符,如果覆盖原数据则可以成功。 即mCmdParam.Locate.mSectorOffset = 0xffffffff的话程序一直在CH375FileLocate( )中运行,出不来。 如mCmdParam.Locate.mSectorOffset = 0能正常添加,但是后果是原来数据被覆盖。 如mCmdParam.Locate.mSectorOffset = 1也能正常返回,但是添加的全空字符。 而且挑U盘挑的利害,3、4个U盘只有一个可用。

已经试过的方法: 1、文件名字前的/和\\, 2、命令和数据写函数里的延时mDelay()的参数20、30、40、50都试过了。 3、U盘已经格式化N(N>100)次了. 4、数据线应该没什么问题,因为同一套数据线我控制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 /*文件读写的数据的复制方式,0:外部子程序,1:内部复制*/ #define LIB_CFG_INT_EN 0 /*CH375的INT#引脚连接方式,0:查询方式,1:中断方式*/ #define FILE_DATA_BUF_LEN 0x2000 /*外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度*/ #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) * 功能:延时函数。 ****************************************************************************/ void mDelay(uint32 DelayTime) /*延时函数,实际延迟时间待定,DelayTime=30大约延时1.2uS*/ { uint32 i; for( i = DelayTime; i != 0; i--) ; }

/**************************************************************************** * 名称:DelayNS() * 功能:延时函数。 ****************************************************************************/ 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的写命令函数,供库调用。 ****************************************************************************/

void xWriteCH375Cmd( uint8 mCmd ) { mDelay(30); /*延时至少1uS*/ IO0CLR |= 0x0000FF00; /*清并口,也就是将数据线上的0至上*/ IO0SET |= (((uint32)mCmd << 8 ) | USB_A0); /*将数据线上的1至上,同时将A0(P0.2)=1,写命令方式*/ IO0DIR |= 0x0000FF74; /*置GIPO口的方向,设置数据线的方向以及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; /*禁止数据输出*/ mDelay(30); /*延时至少1uS*/ }

/**************************************************************************** * 名称:xWriteCH375Data( uint8 mData ) * 功能:375的写数据函数,供库调用。 ****************************************************************************/

void xWriteCH375Data( uint8 mData ) { //mDelay(30); IO0CLR |= 0x0000FF00; IO0SET |= ((uint32)mData << 8); /*向总线上写数据*/ IO0DIR |= 0x0000FF00; /*数据线方向*/ 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; /*禁止数据输出*/ mDelay(30); /*延时至少1uS*/ }

/**************************************************************************** * 名称:xReadCH375Data( void ) * 功能:375的写数据函数,供库调用。 ****************************************************************************/

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);/*读数*/ 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); /*返回数据*/ }

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

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中断并更新中断状态,等待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)//没找到就创建新的,找到就继续添加 if(a == ERR_SUCCESS) { BEEPTest(1); mCmdParam.Locate.mSectorOffset = 1; c = CH375FileLocate( ); if(c == ERR_SUCCESS) BEEPTest(1); else ; //mCmdParam.Write.mSectorOffset = 10;//要写入的扇区数量 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


写命令函数存在问题: void xWriteCH375Cmd( uint8 mCmd ) { mDelay(30); /*延时至少1uS*/ IO0CLR |= 0x0000FF00; /*清并口,也就是将数据线上的0至上*/ IO0SET |= (((uint32)mCmd << 8 ) | USB_A0); /*将数据线上的1至上,同时将A0(P0.2)=1,写命令方式*/ IO0DIR |= 0x0000FF74; /*置GIPO口的方向,设置数据线的方向以及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; /*禁止数据输出*/ mDelay(30); /*延时至少1uS*/ --------------延时可改小点 }


谢谢你的回复, 不过我看了一下,我的程序本来就是你说的那样,A0=0,只是注释没写对。 期待你新的建议。


按照上面所说的问题,因为LPC的ARM引脚可以承受5V的电压,可以直接按照5V的连线就可以了,挑盘很厉害以及操作不成功,这个问题你可以检查下你的硬件,例如供电是否为5V(插上U盘之后USB口的电压),USB口的UD+和UD-串接的电阻是否过大


只有登录才能回复,可以选择微信账号登录