用51單片機(jī)與CH375配合讀寫U盤,調(diào)試過程中,CH375工作正常,發(fā)測(cè)試命令,讀版本號(hào)命令正常,也能檢測(cè)到U盤的插入,但是有一個(gè)問題,就是在讀取375緩沖區(qū)是總是出錯(cuò),比如,讀U盤容量,檢測(cè)到中斷后,再發(fā)CMD_RD_USB_DATA,讀的數(shù)據(jù)全是0,發(fā) CMD_GET_DESCR命令也是一樣,等等,程序如下: /* 初始化磁盤 */ unsigned char mInitDisk( ) { unsigned char mIntStatus, i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB設(shè)備斷開 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出現(xiàn)錯(cuò)誤 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出錯(cuò)重試 */ mDelaymS( 200 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ } if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出現(xiàn)錯(cuò)誤 */
/* 可以由CMD_RD_USB_DATA命令將容量數(shù)據(jù)讀出,分析每扇區(qū)字節(jié)數(shù) */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ i = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長度 */ if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 異常 */ for ( i = 0; i != 8; i ++ ) { /* 根據(jù)長度讀取數(shù)據(jù) */ DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); /* 讀出數(shù)據(jù)并保存 */ } i = DATA_BUFFER[ 6 ]; /* U盤容量數(shù)據(jù)中的每扇區(qū)字節(jié)數(shù),大端格式 */ if ( i == 0x04 ) BlockPerSector = 1024/CH375_BLOCK_SIZE; /* 磁盤的物理扇區(qū)是1K字節(jié) */ else if ( i == 0x08 ) BlockPerSector = 2048/CH375_BLOCK_SIZE; /* 磁盤的物理扇區(qū)是2K字節(jié) */ else if ( i == 0x10 ) BlockPerSector = 4096/CH375_BLOCK_SIZE; /* 磁盤的物理扇區(qū)是4K字節(jié) */ else BlockPerSector = 512/CH375_BLOCK_SIZE; /* 默認(rèn)的磁盤的物理扇區(qū)是512字節(jié) */ BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盤的扇區(qū)大小 */ CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); /* 設(shè)置USB存儲(chǔ)器的每扇區(qū)數(shù)據(jù)包總數(shù) */ CH375_WR_DAT_PORT( 0x39 ); CH375_WR_DAT_PORT( BlockPerSector ); /* 設(shè)置每扇區(qū)數(shù)據(jù)包總數(shù) */ return( 0 ); /* U盤已經(jīng)成功初始化 */ }