CH376多次写入后出乱码

运行存储的数据如下: usb Connect Success usb start save can1 data DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,1 ? ^ DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11, ? ^DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11 ? DATA 11,11,11,11,11,11,11,11 DATA 11,11,11,11,11,11,11,11 usb end save can1 data usb Remove Success 正常应该每行一样,但出现有错行现象。 ============================================================================ 字节写函数 UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) { UINT8 s;

xWriteCH376Cmd( CMD2H_BYTE_WRITE ); mDelayS( 30 ); xWriteCH376Data( (UINT8)ReqCount ); // mDelayS( 30 ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); // mDelayS( 30 );

if ( RealCount ) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_WRITE ) { // mDelayS( 100 ); s = CH376WriteReqBlock( buf ); if (s < ReqCount) { Nop() 此处设置断点,不存在s < ReqCount 的时候 ???????????????????? 实际请求的数据如上显示,每行为一次字节写操作 } // mDelayS( 100 ); xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); // xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); //mDelayS( 10 ); buf += s; if ( RealCount ) *RealCount += s; } else if ( s == USB_INT_SUCCESS ) return( s ); /* 结束 */ else return( s ); /* 错误 */ } } ========================================================= 请求字节写函数,请求写入的频率为1S LED_LOG=~LED_LOG; s = show_save_var_can1(tmp); s = CH376ByteWrite( tmp, s, NULL );

s1=CH376ByteWrite( tmp, 0, NULL ); if ((s !=USB_INT_SUCCESS )||(s1 !=USB_INT_SUCCESS )) { Nop() ??????????????此处理设置断点查看,不存在返回不成功的时候,但实际写入到 记录本中的数据如下,存在乱行现象 } =============================================================

我们提供的底层的函数有没有被改动过? 每512字节就会出错。 CH376WriteReqBlock( buf ); 该函数怎么处理的?


UINT8 CH376WriteReqBlock( PUINT8 buf ) /* 向内部指定缓冲区写入请求的数据块,返回长度 */ { UINT8 s, l; xWriteCH376Cmd( CMD01_WR_REQ_DATA ); mDelayS( 100 ); s = l = xReadCH376Data( ); /* 长度 */ if ( l ) { do { xWriteCH376Data( *buf ); mDelayS( 30 ); buf ++; } while ( -- l ); } // xEndCH376Cmd( ); return( s ); }


底层函数没有改动过,只是加了个mDelayS 函数 void mDelayS( UINT8 ms ) /* 至少延时0.5uS,根据单片机主频调整 */ { while(--ms) { } }


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