我用ch375a做读写u盘的应用,但是我遇到了几个读不出来的u盘,具体的现象是发出DISK_READ命令后收到中断为USB_INT_DISK_READ,然后再发出READ_USB_DATA命令,读到的数据不够64字节,说明在usb传输过程中发生了错误...怎么才能纠正这样的错误? 本来我是用sl811做的,为了编程简单后来选择了375,这些u盘用811读写是没有这样的问题的。如果这个问题解决不了,那只好再用回811了,希望得到解答
还有,我用的不是子程序库
如果不用我们的库的话,那么,你的U盘的初始化那边是怎么做的,可以不可以把那部分程序贴出来看下可以吗??如果初始化做的不好的话,可能支持的U盘不是很高,如果想支持更多的U盘的话,建议你使用我们子程序库,我们的子程序库U盘的支持率在95%以上
上电后先延时200ms,然后发出 RESET_ALL 命令,再延时100ms,再发SET_USB_MODE命令,设置模式为START_DEVICE_AUTO_SOF。延时100ms,发DISK_INIT命令。如果有u盘就发DISK_READY和DISK_SIZE命令。然后就是DISK_READ读扇区了,错误就是在发出DISK_READ命令后可以收到中断USB_INT_DISK_READ,再发出READ_USB_DATA命令,读到的数据不够64字节或者是够了64字节但再发DISK_RD_GO再收到中断USB_INT_DISK_READ后读数据就是0了。以前没有碰到过这样的问题。我们新买了一批u盘大部分都是这个问题,没有问题的也不是很稳定。但pc机可以很好地读写u盘且速度很快,我用以前的sl811做的也不出错,希望找到解决方法.
其实,出错并不是什么大问题,关键是出错后该做什么处理才能够再变得正确。好像没有什么命令用来做出错处理阿
UINT8 mInitDisk( void ) { /* 初始化磁盘 */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出现错误 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ mDelaymS( 250 ); if(j==5) return(Status); } CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ){ /* 出现错误 */ for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ } } return( 0 ); /* U盘已经成功初始化 */ } 这个是初始化的程序,你可以参考下,实际的计算机对U盘的初始化要比这个复杂很多,要是加出错处理的话,一般情况下在初始化不成功的话,你可以加一点重试在里面.
这段程序执行过去没有问题,关键是在读u盘扇区的时候出错
我用仿真器跟踪,是发出读扇区的命令后,第一个数据包有时不够64字节,这个怎么处理?
我觉得是ch375芯片本身就识别不了这个u盘。我有你们的一个板子,用的是你们的程序,也是识别不了...怎么办?
这个不是芯片的问题,那你如果有我们的板子的话,那你可以直接上我们的库来跑下看你那些U盘支持不支持,实际上作为USB接口芯片,实际操作U盘的是单片机,而和我们芯片本身没有任何的关系
就是跑你们的库不支持,我仔细研究了一下,是读u盘扇区出的问题。发出读扇区命令DISK_READ后再写入lba,扇区数,然后收到USB_INT_DISK_READ中断,然后再发READ_USB_DATA读到的数据长度是8个字节,而不是64字节。读完这8个字节后再发DISK_RD_GO命令再收到中断就是 USB_INT_DISK_ERR 了,我就是想问一下如果出现了读到的数据不满64字节该怎么处理?
读到的8个字节数据是: 00, 00, 8E, C0, 8E, D8, 8E, D0. (HEX),能够知道是怎么回事么?
你用的是我们375直接按扇区操作U盘的例子吧,操作U盘的读写都是以扇区进行的,也就是至少是512字节,你读U盘的0扇区,看是什么数据。一般的U盘0扇区是DBR表,前几个字节应该是EB,3E(58),90----。你也可以直接用其他工具查看U盘该扇区,看和你读出来的数是不是一样。
...u盘是没问题的, 不管读那个扇区,都是读不出来的。根本就读不到512个字节,读了8个字节就出错了。我们买了一批u盘,有50%是读不出来的..郁闷啊
还有一些是读了64个字节然后就读不出来了,前面64个字节是正确的。下一个64字节就返回 USB_INT_DISK_ERR 的错误状态,查看你们的datasheet,是 USB 存储设备操作失败,怎么解决?
你可以不可以把你的程序发过来看下: tech@wch.cn