arm7(lpc1754) + ch376s +sd卡 无法创建长文件名

各位大虾:

    如题。

短文件名读写操作都没问题,最近想要对长文件名进行操作,可是按照例程11,创建都不成功。无法得到长文件名,只能得到短文件名。请大虾们指导指导,谢谢!!!

 

定义的长文件名:UINT8 code LongName2[] =
{
 "This is Long Name File !!!.H"
};


  主程序参照例程11,

  for ( j = 0; LongName2[j] != 0; j++ ) {  /* 复制并转换长文件名到LongNameBuf长文件名缓冲区 */
   LongNameBuf[j*2] = LongName2[j];  /* 将英文字符转换为两字节的小端UNICODE编码 */
   LongNameBuf[j*2+1] = 0x00;
  }
  LongNameBuf[j*2] = 0x00;  // 末尾用两个0表示结束
  LongNameBuf[j*2+1] = 0x00;
//  strcpy( PathNameBuf, "/LONGNAME.H" );  // 复制该长文件名的ANSI编码的全路径的短文件名(8+3格式),短文件名由长文件名生成(只要不冲突,其实随便定)
  s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf );  /* 新建具有长文件名的文件 */


单步发现我的程序在这个函数while里出不去

UINT8 CH376LocateInUpDir( PUINT8 PathName )  /* 在上级目录(文件夹)中移动文件指针到当前文件目录信息所在的扇区 */
/* 另外,顺便将当前文件目录信息所在的扇区的前一个扇区的LBA地址写入CH376内部VAR_FAT_DIR_LBA变量(为了方便收集长文件名时向前搜索,否则要多移动一次) */
/* 使用了全局缓冲区GlobalBuf的前12个字节 */
{
 UINT8 s;
 xWriteCH376Cmd( CMD14_READ_VAR32 );
 xWriteCH376Data( VAR_FAT_DIR_LBA );  /* 当前文件目录信息所在的扇区LBA地址 */
 for ( s = 4; s != 8; s ++ ) GlobalBuf[ s ] = xReadCH376Data( );  /* 临时保存于全局缓冲区中,节约RAM */
 //xEndCH376Cmd( );
 s = CH376SeparatePath( PathName );  /* 从路径中分离出最后一级文件名或者目录名,返回最后一级文件名或者目录名的偏移 */
 if ( s ) s = CH376FileOpenDir( PathName, s );  /* 是多级目录,打开多级目录下的最后一级目录,即打开文件的上级目录 */
 else s = CH376FileOpen( "/" );  /* 根目录下的文件,则打开根目录 */
 if ( s != ERR_OPEN_DIR ) return( s );
 *(PUINT32)(&GlobalBuf[0]) = 0;  /* 目录扇区偏移扇区数,保存在全局缓冲区中,节约RAM */
 while ( 1 ) {  /* 不断移动文件指针,直到与当前文件目录信息所在的扇区LBA地址匹配 */
  s = CH376SecLocate( *(PUINT32)(&GlobalBuf[0]) );  /* 以扇区为单位在上级目录中移动文件指针 */
  if ( s != USB_INT_SUCCESS ) return( s );
  CH376ReadBlock( &GlobalBuf[8] );  /* 从内存缓冲区读取CH376_CMD_DATA.SectorLocate.mSectorLba数据块,返回长度总是sizeof(CH376_CMD_DATA.SectorLocate) */
  if ( *(PUINT32)(&GlobalBuf[8]) == *(PUINT32)(&GlobalBuf[4]) ) return( USB_INT_SUCCESS );  /* 已到当前文件目录信息扇区 */
  xWriteCH376Cmd( CMD50_WRITE_VAR32 );
  xWriteCH376Data( VAR_FAT_DIR_LBA );  /* 得到前一个扇区,设置为新的文件目录信息扇区LBA地址 */
  for ( s = 8; s != 12; s ++ ) xWriteCH376Data( GlobalBuf[ s ] );
  //xEndCH376Cmd( );
  ++ *(PUINT32)(&GlobalBuf[0]);
 }
}


读到的GlobalBuf[4]--[ 7 ] 数值很大 为:0x28 0x5A 0x80 0x80   怎么回事?


这个函数里面CH376SecLocate这个值返回是多少?这个函数实际上就是找空闲的目录项在填长文件名。


返回值是0x14

也抓到过为0的时候 

蒙圈了


有没有哪位遇见过呢?求赐教。折腾了一个星期了。


0X14怎么会退出不来函数呢?单片机和CH376之间的接口是哪个接口?串口?SPI?并口?


已经得到解答了,我的单片机和CH376是串口通信,按照例程是不能实现长文件名的,必须修改串口发送命令函数,就是要在发送完两个同步码后清空接收缓存区及FIFO。


但是目前我还没有时间测试,因为刚好有预留的SPI方式通信,所以直接改成SPI方式了,已经可以实现对长文件名的操作了。  等项目结束,有空的时候,再测测串口方式。十分感谢大家对我的帮助,尤其是贵公司蔡工。


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