我在調(diào)試對 U 盤物理讀寫時,發(fā)現(xiàn)程序運行的不是很穩(wěn)定! 在插入 U 盤之前對 CH375 進行初始化設(shè)置和設(shè)置主機模式時,或者剛插入 U 盤之時,有時會出現(xiàn)程序跑飛的現(xiàn)象,或者停在 xWriteCH375Cmd( UINT8 mCmd )中的 PORTA=mCmd 命令行就不動了! 我使用的是虛擬 I/O 總線控制,xWriteCH375Cmd( )函數(shù)編寫如下: void xWriteCH375Cmd( UINT8 mCmd ) { DDRA=0xFF; A0=1; PORTA=mCmd; WR=0; CS_HOST=0; WR=0; // 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS CS_HOST=1; WR=1; A0=0; mDelay1uS( ); mDelay1uS( ); // 至少延時2uS } xWriteCH375Data( UINT8 mData ) 和 xReadCH375Data(void) 類似,使用 WR=0 命令來延時,出現(xiàn)上述不穩(wěn)定現(xiàn)象!但能夠正常工作時,可以執(zhí)行 mReadSector( ) 和 mWriteSector( ) 函數(shù),只是 DATA_BUFFER[521] 中讀出的 #0 扇區(qū)的數(shù)據(jù)不完整,很多數(shù)據(jù)變成了0x00,指定的扇區(qū)中也沒有任何數(shù)據(jù)被寫入!并且狀態(tài)參數(shù) CH375DiskStstus = 0x03 (磁盤已經(jīng)初始化成功,但是尚未分析文件系統(tǒng)或者文件系統(tǒng)不支持)! 之前,xWriteCH375Cmd( ),xWriteCH375Data( ) 和 xReadCH375Data( ) 里使用的是 CH375HQF.H 頭文件中提供的 xDelay100uS( void )函數(shù)來代替 WR=0 命令用來延時: void xWriteCH375Cmd( UINT8 mCmd ) { DDRA=0xFF; A0=1; PORTA=mCmd; WR=0; CS_HOST=0; xDelay100uS( );// 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS CS_HOST=1; WR=1; A0=0; mDelay1uS( ); mDelay1uS( ); // 至少延時2uS } 但是,在這種情況下,雖然可以保證程序不會跑飛,但是卻無法運行 mReadSector( ) 和 mWriteSector( ) 函數(shù),或者運行后返回錯誤代碼! 請問出現(xiàn)上述不穩(wěn)定的工作現(xiàn)象,是否還是因為延時指令設(shè)置不當所導致的?如果是,請問到底應該如何延時才合適? 另外,我執(zhí)行了 mInitDisk( ) 函數(shù)和 CH375DiskReady( ) 函數(shù),并且返回值也是正確代碼,應該可以視為 U 盤枚舉成功了,可為什么 CH375DiskStstus = 0x03 (磁盤已經(jīng)初始化成功,但是尚未分析文件系統(tǒng)或者文件系統(tǒng)不支持)?請問這是何原因?應該如何解決?
你這個時序有問題啊,按照你這樣的做法,可能通信都有問題: void xWriteCH375Cmd( UINT8 mCmd ) { DDRA=0xFF; A0=1; PORTA=mCmd; CS_HOST=0; WR=0; WR=0; // 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS WR=1; CS_HOST=1; A0=0; mDelay1uS( ); mDelay1uS( ); // 至少延時2uS } 我們的數(shù)據(jù)采樣點在WR的上升延,也就是說,在WR的上升延的時候,寫命令的話,A0=1,CS=0,命令要在數(shù)據(jù)端口,按照你上面的時序,可能命令是寫不下去的,也就出現(xiàn)了你操作不穩(wěn)定的現(xiàn)象
執(zhí)行到該句 PORTA=mCmd 命令行就不動了! 在void xWriteCH375Cmd( UINT8 mCmd ) 函數(shù)中沒有使你的程序跑飛的語句, 我認為這是你的系統(tǒng)本身不穩(wěn)定,是不是無意觸動了中斷,造成你的程序跑飛.
感謝兩位高人的指點! 我使用的單片機是 MOTO 的 MC9S12D64 ,我寫上述命令的時候參考過 MC9S12D64 的芯片說明,之所以把 WR=0 放在 CS_HOST=0 之前,把 WR=1 放在 CS_HOST=1 之后,是看到該芯片說明書中的參考邏輯時序圖中是這么畫的!他圖中的 WR 信號下降沿在 CS 下降沿之前,WR 信號上升沿在 CS 上升沿之后! 我也參考了 CH375 芯片的說明書,其中給出的參考時序圖中,片選信號 CS 與 WR 或 RD 是用同一信號序列表示的,并沒有明顯說明 CS 信號和 WR(或RD) 信號,哪個應該在前,哪個應該在后,所以我就按照單片機的參考時序來編程了! 請問,編寫底層通訊的時序時,到底是應該根據(jù)單片機的時序來編寫,還是應該按照 CH375 的時序來編寫?謝謝!再次表示感謝!
應按照CH375的時序來寫,否則你怎么控制CH375呢