【CH376S】扇区写入不正常求助~~~附代码~~

bool FileSecWrite(char* cpWrBuf, char cTarSecNbr)

{

char cRx[10];

int nLocPt=0;

char cPasSecNbr = 0;


do

{

if( CH_.SecWrite(cTarSecNbr) != 0x14 ) return false;//申请写入个数


if( CH_.ReadEP0(cRx) == 0x00 ) return false;

cPasSecNbr = cRx[1];                                //实际写入个数


if( CH_.DiskWrite(*(int*)&cRx[5], cPasSecNbr) != 0x1E ) return false;


do{

CH_.WrHostData(cpWrBuf + nLocPt, 64);

nLocPt += 64;

}while( CH_.DiskWriteGo() == 0x1E );


cTarSecNbr -= cPasSecNbr;                //更新下次申请写入个数

}while(cTarSecNbr != 0x00);    //若剩余写入个数为0则退出


return true;

}

//函数外面会Close这个文件以修改文件长度



以上代码能运行到true,而且为了实验方便,也不采用太大的cTarSecNbr值(取8)。整个流程大概如下:

申请写入cTarSecNbr个扇区----》0x27命令读返回,取得当前文件LBA(即*(int*)&cRx[5])和允许本次写入扇区数目cPasSecNbr----》以64个字节为一次数据传送,直到本次扇区数目写完,即调用WrHostData写入数据cPasSecNbr乘以8这么多次----》检查还有没有剩下的未完成扇区,有则循环,无则退出----》关闭文件。


但实验结果总是出乎意料,不能写入,求各位帮助解答~~~谢谢~

你这个里面的代码不全,命令怎么发的都看不到,你参考下面的扇区写函数,改一改你的函数。

UINT8 CH376DiskWriteSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount )  /* 将缓冲区中的多个扇区的数据块写入U盘,不支持SD卡 */
/* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */
{
 UINT8 s, err;
 UINT16 mBlockCount;
 for ( err = 0; err != 3; ++ err ) {  /* 出错重试 */
  xWriteCH376Cmd( CMD5H_DISK_WRITE );  /* 向USB存储器写扇区 */
  xWriteCH376Data( (UINT8)iLbaStart );  /* LBA的最低8位 */
  xWriteCH376Data( (UINT8)( (UINT16)iLbaStart >> 8 ) );
  xWriteCH376Data( (UINT8)( iLbaStart >> 16 ) );
  xWriteCH376Data( (UINT8)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
  xWriteCH376Data( iSectorCount );  /* 扇区数 */
  xEndCH376Cmd( );
  for ( mBlockCount = iSectorCount * DEF_SECTOR_SIZE / CH376_DAT_BLOCK_LEN; mBlockCount != 0; -- mBlockCount ) {  /* 数据块计数 */
   s = Wait376Interrupt( );  /* 等待中断并获取状态 */
   if ( s == USB_INT_DISK_WRITE ) {  /* USB存储器写数据块,请求数据写入 */
    CH376WriteHostBlock( buf, CH376_DAT_BLOCK_LEN );  /* 向USB主机端点的发送缓冲区写入数据块 */
    xWriteCH376Cmd( CMD0H_DISK_WR_GO );  /* 继续执行USB存储器的写操作 */
    xEndCH376Cmd( );
    buf += CH376_DAT_BLOCK_LEN;
   }
   else break;  /* 返回错误状态 */
  }
  if ( mBlockCount == 0 ) {
   s = Wait376Interrupt( );  /* 等待中断并获取状态 */
   if ( s == USB_INT_SUCCESS ) return( USB_INT_SUCCESS );  /* 操作成功 */
  }
  if ( s == USB_INT_DISCONNECT ) return( s );  /* U盘被移除 */
  CH376DiskReqSense( );  /* 检查USB存储器错误 */
 }
 return( s );  /* 操作失败 */
}


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