返回的数据全是0X14问题已找到,终于把容量读出来了。反复读取10次后发现容量正确。

void CH375_Read(void) { int i; CH375WriteCommand(RD_USB_DATA); Usb_Buf_Len=CH375ReadData(); for (i=0;i { Usb_Buf[i]=CH375ReadData(); } }

void CH375_Disk_Init(void) { CH375_check(); CH375_setmode(0x06);//usb host

Delay(200); while(CH375_get_status()!=USB_INT_CONNECT) { }

Delay(2000); CH375WriteCommand(DISK_INIT); while(CH375_get_status()!=USB_INT_SUCCESS) { }

Delay(200); CH375WriteCommand(DISK_RESET);

Delay(200); CH375WriteCommand(DISK_SIZE); while(CH375_get_status()!=USB_INT_SUCCESS)//USB_INT_SUCCESS就是0X14 { } CH375_Read();// <-------返回的数据全是0X14,不是U盘容量大小.

}

void CH375_Read(void) { int i; CH375WriteCommand(RD_USB_DATA); Usb_Buf_Len=CH375ReadData(); for (i=0;i { Usb_Buf=CH375ReadData();//???????????????????????你把数据送到哪去了? } }


确实是下面这样的,没错,但是发到BBS上来不知怎么会变成那样了。

void CH375_Read(void) { int i; CH375WriteCommand(RD_USB_DATA); Usb_Buf_Len=CH375ReadData(); for (i=0;i { Usb_Buf [ i ] = CH375ReadData(); } }


单片机速度是多少,读写命令数据之间时间间隔够不够


用44B0做的,我先开始只做了通讯也就是CH372的功能,感觉还可以.现在想把读写U盘也做了,结果就出现这个问题,应该不是那个1US延时问题,因为这些函数在通讯上都用过的. 现在调试CH375_Disk_Init时,自始至终都没有出现中断,但能够检测U盘的插入和拔出,就是到了检测容量时不正确,后面的就更没法进行了. 没有用真正的U盘进行调试,我用的是CF卡+CF读卡器.如果是这个原因,我只好换成MP3试试. 不过我怀疑是初始化CH375_Disk_Init的过程有不对的,不知是否.


Usb_Buf_Len=CH375ReadData(); 长度读出来是多少啊?? 你可以尝试多次读容量/


长度是0X14,数据也是0X14,肯定全都不对。 我今天回去再试试重读。


前面的程序没有使用中断,直接用查询状态的方法,还可以识别到U盘的插入和拔出,就是不能读取U盘容量。 现在改成硬件中断中返回状态,在设置0X06模式之后,插入U盘时没有中断产生,导致CH375_INIT_Wait()函数不能退出。 中断本身是没有问题的,在USB与PC通讯时都正确,现在改成读写U盘时,中断部分仅做了功能的添加而已。

这是文件前面的定义 volatile U8 Cf_Buff[512]; volatile U8 Usb_Buf_Len; volatile U8 Usb_Buf[64]; volatile U8* Usb_Buf_Startp; volatile U8* Usb_Buf_Endp; volatile U8 Usb_INT_HAVE=0; volatile U8 Usb_INT_STATIC=0;

这是CH375中断程序 void __irq Ch375_Int(void) { Usb_INT_STATIC=CH375_get_status(); Usb_INT_HAVE=1; switch (Usb_INT_STATIC) { case 0x09://8byte send end { CH375_Unlock_Usb(); break; } case 0x02://64byte rec end { CH375_Read(); switch(Usb_Buf[0]) { case 0: { break; } case 9: // int year,month,day,weekday,hour,min,sec; { if (Usb_Buf_Len>2) { rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset rBCDYEAR = Usb_Buf[1]; rBCDMON = Usb_Buf[2]; rBCDDAY = Usb_Buf[3]; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7 rBCDDATE = Usb_Buf[4]; rBCDHOUR = Usb_Buf[5]; rBCDMIN = Usb_Buf[6]; rBCDSEC = Usb_Buf[7]; } DisplayRtc(); Usb_Buf[0]= year &0x000000ff; Usb_Buf[1]=(year>>8) &0x000000ff; Usb_Buf[2]= month &0x000000ff; Usb_Buf[3]=(month>>8) &0x000000ff; Usb_Buf[4]= day &0x000000ff; Usb_Buf[5]=(day>>8) &0x000000ff; Usb_Buf[6]= weekday &0x000000ff; Usb_Buf[7]=(weekday>>8) &0x000000ff; Usb_Buf[8]= hour &0x000000ff; Usb_Buf[9]=(hour>>8) &0x000000ff; Usb_Buf[10]= min &0x000000ff; Usb_Buf[11]=(min>>8) &0x000000ff; Usb_Buf[12]= sec &0x000000ff; Usb_Buf[13]=(sec>>8) &0x000000ff; Usb_Buf_Startp=Usb_Buf; Usb_Buf_Endp=Usb_Buf+14; CH375_Write(); break; } default : { break; } }

break; } case 0x0a://64byte send end { if (Usb_Buf_Startp { //Uart_Printf("%x,%x\n",Usb_Buf_Startp,Usb_Buf_Endp); CH375_Write(); } CH375_Unlock_Usb(); break; } //***************************** case USB_INT_SUCCESS: //0x14 { break; } case USB_INT_CONNECT: //0x15 { break; } case USB_INT_DISCONNECT: //0x16 { break; } case USB_INT_BUF_OVER: //0x17 { break; } case USB_INT_DISK_READ: //0x1d { break; } case USB_INT_DISK_ERITE: //0x1e { break; } case USB_INT_DISK_ERR: //0x1f { break; } default: { break; } }

rI_ISPC=BIT_EINT2; //clear pending_bit rPCONG=0xffff; //EINT7~0 }

这是初始化U盘的程序

void CH375_INIT_Wait(void) { while(Usb_INT_HAVE==0) { } Usb_INT_HAVE=0; }

void CH375_Disk_Init(void) { CH375_check(); CH375_setmode(0x06);//usb host

Delay(200); // <------20毫秒 CH375_INIT_Wait();// <------这里插入U盘不能通过。 while(Usb_INT_STATIC!=USB_INT_CONNECT) { }

Delay(2000); CH375WriteCommand(DISK_INIT); CH375_INIT_Wait(); while(Usb_INT_STATIC!=USB_INT_SUCCESS) { }

CH375_setmode(0x07);//RST

Delay(200); CH375WriteCommand(DISK_SIZE); while(CH375_get_status()!=USB_INT_SUCCESS) { } CH375_Read();

}


更改成2005-10-27 22:15:14的程序后,由于仿真系统原因导致不能中断,改变操作方式后,能正常中断,也可以运行一点初始化动作,但是仍然在获取U盘容量的地方出现问题。 CH375WriteCommand(DISK_SIZE); CH375_INIT_Wait(); while(CH375_get_status()!=USB_INT_SUCCESS) { } 发现CH375_get_status()返回的是0X1F,也就是说“USB 存储器操作失败”。不知是什么原因,是不是因为我用的是CF卡+CF读卡器,不是真正的U盘?


终于把容量读出来了。反复读取10次后发现容量正确。

CH375_check(); CH375_setmode(0x06);//usb host

Delay(200); CH375_INIT_Wait(); while(Usb_INT_STATUS!=USB_INT_CONNECT) { }

Delay(2000); CH375WriteCommand(DISK_INIT); CH375_INIT_Wait(); while(Usb_INT_STATUS!=USB_INT_SUCCESS) { }

Delay(2000); for (i=0;i<10;i++) { for (JKL=0;JKL<20000;JKL++) { Delay(200); CH375WriteCommand(DISK_SIZE); CH375_INIT_Wait(); if (Usb_INT_STATUS=USB_INT_SUCCESS) break; } CH375WriteCommand(RD_USB_DATA); length=CH375ReadData(); for (llll=0;llll { Usb_Buf[llll]=CH375ReadData(); } }


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