发现CH376固件库中的一个BUG,不知道对不对。

最近要用到多级目录,就看了一下手册,浏览了一下例子09,发现挺简单的,就开始写程序,改来改去折腾了一下午也没有创建出多节目录,郁闷了,开始查找问题,发现运行CH376DirCreatePath 函数的时候总是跳到不是多级目录的分支下,顿时感觉找到了希望,修改了 FILE_SYS.c 文件第 317行,改为 if ( Name == 0 ) 下载程序 重新测试,发现还是不行,又调试了几次,发现原来的延时函数在创建多级目录的时候不够,加了点延时,下载程序,一次成功。特来此分享一下。

另外还有几个问题: 1:上电以后 发送 CMD11_CHECK_EXIST 有时会出现通讯无法成功,有时候又能成功,我复位ch376,重新初始化单片机IO和SPI接口,甚至软件复位单片机都无法正常通讯,怀疑这个是ch376晶振没有起振。 2:我用的是3.3V供电,ch376的复位引脚需不需要外接电容?推荐电路上没有接,但是不接的话有可能会出现问题1的情况。 3:ch376的起振电容是必要的吗?画电路的时候没有注意,那一个起振电容接在了XI引脚上了,会不会是这个原因导致问题1. 4:还有一个情况是,上电以后ch376初始化正常,插入U盘也能够正常识别,但是过一段时间插入U盘没有反应,这种问题出现的情况很少,捕捉起来也麻烦点,可以观察到的现象是系统变的很卡,我追踪了一下,在 WaitDiskIn 函数里面返回的是 0xfa ,正常情况下不插U盘返回的应该是0x82啊,这个问题估计也和硬件有关系。

请论坛内各位大神给点答案,坐等。。。

首先多级目录创建时不需要修改为if ( Name == 0 ),Name!=0时说明是多级目录,延时的话需要根据你的单片机来做调整。 关于做测试命令不稳定,首先检查一下晶振有没有起振?第25脚复位输出引脚是否为低电平?另外,上电复位或者软件复位需要延时50MS再做测试命令。复位电容接不接无所谓,起振电容是必需的。 返回FA是未知错误,你还是等到前面测试命令正确稳定测试通过,再检测设备连接。


但是原文件上 是if(Name) 啊?这正好相反啊???


原文件是if(Name),Name!=0时说明是多级目录,不就是进入if(Name)条件里面进行操作。


我的文件为什么和你的不一样呢???


整个函数贴出来,你看下。

UINT8 CH376DirCreatePath( PUINT8 PathName ) /* 新建多级目录下的目录(文件夹)并打开,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */ { UINT8 s; UINT8 Name; UINT8 ClustBuf[4]; Name = CH376SeparatePath( PathName ); /* 从路径中分离出最后一级目录名,返回最后一级文件名的偏移 */ if ( Name) { /* 不是多级目录 */ if ( (PathName[0] == DEF_SEPAR_CHAR1) || (PathName[0] == DEF_SEPAR_CHAR2) ) return( CH376DirCreate( PathName ) ); /* 在根目录下新建目录 */ else return( ERR_MISS_DIR ); /* 必须提供完整路径才能实现在当前目录下新建目录 */ } else { /* 是多级目录 */ s = CH376FileOpenDir( PathName, Name ); /* 打开多级目录下的最后一级目录,即打开新建目录的上级目录 */ if ( s != ERR_OPEN_DIR ) { /* 因为是打开上级目录,所以,如果不是成功打开了目录,那么说明有问题 */ if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); /* 中间路径必须是目录名,如果是文件名则出错 */ else if ( s == ERR_MISS_FILE ) return( ERR_MISS_DIR ); /* 中间路径的某个子目录没有找到,可能是目录名称错误 */ else return( s ); /* 操作出错 */ } xWriteCH376Cmd( CMD14_READ_VAR32 ); xWriteCH376Data( VAR_START_CLUSTER ); /* 上级目录的起始簇号 */ for ( s = 0; s != 4; s ++ ) ClustBuf[ s ] = xReadCH376Data( ); xEndCH376Cmd( ); s = CH376DirCreate( &PathName[Name] ); /* 在当前目录下新建目录 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( sizeof(FAT_DIR_INFO) + STRUCT_OFFSET( FAT_DIR_INFO, DIR_FstClusHI ) ); /* 移动文件指针 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteWrite( &ClustBuf[2], 2, NULL ); /* 写入上级目录的起始簇号的高16位 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( sizeof(FAT_DIR_INFO) + STRUCT_OFFSET( FAT_DIR_INFO, DIR_FstClusLO ) ); /* 移动文件指针 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteWrite( ClustBuf, 2, NULL ); /* 写入上级目录的起始簇号的低16位 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( 0 ); /* 移动文件指针,恢复到目录头位置 */ if ( s != USB_INT_SUCCESS ) return( s ); } return 0; }

上面是你们原来的程序。我没有改动。


你可能下在的是我们以前的程序,最新的你可以到我们网站上下载(2011/5/17),应该如下: UINT8 CH376DirCreatePath( PUINT8 PathName ) /* 新建多级目录下的目录(文件夹)并打开,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */ { UINT8 s; UINT8 Name; UINT8 ClustBuf[4]; Name = CH376SeparatePath( PathName ); /* 从路径中分离出最后一级目录名,返回最后一级文件名的偏移 */ if ( Name ) { /* 是多级目录 */ s = CH376FileOpenDir( PathName, Name ); /* 打开多级目录下的最后一级目录,即打开新建目录的上级目录 */ if ( s != ERR_OPEN_DIR ) { /* 因为是打开上级目录,所以,如果不是成功打开了目录,那么说明有问题 */ if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); /* 中间路径必须是目录名,如果是文件名则出错 */ else if ( s == ERR_MISS_FILE ) return( ERR_MISS_DIR ); /* 中间路径的某个子目录没有找到,可能是目录名称错误 */ else return( s ); /* 操作出错 */ } xWriteCH376Cmd( CMD14_READ_VAR32 ); xWriteCH376Data( VAR_START_CLUSTER ); /* 上级目录的起始簇号 */ for ( s = 0; s != 4; s ++ ) ClustBuf[ s ] = xReadCH376Data( ); xEndCH376Cmd( ); s = CH376DirCreate( &PathName[Name] ); /* 在当前目录下新建目录 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( sizeof(FAT_DIR_INFO) + STRUCT_OFFSET( FAT_DIR_INFO, DIR_FstClusHI ) ); /* 移动文件指针 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteWrite( &ClustBuf[2], 2, NULL ); /* 写入上级目录的起始簇号的高16位 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( sizeof(FAT_DIR_INFO) + STRUCT_OFFSET( FAT_DIR_INFO, DIR_FstClusLO ) ); /* 移动文件指针 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteWrite( ClustBuf, 2, NULL ); /* 写入上级目录的起始簇号的低16位 */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( 0 ); /* 移动文件指针,恢复到目录头位置 */ if ( s != USB_INT_SUCCESS ) return( s ); } else { /* 不是多级目录 */ if ( PathName[0] == DEF_SEPAR_CHAR1 || PathName[0] == DEF_SEPAR_CHAR2 ) return( CH376DirCreate( PathName ) ); /* 在根目录下新建目录 */ else return( ERR_MISS_DIR ); /* 必须提供完整路径才能实现在当前目录下新建目录 */ } }


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