返回的數(shù)據(jù)全是0X14問題已找到,終于把容量讀出來了。反復(fù)讀取10次后發(fā)現(xiàn)容量正確。

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();// <-------返回的數(shù)據(jù)全是0X14,不是U盤容量大小.

}

void CH375_Read(void) { int i; CH375WriteCommand(RD_USB_DATA); Usb_Buf_Len=CH375ReadData(); for (i=0;i { Usb_Buf=CH375ReadData();//???????????????????????你把數(shù)據(jù)送到哪去了? } }


確實是下面這樣的,沒錯,但是發(fā)到BBS上來不知怎么會變成那樣了。

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


單片機速度是多少,讀寫命令數(shù)據(jù)之間時間間隔夠不夠


用44B0做的,我先開始只做了通訊也就是CH372的功能,感覺還可以.現(xiàn)在想把讀寫U盤也做了,結(jié)果就出現(xiàn)這個問題,應(yīng)該不是那個1US延時問題,因為這些函數(shù)在通訊上都用過的. 現(xiàn)在調(diào)試CH375_Disk_Init時,自始至終都沒有出現(xiàn)中斷,但能夠檢測U盤的插入和拔出,就是到了檢測容量時不正確,后面的就更沒法進行了. 沒有用真正的U盤進行調(diào)試,我用的是CF卡+CF讀卡器.如果是這個原因,我只好換成MP3試試. 不過我懷疑是初始化CH375_Disk_Init的過程有不對的,不知是否.


Usb_Buf_Len=CH375ReadData(); 長度讀出來是多少啊?? 你可以嘗試多次讀容量/


長度是0X14,數(shù)據(jù)也是0X14,肯定全都不對。 我今天回去再試試重讀。


前面的程序沒有使用中斷,直接用查詢狀態(tài)的方法,還可以識別到U盤的插入和拔出,就是不能讀取U盤容量。 現(xiàn)在改成硬件中斷中返回狀態(tài),在設(shè)置0X06模式之后,插入U盤時沒有中斷產(chǎn)生,導(dǎo)致CH375_INIT_Wait()函數(shù)不能退出。 中斷本身是沒有問題的,在USB與PC通訊時都正確,現(xiàn)在改成讀寫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的程序后,由于仿真系統(tǒng)原因?qū)е虏荒苤袛?,改變操作方式后,能正常中斷,也可以運行一點初始化動作,但是仍然在獲取U盤容量的地方出現(xiàn)問題。 CH375WriteCommand(DISK_SIZE); CH375_INIT_Wait(); while(CH375_get_status()!=USB_INT_SUCCESS) { } 發(fā)現(xiàn)CH375_get_status()返回的是0X1F,也就是說“USB 存儲器操作失敗”。不知是什么原因,是不是因為我用的是CF卡+CF讀卡器,不是真正的U盤?


終于把容量讀出來了。反復(fù)讀取10次后發(fā)現(xiàn)容量正確。

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(); } }


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频