375緩沖區(qū)問題

用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)成功初始化 */ }

自己頂一個(gè),希望知道的回答一下,是不是我板子上的CH375B壞了


在不能獲取磁盤容量的時(shí)候發(fā)送CMD_DISK_R_SENSE命令,然后重試. CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出錯(cuò)重試 */ for(i=0;i!=5;i++) {   mDelaymS( 200 );   CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); //發(fā)送R_SENSE命令 mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus == USB_INT_SUCCESS ) { /* 出錯(cuò)重試 */   mIntStatus = CH375_RD_DAT_PORT( ); //  printf("CMD_DISK_R_SENSE : %02x ",(unsigned short)mIntStatus);  }   CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */   mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */   if ( mIntStatus == USB_INT_SUCCESS )   break; } }


發(fā)送CMD_DISK_SIZE后得到的中斷號(hào)是USB_INT_SUCCESS,但再發(fā)送CMD_RD_USB_DATA,讀出來的數(shù)據(jù)全0


而且,發(fā)了CMD_DISK_R_SENSE以后,再發(fā)CMD_RD_USB_DATA,讀出來的數(shù)據(jù)還是0


1.首先讀取的數(shù)據(jù)長度是否正確? 2.存放接收數(shù)據(jù)的緩沖區(qū)是否可以正常讀寫. 3.命令和數(shù)據(jù)之間延時(shí)2us,數(shù)據(jù)和數(shù)據(jù)之間延時(shí)1us


1.數(shù)據(jù)長度不正確 2.存放數(shù)據(jù)的緩沖區(qū)是RAM,正常讀寫,是375內(nèi)部的緩沖區(qū)讀不出來 3.命令和數(shù)據(jù)的延時(shí)都有,而且我剛剛用的是單步調(diào)試


把你的原理圖和程序發(fā)到技術(shù)支持信箱 tech@wch.cn


CMD_DISK_R_SENSE之后,要重新發(fā)獲取磁盤容量的命令.而不是去讀數(shù)據(jù).CMD_DISK_R_SENSE只是去查詢錯(cuò)誤狀態(tài).查詢完畢后重新去獲取就可以了,一般兩次基本上都可以正常獲取到的.


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

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