UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer ) { char *str1="開始讀取U 盤", *str2="U 盤讀取完畢", str3[]="0 "; UINT16 mBlockCount; UINT8 c; CH375_WR_CMD_PORT( CMD_DISK_READ ); // 從USB存儲器讀數(shù)據(jù)塊 CH375_WR_DAT_PORT( (UINT8)iLbaStart ); // LBA的最低8位 CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 24 ) ); // LBA的最高8位 CH375_WR_DAT_PORT( iSectorCount ); // 扇區(qū)數(shù) LCD_write_char( 0x01, 0 );// 清屏 LCD_write_string(0,0,str1); for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) { str3[1]=mBlockCount+48; LCD_write_string(0,1,str3);//顯示mBlockCount變量的值 c = mWaitInterrupt( ); // 等待中斷并獲取狀態(tài) if ( c == USB_INT_DISK_READ ) { // 等待中斷并獲取狀態(tài),請求數(shù)據(jù)讀出 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 c = CH375_RD_DAT_PORT( ); // 后續(xù)數(shù)據(jù)的長度 str3[3]=c/10+48; str3[4]=c%10+48; LCD_write_string(0,1,str3);// 顯示后續(xù)數(shù)據(jù)的長度 while ( c -- ) *oDataBuffer++ = CH375_RD_DAT_PORT( ); CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); // 繼續(xù)執(zhí)行USB存儲器的讀操作 } else break; // 返回錯誤狀態(tài) } if ( mBlockCount == 0 ) { c = mWaitInterrupt( ); // 等待中斷并獲取狀態(tài) if ( c== USB_INT_SUCCESS ) return( 0 ); // 操作成功 LCD_write_string(0,1,str1); } return( c ); // 操作失敗 }
調(diào)用它讀取LBA=0的一個扇區(qū),發(fā)現(xiàn)當(dāng)mBlockCount=7時,也就是第二次執(zhí)行循環(huán)時,在“c = mWaitInterrupt( ); ”處停止,也就是在上一個循環(huán)里執(zhí)行CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); 后芯片沒有給出中斷。
這可能是什么問題?
可以不可以將里面LCD的顯示不要或者減少其顯示?
我加顯示是為了調(diào)試用啊,不加顯示程序照樣會卡住。
您的意思是什么?LCD顯示函數(shù)會拖慢程序以致跟CH375的通訊不正常?
又測試了一下,第一次讀到的64個字節(jié)全是0x40,這是怎么回事?
你用的是什么單片機以及晶振是多少?還有就是三個讀寫子函數(shù)可以不可以看下
void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口寫入命令 */ delay_us(1); CH375_CONTROL_PORT |= CH375_A0; /* 輸出A0=1 */ CH375_CMD_PORT = cmd; CH375_CMD_DDR = 0xFF; CH375_CONTROL_PORT |= CH375_A0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT &= ~CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_CMD_DDR = 0xFF; /* 僅作延時,CH375要求讀寫脈沖寬度大于100nS */ CH375_CONTROL_PORT |= CH375_A0; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_CMD_DDR = 0x00; /* 禁止數(shù)據(jù)輸出 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 輸出A0=0; 可選操作 */ delay_us(2); /* 至少延時2uS */ }
void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù) */ CH375_DAT_PORT = dat; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_DAT_DDR = 0xFF; /* 并口D0-D7輸出 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=0; RD=1; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT &= ~CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_DAT_DDR = 0xFF;; /* 僅作延時,CH375要求讀寫脈沖寬度大于100nS */ CH375_CONTROL_PORT &= ~CH375_A0; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; CH375_DAT_DDR = 0x00; /* 禁止數(shù)據(jù)輸出 */ delay_us(1); }
UINT8 CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù) */ delay_us(1); CH375_DAT_DDR = 0x00; /* 數(shù)據(jù)輸入 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 輸出有效讀控制信號, 讀CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=1; RD=0; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT &= ~CH375_RD; CH375_DAT_DDR = 0x00; /* 僅作延時,CH375要求讀寫脈沖寬度大于100nS */ return( CH375_DAT_PIN ); /* 從CH375的并口PA輸入數(shù)據(jù) */ CH375_CONTROL_PORT &= ~CH375_A0; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; }
我用Mega128L,8M晶振。數(shù)據(jù)占一組IO口,A0 CS WR RD INT占一組IO口中的5個。
我估計問題在CH375_RD_DAT_PORT()字程序中。
RESET_ALL、CHECK_EXIST、SET_USB_MODE、DISK_INIT、DISK_SIZE這些指令執(zhí)行都沒有問題。
你的讀數(shù)據(jù)子函數(shù)有點問題,return數(shù)據(jù)提前返回了,應(yīng)該改為: UINT8 CH375_RD_DAT_PORT( void ) { unsigned char data; /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù) */ delay_us(1); CH375_DAT_DDR = 0x00; /* 數(shù)據(jù)輸入 */ CH375_CONTROL_PORT &= ~CH375_A0; /* 輸出有效讀控制信號, 讀CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=1; RD=0; */ CH375_CONTROL_PORT &= ~CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT &= ~CH375_RD;
CH375_DAT_DDR = 0x00; /* 僅作延時,CH375要求讀寫脈沖寬度大于100nS */
data=CH375_DAT_PIN; CH375_CONTROL_PORT &= ~CH375_A0; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ CH375_CONTROL_PORT |= CH375_CS; CH375_CONTROL_PORT |= CH375_WR; CH375_CONTROL_PORT |= CH375_RD; return( data ); /* 從CH375的并口PA輸入數(shù)據(jù) */
}
還有你的延時應(yīng)該是: 命令碼與命令碼之間的間隔時間:2us-……… 命令碼與數(shù)據(jù)之間的間隔時間: 2us-100us 數(shù)據(jù)與數(shù)據(jù)之間的間隔時間:1us-100us
樓上說的也不對,應(yīng)該先定義一個變量data,在輸出無效的控制信號之前 data=CH375_DAT_PORT;,函數(shù)的最后return(data); 這樣能讀到正確的數(shù)據(jù)了,不過為什么return放在前面就有問題呢?
另外我的延時哪里有問題?我沒看出來呀......請指教。
這個是時序上面的要求,只有在375的RD的上升延單片機才會采集數(shù)據(jù),如果沒有上升延的話,相當(dāng)于沒有讀取數(shù)據(jù),上面所說的延時實際上指的是在對于375芯片,命令與命令,命令與數(shù)據(jù)之間的延時為2US,數(shù)據(jù)與數(shù)據(jù)之間的延時為1US
現(xiàn)在操作正常了嗎? 具體的是你說的這樣.我只是看你的程序中將return( CH375_DAT_PIN ); 寫在前面了,就給這個改過來了,其它的我想你應(yīng)該知道. return放在前面,數(shù)據(jù)返回之后,后面的設(shè)置IO口電平就沒有起作用了.操作時序就不符合CH375的讀數(shù)據(jù)時序了. 延時方面是當(dāng)你的晶振大些時,要保證這樣的要求.我在這提前說明下.
能讀到扇區(qū)了,謝謝樓上與hcn!