能连接U盘进行读写了,但是成功率只有2%左右,怎么救啊?

就简单的新建一个TXT文件,然后写入两三行文字,都基本上很少一次就成功的!

错误的主要现象是,U盘的数据灯的在不停的闪,闪烁的亮度低,速度超快,通常闪了就不会停下来! 我用的MCU是AVR M16,使用库函数,字节方式,使用8M内部时钟,部分程序是这样的:

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ PORTD |= 0x17; PORTC = mCmd; /* 向CH375的并口输出数据 */ DDRC = 0xFF; /* 并口D0-D7输出 */ PORTD &=~(1< PORTD &=~(1< DDRC = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mDelay1uS( ); PORTD |= 0x17; /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止数据输出 */ //PORTD &= 0xFB; /* 输出A0=0; 可选操作 */ mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { PORTC = mData; /* 向CH375的并口输出数据 */ DDRC = 0xFF; /* 并口D0-D7输出 */ PORTD |= 0x17; PORTD&=~(1< PORTD&=~(1< PORTD&=~(1< DDRC = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mDelay1uS( ); PORTD|= 0x17; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止数据输出 */ //mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; //mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延时1.2uS */ PORTD |= 0x17; DDRC = 0x00; /* 数据输入 */ PORTD &=~(1< PORTD &=~(1< PORTD &=~(1< DDRC = 0x00; DDRC = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mDelay1uS( ); mData = PINC; /* 从CH375的并口PA输入数据 */ PORTD |= 0x17; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ mDelay1uS( ); return( mData ); }

主函数部分: CH375_PORT_INIT(); DELAYMS(1); CH375Reset(); DELAYMS(1); while(CH375LibInit()!=ERR_SUCCESS); while(CH375DiskConnect()!=ERR_SUCCESS){ DELAYMS(100); }

strcpy((char *)mCmdParam.Create.mPathName,"/ABC.TXT"); while(CH375FileCreate()!=ERR_SUCCESS); pCodeStr = (UINT8 *)"2009年4月8日 星期三XXXXXXXXXXXXXXXXXXXXXXXXXXX"; while( 1 ) { for ( i=0; i c = *pCodeStr; mCmdParam.ByteWrite.mByteBuffer[i] = c; if ( c == 0 ) break; pCodeStr++; } if ( i == 0 ) break; mCmdParam.ByteWrite.mByteCount = i; while(CH375ByteWrite( )!=ERR_SUCCESS); } mCmdParam.Close.mUpdateLen = 1; while(CH375FileClose()!=ERR_SUCCESS);

电路图按照REAME文档第三页2.4.2的参考图(上面那个)!!

你看下你用MEGA16编译之后程序空间和RAM空间有没有溢出?


section size addr .text 12808 0 .data 178 8388704 .bss 620 8388882 .debug_aranges 32 0 .debug_pubnames 243 0 .debug_info 3249 0 .debug_abbrev 671 0 .debug_line 1758 0 .debug_frame 192 0 .debug_str 1017 0 .debug_loc 740 0 .debug_ranges 72 0 Total 21580

程序12k多,RAM是看.data吗?


你看下你编译之后生成的MAP文件,看下你编译之后需要的RAM是多少?还有在你进行设备连接之后你需要做DISK-READY()这个函数,否则U盘的支持率是很低的


我有DISKREADY(), 我的主函数就新建一个TXT文件,然后写入一个字符串,M16有1k RAM, 应该不会溢出的吧!


成功率只有2%?那么是在那个步骤出错,出错代码是多少?


我的意思是: 就简单的新建一个TXT文件,然后写入两三行文字,都基本上很少一次就成功的!(这里是对同一个程序进行测试的).

当失败的时候,会出现这样现象: U盘的数据灯不停的闪,闪烁的亮度低,速度快,通常闪了就不会停下来!


修改一下编译器优化条件试试吧


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