做的課題是單片機(jī)讀寫U盤:
單片機(jī)使用ATmega8,USB芯片使用CH375S.上次發(fā)貼詢問無(wú)法檢測(cè)到U盤,后來(lái)發(fā)現(xiàn)是USB
的D+和D-線接反了。。呵呵。
現(xiàn)在CH375能讀寫U盤(以扇區(qū)方式),但是讀寫時(shí)不穩(wěn)定,有時(shí)會(huì)出現(xiàn)讀寫錯(cuò)誤。
讀寫一個(gè)扇區(qū)的時(shí)候分8次,每次64個(gè)字節(jié)大小,
現(xiàn)在最致命的狀況是這64個(gè)字節(jié)存在漏讀(寫)一兩個(gè)字節(jié),這樣后面的數(shù)據(jù)的位置便依次
往前移一兩個(gè)字節(jié)。。 /////////////////////////////////////////////////////// 本來(lái)初步估計(jì)應(yīng)該是時(shí)序的問題,但無(wú)論單片機(jī)內(nèi)讀寫CH375子函數(shù)怎么延時(shí)均會(huì)出現(xiàn)漏
讀的現(xiàn)象,而且漏讀的數(shù)據(jù)位置似乎是沒有規(guī)律的。。
CH375用的晶振是12M的,兩個(gè)電容用20P,換個(gè)晶振也還是一樣。。單片機(jī)使用的是內(nèi)部8M的
RC振蕩,會(huì)不會(huì)是單片機(jī)內(nèi)部的問題?
我還想問一點(diǎn)的就是CH375的#ACT端接的LED燈一直都不亮這算不算正常??
下面附上讀寫CH375的子函數(shù):
/* *函數(shù):void Wch375Cmd(cmd) *功能:模擬AD總線往CH375寫一個(gè)命令字 *輸入?yún)?shù):無(wú) *輸出參數(shù):無(wú) */ void Wch375Cmd( Uint8 CMD ) { DDRB = 0XFF; //置B口為輸出方式 delay_nus(2); ClrBit(PORTD,CS_375);//使能CH375 SetBit(PORTD,A0); //置命令方式 PORTB = CMD; //輸出命令字 ClrBit(PORTD,WR); //寫使能 DDRB = 0XFF; //延時(shí) SetBit(PORTD,WR); SetBit(PORTD,CS_375);//取消使能375 DDRB = 0X00; delay_nus(2); }
/* *功能 : 模擬AD總線往CH375寫一個(gè)8位數(shù)據(jù) */ void Wch375Dat( Uint8 DATA ) { DDRB = 0XFF; ClrBit(PORTD,CS_375); ClrBit(PORTD,A0); PORTB = DATA; ClrBit(PORTD,WR); //寫使能 DDRB = 0XFF; SetBit(PORTD,WR); //取消寫使能 SetBit(PORTD,CS_375);//取消使能375 DDRB = 0X00; delay_nus(2); }
/* *功能 :模擬AD總線讀取CH375一個(gè)8位數(shù)據(jù)(狀態(tài)) */ Uint8 Rch375Dat( void ) { Uint8 temp; DDRB = 0X00; ClrBit(PORTD,CS_375); ClrBit(PORTD,A0); ClrBit(PORTD,RD); //讀使能 DDRB = 0X00; temp = PINB; SetBit(PORTD,RD); //取消讀使能 SetBit(PORTD,CS_375);//取消使能375 delay_nus(2); return temp; }
這些子函數(shù)的延時(shí)都改了N遍,從0.2us改到3us,4us都還是一樣會(huì)出現(xiàn)漏讀數(shù)據(jù)的現(xiàn)象。