我用c8051f040单片机,使用硬件spi,sck设定为50k,向U盘里的一个文件里写稿0-9的数字,是纯数字,无其它字符,前十多个正常后面就全是乱码了。 “01234567890123456789012345678901234567890123456789012345678901234567890123456??????????????????????????????????????????????????????????????L屚M嵨LL屚M嵨L&Ff啨歧” 其中“??????????????????????????????????????????????????????????????L屚M嵨LL屚M嵨L&Ff啨歧”,就是乱码,设定写入200个字节,部分代码如下: uchar WriteFile(void) { i=CH376FileOpen("/LQW36.TXT\0"); i=CH376ByteLocate(0); i=CH376ByteWrite(BufData,230,NULL); Delayms(50); i=CH376FileClose(1); } 在此子程序单步执行,返回代码均为0x14,说明操作是正常的。 其它子程序代码如下: uchar CH376FileOpen( uchar *fName ) /* 在根目录或者当前目录下打开文件或者目录(文件夹) */ { uchar i=0,j=0; do { CH376SetFileName( fName ); /* 设置将要操作的文件的文件名 */ if ( fName[0] == DEF_SEPAR_CHAR1 || fName[0] == DEF_SEPAR_CHAR2 ) CH376WriteVar32( VAR_CURRENT_CLUST, 0 ); i=CH376SendCmdInt( CMD0H_FILE_OPEN ); if((i== USB_INT_SUCCESS)||(i==ERR_MISS_FILE)) return i; j++; //qqc=j; } while(j!=5); return( i ); }
uchar CH376WriteReqBlock( PUINT8 buf ) /* 向内部指定缓冲区写入请求的数据块,返回长度 */ { uchar s, l; CH376WriteCmd( CMD01_WR_REQ_DATA ); s = l= CH376ReadData( ); /* 长度 */ if ( l ) { do { CH376WriteData( buf[l] ); buf ++; Delayus(10); } while ( l ); } CH376EndCmd( ); return( s ); } uchar CH376ByteWrite( PUINT8 buf, uint ReqCount, PUINT16 RealCount ) /* 以字节为单位向当前位置写入数据块 */ { uchar s; CH376WriteCmd( CMD2H_BYTE_WRITE ); CH376WriteData( ReqCount ); CH376WriteData( ReqCount>>8); CH376EndCmd( ); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = GetCH376IntStatus( ); if ( s == USB_INT_DISK_WRITE ) { s = CH376WriteReqBlock( buf ); /* 向内部指定缓冲区写入请求的数据块,返回长度 */ Delayms(10); CH376WriteCmd( CMD0H_BYTE_WR_GO ); CH376EndCmd( ); buf += s; if ( RealCount ) *RealCount += s; } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 结束 */ else return( s ); /* 错误 */ } } 这些子程序与例程几乎是一样的。 请大侠赐教!