[求助]请教用CH375读第一个扇区需要6~8秒,为何?

Uint8 USB_LbaRead(Uint8 *buffaddr,Uint32 lbaaddress,Uint8 sectornum) { Uint8 temp; Uint16 bufferlen=0;

USB_WRITE_CMD = USB_DISK_READ; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>0)&0xff; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>8)&0xff; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>16)&0xff; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>24)&0xff; DELAY_MS(20); USB_DATA_OPT = sectornum; DELAY_MS(20); while (1) { while(IOPIN0&USB_INIT_PORT); DELAY_MS(1000); USB_WRITE_CMD = USB_GET_STATUS; DELAY_MS(20); temp = USB_DATA_OPT; switch (temp) { case USB_INT_DISK_READ: USB_DataRead(&buffaddr[bufferlen]); bufferlen+=usbrvelen; USB_WRITE_CMD = USB_DISK_RD_GO; break; case USB_INT_SUCCESS: return 1; default : return 0; } } }

主要是延迟,一般都要加个20MS的延时,特别是中断的时候要加个1000MS的延时,这样才能读64个字节。再做个8次循环,呵呵 那个时间我调整过,只要少于立马读出来的全是00,加延迟数据就对。

不要告诉我用你们的那个文件库,因为你们这个库KEIL报错,格式不识别。

读写脉宽设置图: 20108161624398.jpg

你把你的三个读写子函数贴出来看下,明显的你加这么长延时导致了读写速度太慢啊。


#define USB_WRITE_CMD *((volatile Uint8 *)0x83000001) #define USB_DATA_OPT *((volatile Uint8 *)0x83000000)

void USB_DataRead(Uint8 *buffaddr) { Uint8 i;

USB_WRITE_CMD = USB_RD_DATA; DELAY_MS(10); usbrvelen = USB_DATA_OPT; for(i=0;i { *buffaddr = USB_DATA_OPT; buffaddr++; } }


你看看,你是不是说的这几个读写


这个函数延时这么长时间。肯定不行的,你看一下CH375DS1并口时序部分,按照时序做。 我们提供的库不会报错,如果报错则可能是你添加错误导致的。这些库都是经过实际验证的。否则不会传到网上去的。每个库都有一个对应的头文件,在头文件的开始部分会有对库的描述,编译器及其版本号等其他的的要求。另外您可以把错误信息贴出来,我们判断错误大概是由于什么来引起的。每种MCU,每种编译器都有对应的库,库文件名:CH375LIB.ZIP,可以到在线下载里搜索。根据MCU和编译器选择适合您的库

读写物理扇区的函数,你到在线下载里搜索CH375EVT.ZIP,里面有参考程序 CH375EV0.C,你参考这个去写。如果MCU的速度足够快的话,CH375读U盘应该能达到500-600KB/S。


你没有看清楚我的说明吗?我也不想延长这么长呀,关键不延长这么长读不出来呀。 另外我用的是KEIL 3.55A,LPC2200系列MCU,你说我该用那个库呀。你告诉我那个库,我添加贴图过来给你看看是不是我添加库出错,还是不识别你们的库


帮我仔细看看嘛,你们说的这些我都也注意了,想不明白所以才找你们


看来延时要加对地方,否则出力不讨好


需要看下你总线配置,因为配置是可能导致你的总线速度过快,你有没有测试过你一个读写脉冲宽度是多少啊?


别着急,你仔细看看说明书,举个例子: void USB_DataRead(Uint8 *buffaddr) { Uint8 i;

USB_WRITE_CMD = USB_RD_DATA; DELAY_MS(10); usbrvelen = USB_DATA_OPT; for(i=0;i{ *buffaddr = USB_DATA_OPT; buffaddr++; } }

这里的DELAY_MS(10);就是不对的。只需要延时1.5-2US即可。 USB_WRITE_CMD = USB_DISK_READ; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>0)&0xff; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>8)&0xff; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>16)&0xff; DELAY_MS(20); USB_DATA_OPT = (lbaaddress>>24)&0xff; DELAY_MS(20); USB_DATA_OPT = sectornum; DELAY_MS(20); 这里也是不对的。你没有按照我们提供的时序去做。所以建议你看一下CH375DS1,和CH375EV0.C 你看看里面是怎么写的,然后去参考。 8楼已经告诉你了。检查你的读写脉冲是否符合要求。之所以会产生你说的现象,可能就是读写脉冲不对,导致需要在后面加很长的延时,这是有可能的。


我的读写脉冲设置抓图给你,帮我看看合适不? 啊,怎么上图?


读写脉宽设置在一楼 然后我更下面的这样 void USB_DataRead(Uint8 *buffaddr) { Uint8 i;

USB_WRITE_CMD = USB_RD_DATA; DELAY_NS(10); usbrvelen = USB_DATA_OPT; for(i=0;i{ *buffaddr = USB_DATA_OPT; buffaddr++; DELAY_NS(5); } }

USB_WRITE_CMD = USB_DISK_READ; DELAY_NS(10); USB_DATA_OPT = (lbaaddress>>0)&0xff; DELAY_NS(10); USB_DATA_OPT = (lbaaddress>>8)&0xff; DELAY_NS(10); USB_DATA_OPT = (lbaaddress>>16)&0xff; DELAY_NS(10); USB_DATA_OPT = (lbaaddress>>24)&0xff; DELAY_NS(10); USB_DATA_OPT = sectornum; DELAY_NS(10);


两位再帮我琢磨琢磨,该怎么样提高读出数据速度


就是需要你的时序图来看下符合不符合我们芯片的读写时序,因为你采用的是高速单片机,所以要特别注意这些地方。


图不需要上传,按照下面的时序做: CH375B 命令码与命令码之间的间隔时间 1.5 uS CH375B 命令码与数据之间的间隔时间 1.5 uS CH375B 数据与数据之间的间隔时间 0.6 uS 有效的写选通脉冲WR 的宽度 60 nS 有效的读选通脉冲RD 的宽度 60 nS RD 或WR 前的地址输入建立时间 5 nS RD 或WR 后的地址输入保持时间 5 nS 写选通WR 前的数据输入建立时间 0 nS 写选通WR 后的数据输入保持时间 5 nS 读选通RD 有效到数据输出有效 0 nS 读选通RD 无效到数据输出无效 0 nS

CH375DS1 第12页。你测试一下你现在的读写低电平的脉冲宽度,自己调节一下,然后调节一下。 写命令之前延时1US,之后延时2US, 写数据后延时1US 读数据前延时1US。 调试好时间后,做测试命令,能通过表示读写正确。然后按照CH375EV0.C写程序即可。你看看CH375EV0.C,按照以上提供的方法完全能够解决你的问题了。


好,那我仔细测试,有目标就有信心了


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