能連接U盤進(jìn)行讀寫了,但是成功率只有2%左右,怎么救啊?

就簡單的新建一個TXT文件,然后寫入兩三行文字,都基本上很少一次就成功的!

錯誤的主要現(xiàn)象是,U盤的數(shù)據(jù)燈的在不停的閃,閃爍的亮度低,速度超快,通常閃了就不會停下來! 我用的MCU是AVR M16,使用庫函數(shù),字節(jié)方式,使用8M內(nèi)部時鐘,部分程序是這樣的:

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延時1uS */ PORTD |= 0x17; PORTC = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ DDRC = 0xFF; /* 并口D0-D7輸出 */ PORTD &=~(1< PORTD &=~(1< DDRC = 0xFF; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mDelay1uS( ); PORTD |= 0x17; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止數(shù)據(jù)輸出 */ //PORTD &= 0xFB; /* 輸出A0=0; 可選操作 */ mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延時2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { PORTC = mData; /* 向CH375的并口輸出數(shù)據(jù) */ DDRC = 0xFF; /* 并口D0-D7輸出 */ PORTD |= 0x17; PORTD&=~(1< PORTD&=~(1< PORTD&=~(1< DDRC = 0xFF; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mDelay1uS( ); PORTD|= 0x17; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止數(shù)據(jù)輸出 */ //mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延時1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; //mDelay1uS( ); mDelay1uS( ); mDelay1uS( ); /* 至少延時1.2uS */ PORTD |= 0x17; DDRC = 0x00; /* 數(shù)據(jù)輸入 */ PORTD &=~(1< PORTD &=~(1< PORTD &=~(1< DDRC = 0x00; DDRC = 0x00; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mDelay1uS( ); mData = PINC; /* 從CH375的并口PA輸入數(shù)據(jù) */ PORTD |= 0x17; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ mDelay1uS( ); return( mData ); }

主函數(shù)部分: CH375_PORT_INIT(); DELAYMS(1); CH375Reset(); DELAYMS(1); while(CH375LibInit()!=ERR_SUCCESS); while(CH375DiskConnect()!=ERR_SUCCESS){ DELAYMS(100); }

strcpy((char *)mCmdParam.Create.mPathName,"/ABC.TXT"); while(CH375FileCreate()!=ERR_SUCCESS); pCodeStr = (UINT8 *)"2009年4月8日 星期三XXXXXXXXXXXXXXXXXXXXXXXXXXX"; while( 1 ) { for ( i=0; i c = *pCodeStr; mCmdParam.ByteWrite.mByteBuffer[i] = c; if ( c == 0 ) break; pCodeStr++; } if ( i == 0 ) break; mCmdParam.ByteWrite.mByteCount = i; while(CH375ByteWrite( )!=ERR_SUCCESS); } mCmdParam.Close.mUpdateLen = 1; while(CH375FileClose()!=ERR_SUCCESS);

電路圖按照REAME文檔第三頁2.4.2的參考圖(上面那個)!!

你看下你用MEGA16編譯之后程序空間和RAM空間有沒有溢出?


section size addr .text 12808 0 .data 178 8388704 .bss 620 8388882 .debug_aranges 32 0 .debug_pubnames 243 0 .debug_info 3249 0 .debug_abbrev 671 0 .debug_line 1758 0 .debug_frame 192 0 .debug_str 1017 0 .debug_loc 740 0 .debug_ranges 72 0 Total 21580

程序12k多,RAM是看.data嗎?


你看下你編譯之后生成的MAP文件,看下你編譯之后需要的RAM是多少?還有在你進(jìn)行設(shè)備連接之后你需要做DISK-READY()這個函數(shù),否則U盤的支持率是很低的


我有DISKREADY(), 我的主函數(shù)就新建一個TXT文件,然后寫入一個字符串,M16有1k RAM, 應(yīng)該不會溢出的吧!


成功率只有2%?那么是在那個步驟出錯,出錯代碼是多少?


我的意思是: 就簡單的新建一個TXT文件,然后寫入兩三行文字,都基本上很少一次就成功的!(這里是對同一個程序進(jìn)行測試的).

當(dāng)失敗的時候,會出現(xiàn)這樣現(xiàn)象: U盤的數(shù)據(jù)燈不停的閃,閃爍的亮度低,速度快,通常閃了就不會停下來!


修改一下編譯器優(yōu)化條件試試吧


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

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