U盘容量读取错误,纠结了

终于听取了各位大侠的意见,把52单片机换成了58的,这下容量够用了。可是,我又纠结了。昨天新到了一个CH375的模块,是艾米电子的。于是,我屁颠屁颠的将原来的CH375模块换了下来,测试这个新的模块。使用测试函数时,按位取反,OK,没问题。可当我把以下程序烧进58里,测试的时候,出问题了,纠结纠结……

#include #include #include #include"STC89.h"

#define CH375_CMD_PORT_ADDR 0xbdf1 //命令端口地址 #define CH375_DAT_PORT_ADDR 0xbcf0 //数据端口地址

#include "CH375HF6.H" #include"Functions.h"

void main() { AUXR=0x01;//为了使用单片机外部RAM设置的 Init_Ser();//串口初始化 Initialize();//375和U盘初始化 Disk_Refer();//获取U盘信息 while(1); }

void Init_Ser(void) { EA = 1; //定时器T1设置,波特率9600,11.0592M TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; //通讯模式设置 SCON = 0x50; //启动定时器 TR1 = 1; TI = 1; }

void Initialize( ) { delayus(5); printf("Initialize Begin.\n");

CH375Reset( ); delayus(10); state=CH375LibInit( ); if(!state) { printf("CH375 Init Succeed.\n"); while(CH375DiskConnect()!=0) { delayus(50); } printf("CH375DiskConnect succeed.\n");

state=CH375DiskReady( ); if(!state) { printf("CH375Disk Ready.\n"); } } else { printf("CH375 Init failed.\n"); } printf("Initialize End.\n"); }

void Disk_Refer() { state=CH375DiskSize(); delayus(50); printf("CH375DiskSize=%02x.\n",(UINT16)state); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH375vSectorSize/512) / 2048 ) ); }

其中有些延时函数这里就不一一列举了。结果,串口调试出来个这: Initialize Begin. CH375 Init Succeed. CH375DiskConnect succeed. CH375Disk Ready. Initialize End. CH375DiskSize=00. TotalSize = 17151 MB

这个TotalSize就错了,我U盘容量3.6G的,结果却出来个17G……我把艾米的那个375模块换回了以前旧的模块以后,结果竟然是正确的。而且之前的375初始化,DiskReady都是正确的,CH375DiskSize返回也是00,正确,那不就说明了这个艾米的375模块没问题了嘛,可是偏偏最后这个,错了。纠结啊纠结,这是为什么呢…… PS.艾米的CH375晶振是12.2880M。据说,没问题。单片机晶振是11.0592。U盘之前出过问题,做过量产,原来是4G的,量产到现在只能做到3.6,没办法也不敢再修复了。

还有就是,如果换用STC11F60XE的话,执行是没问题的。编程用的是keil。请各位大侠多多指教啊~~


CH375LibInit( );这个函数可以通过吗?艾米的CH375晶振是12.2880M???一定要用12MHZ的


可以通过,要是通过不了,后边的CH375DiskSize也不会返回00。艾米的都是12.2880M的。据他们公司的说是没问题。还说在FPGA下能通过测试函数。我也用52单片机试过测试,按位取反那个,也能正确输出。 还有一个问题是,我用STC89C58RD+出不来的东西,我换了我同学的STC11F60XE却能出来……这纠结啊纠结~~


CH375芯片必须我12M,这个是说明书上面有详细的说明,你可以和艾米电子说明,12.288M初始化应该没问题,但是USB通信就有问题,一定要使用12M。


这个我也注意到了。可是有个问题还是纠结的是,STC11F60XE芯片用起来竟然没问题~~这个又是怎么回事呢?


麻烦你先换成12M晶振,12.288晶振我可以肯定不可以,我们是芯片原厂,如果你连原厂的数据都不放心的话那你还怎么调试啊。如果可以的话麻烦你告诉下艾米电子,不要把芯片的参数搞错了。


12.288MHZ芯片可以工作,但是USB信号的频率变了,肯定操作不起来U盘。


这个晶振不是一般的难拆……我正很努力的拆着,一会儿要是弄好了告诉各位大侠结果哦~~小弟在此谢谢各位啦


费了九牛二虎之力,终于把晶振卸下来,换上一个12M的。很悲剧的说,还是不行……我检查过,晶振卸下来以后,电路没损坏的……崩溃了


CH375Reset( ); delayus(10); 这个后面的延时应该为50MS,而不是10us 同时需要去看下你的程序编译之后,生成的RAM的分配是多少?包括DATA,IDATA,XDATA


一定要换成12MHZ。现在还不行,说明不是晶振引起的,但是不更换为12MHZ肯定会遇到部分U盘不兼容的问题。 state=CH375DiskSize();执行成功了没有?


回复10楼: 昨晚发现STC89C58这个芯片好像烧了,因为突然间烧不进程序了。今天还得去购买新的芯片。但是在芯片换的前几次测试里,那个艾米的模块竟然神奇的出现过一次对的串口调试返回。不知是不是回光返照…… 也在58这个芯片烧之前,好几次进行程序烧录以后,那块旧的一直用的好好的,一直也没问题的375模块,此时也出现同样的串口调试返回错误。还时好时坏的。 目前怀疑可能是58作祟,是不是还得等今天买回新的58才知道~~


回复11楼: CH375DiskSize()这个函数我在做的时候特地将返回值输出以看是否是执行成功,用的是以下语句: state=CH375DiskSize(); delayus(50); printf("CH375DiskSize=%02x.\n",(UINT16)state); 这里串口调试每次无论串口调试正确与否,无论用的艾米的新的模块还是旧的模块,都可以返回CH375DiskSize=00。说明就是执行成功了。就因为这语句执行成功了,下边 printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH375vSectorSize/512) / 2048 ) ); 语句纯粹就是结构体操作,而且还是从CH375EVT.zip例子中拷贝出来的。按道理说不应该有错。但结果就错了,所以才摸不着头脑。


很高兴的通知各位大侠,换了单片机以后,还是出不来,结果还是那样,想哭T·T 是不是对延时有特别严格的要求啊


我的也是这个问题 用的 库是ch375hfc.lib 单片机库 CH375LibInit() CH375DiskConnect() 都通过了 返回值也正确了 但是只要执行程序i= CH375DiskReady( ); 这句话 程序就不往后执行了 直接跳到了开头重新执行,如此反复 真是无语了。看了例子程序里写的: /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ /* 有的U盘总是返回未准备好,不过可以被忽略 */

于是我忽略了,但是执行CH375DiskSize();这句话也执行不过去 也是跳到程序开始处 重新执行,一直反复 不知道什么原因 ?请高手解答啊


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