请教,读U盘,程序死在CH375ReadBlock()中[求助]

之前没有用lib,写出的程序读个别U盘时失败。大部分U盘可以成功。

这次改成了使用官方的lib,也出现问题,还是上次那个出问题的U盘。

以扇区模式读取U盘时,成功2、3次后就停留在CH375ReadBlock()这个函数中不动了。

U盘插入后CH375DiskReady、CH375DiskSize等都是可以成功的。

用好U盘,读取一直是很顺利的。

请教, 1,使用库时,有没有办法加上超时机制,即如果有问题超时后出错,而不是一直停留不动。 2,遇到这样的U盘,是只能死心了,还是有办法调出来?

注,使用的是查询模式。

另外,一次读取1个扇区,连续读取几次后死机,如果一次读取多个扇区,第一个读取就会死机。


如果您那边调试的U盘无法成功的话,建议您可以把U盘发给我们来调试,看下低层USB传输出现什么错误导致传输失败,这样查出来帮您解决掉传输出错的问题。 或者这样,您可以在您计算机上面把HIGH-SPEED这部分驱动给停掉,然后在计算机上面传输这个U盘,使用BUSHOUND这个软件来抓取数据,看下计算机怎么处理的,然后我们按照计算机来处理就可以了。


你好,最新发现,死循环是停在这个函数里:

void xQueryInterrupt( void ) ,

因为这里面有一句:

while ( CH375_INT_WIRE ); /* 如果CH375的中断引脚输出高电平则等待 */ --------------------------------------------- 之前官方的资料里有提到,U盘兼容的概率90%,而我之前不用库做出来的,在其他人手里不兼容的问题很普遍。(但是我们买了很多U盘,在我们自己手里出问题的只有1个)

我现在把CH375_INT_WIRE去掉,改用查询端口再试试。

邮寄U盘,当前这1个U盘即使解决了,也不知道其它不行的是否可以用。所以我想先多从程序着手。


有某些U盘确实很奇怪。特别是金士顿的假牌U盘。我们的库经过实际的测试过,大概测试了几百种U盘。没有发现有问题。当然我们也没有条件把所有的U盘全部测试,不能排除某些U盘操作很特殊,我们也确实碰到过类似的U盘。您把U盘寄过来,如果是程序问题我们找到原因后会及时更新的。


请教一下:

现在是一次读取8个扇区,读取几次后出错。(10次左右)

如果改成一次读取1个扇区,连续读8次,连第一个循环都过不去。 不知道连续读取时有什么地方要注意的?

另外,如果读取时出错,想重试,直接重新读取还是出错,想重新初始化U盘,但是发现使用库时CMD_DISK_INIT之类的指令库中都隐藏了,不知道有什么办法没有?


1、读取扇区时,以64字节为一个包,取每个包的时间不能超过2mS,不知道有没有启用中断,中断程序的时间是否过长 2、ReadBlock不返回,通常是U盘返回数据未准备好,库一直在重试,具体的情况,得实际分析通讯过程才能知道,如果有您的U盘,会方便我们分析原因


1,用的是查询方式。 时序是模拟的不是总线。

昨天晚上把读写时序调整了一下,减小了一些延时,发现情况有所变化。 (我的程序把读取到的东西发到串口,每发一次LED闪一下,之前都是闪6下必然失败,改了延时后,第一次上电能闪14下,但是拔掉U盘重新插入,就又是闪6下就失败了。)

2,如果实在不行,我可以把U盘邮寄给你们,不过我还是怀疑问题可能出在我们这里,尤其是读写时序部分,今天打算再仔细调一调。

(不行的U盘,我们这里只有1个,但是在用户手里不能读的情况很普遍)


如果您方便的话,可以把您的整套板子寄过来,我们在您的板子上进行调试。


换了个位置读,又不会出错了。

以前从第10240扇区开始读,现在换成从2048扇区开始,每次读8个扇区,连续读好几次都不出错了。。。。

是不是有的U盘的Flash本身有坏点,U盘里面有什么算法绕过坏点的,所以导致某些地方读取时容易出错?


这个没什么好办法解决,这个是U盘本身的问题,所以建议你使用比较好的U盘来配套你的系统。


读U盘出不出错,好像和写入的内容也有关系,在电脑上写入一些内容,可以顺利读取好几次,但有些内容读不完。

还有一个发现调整xWriteCH375Cmd等读写函数中的延时长短,可以改变出错的位置。但是没有发现什么规律,太长或太短,好像都更加不稳定。


xWriteCH375Cmd等读写函数中的延时有规定的,命令后延时1.5uS,数据后延时0.6uS,不可以过长,也不可以过短,把这几个程序贴出来看看


这种现象好像是你的中断引脚的配置有问题,因为之前碰到过一个客户,U盘读写每次都在几十K左右出错,有的U盘甚至一次都不通过,加了延时稍微好一点,最后查出来是单片机中断引脚的问题,他读中断引脚读的是输出寄存器,改成读输入引脚寄存器就好了。不知道你用的是什么单片机,中断引脚配置成输入状态,而且是不是每次都可以读到该引脚的正确状态。


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