我手头上有三个U盘,一个是金士顿8G,一个是2G(外壳写的是金士顿,用电脑测出又是HISUN,这个应该是水货,但在电脑能正常读写,已经用四年整了),另一个是256M的SD卡+读卡器,这是我前天为了研究CH375A特意去买的。 现在程序和电路都做好了,同样的电路和程序,8G和2G的U盘都无法读写!256M的U盘可以正常读(每次读操作都正常,总算有点成就感了,这应该可以说明我的程序和电路都没问题了吧?),但有时候能写有时候写到一半又不能写,比如写一个512B的扇区只收到2个USB_INT_DISK_WRITE中断,之后就一直收不到中断,程序就一直等。这几个U盘我都尝试格式化为FAT16、FAT32也一样的结果。 我想问的是CH375A是不是对U盘有兼容性的问题?到底哪些U盘兼容那些不兼容?
是不是直接使用CH375A读写U盘底层的物理扇区中的数据,如果是,那么和文件系统就没有关系。 CH375A只能5V供电,并且V3引脚 一定要对地接一个103电容,并且USB总线上面最好不要串接电阻之类的元器件。
是的,现在只是研究怎么读写扇区,还没有涉及文件系统,只要能稳定地读写扇区,文件系统这一块就好办了,我这边不缺这方面的人才的。电路我是参照CH375DS1.pdf文档中并口方式,只是不用U3锁存。我想,既然曾经能成功地读写过扇区,程序和电路应该都没问题了吧!只是为什么有时候能成功写扇区,有时候写到一半就不能写了?还有,为什么有的U盘能读写有的又不能?能否推荐下用什么牌子的U盘比较稳定或兼容?
另外,刚才我仔细检查下,发现写到一半就不能写时,连接在ACT脚上的LED灯灭了,然后我拔出U盘再插上去,灯也不亮,也没有检测到有中断信号。好像CH375停止工作了,或者是自动复位而工作在默认模式了。
其实U盘兼容性主要是在初始化。你看一下你的程序是不是在获取DISK_SIZE的时候是返回成功的?并且磁盘容量获取是正确的? 1楼说的电路,并不是逻辑部分的电路,这部分应该问题不大,主要是USB信号部分,包含供电部分。不稳定会导致兼容性不好。
获取DISK_SIZE的时候已正确返回,和用WinHex的结果只相差一个扇区,初始化CH375和U盘的每一步我都跟踪调试过了,每一步都很正常。关于供电部分,单片机、CH375和U盘都是通过共用一条USB线由电脑的USB口供电。由于电路已经焊好了,得空的时候我再试试U盘独立供电。
这样,先测试一下2G的盘,你跟踪一下每一步过程,在哪里出错,错误代码是多少。详细的描述一下
我跟踪过了,在读扇区前我先用CMD_DISK_READY查询U盘是否就绪,返回1F,说明U盘还没就绪,但是跟踪初始化U盘的过程也没有发现错误啊!!我这三个U盘中就只有256M+读卡器的那个U盘可以正常读扇区,但写扇区时却不正常,偶尔能写,但有时候只收到1个USB_INT_DISK_WRITE中断,只收到2-7个USB_INT_DISK_WRITE中断也有可能,程序就一直在那里等齐8+1个中断,这时ACT上的LED灯是灭的。
这样,先讨论2G的问题。可能解决了2G的问题其他的问题也就解决了。 你能否把你的代码发给我?邮箱在签名中可以看到。主要查看流程是否有问题
好的,我整理一下注释先。
已经发Email给您了,感谢查收。
在读写扇区的时候,请不要再去初始化U盘了。对有些U盘来说是不允许这样做的。
我没有在读写扇时初始化U盘啊,我只有在检测到USB_INT_CONNECT中断后才调用mInitDisk()函数初始化U盘。整个主程序只调用了两次mInitDisk( )函数,一次是在刚开始运行时,另一次在后面的死循环里,是为了允许多次热插拔,我已经用if语言判断是不是USB_INT_CONNECT中断了,如果是才调用mInitDisk()函数初始化U盘。
比如刚开始等中断,这个地方可能根本就没有中断何必在这等呢?可能永远等不到中断啊。在第一次 c = mInitDisk( ); // 初始化U盘,实际是识别U盘的类型,不影响U盘中的数据,在所有读写操作之前必须进行此步骤 就直接 while ( 1 ) { c = mReadSector( 0x00000000, 1 ); } 增加一些调试信息即可。你那样的做法是不对的
因为刚开始时U盘可能还没有插入,那肯定要先等待USB_INT_CONNECT中断先了,然后再调用c = mInitDisk( )初始化U盘,最后才能调用c = mReadSector( 0x00000000, 1 )读U盘啊。我这个步骤应该没错吧?上面我所说的等不到中断,是在写扇区时等不到USB_INT_DISK_WRITE中断(写一个扇区共需要8+1个中断),而不是指等不到USB_INT_CONNECT中断。
你的程序会死机的。在没有中断的时候等了中断。 你仔细研究一下CH375EVT的CH375EV0.C,这样主函数不要做修改,直接用我们提供的来试验。USB_INT_DISK_WRITE这个中断在写函数里面已经处理了啊。你到外面还在等,这样显然不对啊。你仔细想象这个过程。或者对我们的代码不修改(只修改和硬件相关的)。然后在来试验。
USB_INT_DISK_WRITE中断我只在写函数mWriteSector()里面等,没有在外面等啊?