ch375b讀寫u盤的問(wèn)題

我按照官方的電路圖用ch375b搭了一塊u盤讀寫電路,調(diào)了幾天沒(méi)調(diào)出來(lái),郁悶之中。 單片機(jī)用的是stc89c58, 硬件資源:flash:32k,ram:1280,rom:16k, 完全可以滿足文件級(jí)子程序的要求, 測(cè)試程序用了\FILELIB4\EXAM2, 硬件上唯一不同的就是,我的ch375上的A0連的單片機(jī)上的P2.0,其他完全一樣,算了一下,命令口和數(shù)據(jù)口的地址,和程序上的一樣,所有程序上不用做任何修改。 串口調(diào)試的時(shí)候出現(xiàn)了下面的問(wèn)題:

Start Wait Udisk...... Ready ? Ready ? DiskSize TotalSize = 65535 MB Open

而且一直是這樣,u盤的大小明顯錯(cuò)誤,我用的清華紫光1g的u盤。換了一個(gè)128的u盤還是顯示這樣的大小。 (讀了很久的程序,感覺(jué)程序上沒(méi)有任何問(wèn)題啊。不知道是哪里有錯(cuò)了,請(qǐng)各位指點(diǎn)?。?/p>

#include #include

UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while (*iDestination = *iSource) { iDestination ++; iSource ++; i ++; } return( i ); }

/* 檢查操作狀態(tài),如果錯(cuò)誤則顯示錯(cuò)誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯(cuò)誤 */ while ( 1 ) { LED_OUT_ACT( ); /* LED閃爍 */ mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } }

/* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xfa; /* 11.0592Mhz, 9600bps */ TR1 = 1; TI = 1; }

main( ) { UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因?yàn)檠菔景宓腞AM容量只有32KB,所以NewSize限制為16位,實(shí)際上如果文件大于32256字節(jié),應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計(jì) */ UINT8 code *pCodeStr; LED_OUT_INIT( ); LED_OUT_ACT( ); /* 開(kāi)機(jī)后LED亮一下以示工作 */ mDelay100mS( ); /* 延時(shí)100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過(guò)串口監(jiān)控演示過(guò)程 */ printf( "Start\n" );

CH375_INT_FLAG = 0; /* 清中斷標(biāo)志 */ i = CH375LibInit( ); /* 初始化CH375程序庫(kù)和CH375芯片,操作成功返回0 */ mStopIfError( i ); CH375_INT_EN = 1; /* 允許CH375中斷 */ /* 其它電路初始化 */ EA = 1; /* 初始化完成,開(kāi)中斷 */

while ( 1 ) { printf( "Wait Udisk......\n" ); while ( CH375DiskStatus != DISK_CONNECT ); /* 等待U盤插入,單片機(jī)可以做其它事情 */ LED_OUT_ACT( ); /* LED亮 */ mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */ mDelay100mS( );

/* 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盤總是返回未準(zhǔn)備好,不過(guò)可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */ } /* 查詢磁盤物理容量 */ printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); //顯示為以MB為單位的容量

LED_RUN_ACT( ); /* 開(kāi)始操作U盤 */ /* 讀取原文件 */ printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "\\C51\\CH375HFT.C" ); /* 文件名,該文件在C51子目錄下 */ i = CH375FileOpen( ); /* 打開(kāi)文件 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 沒(méi)有找到文件 */ /* 列出文件 */ if ( i == ERR_MISS_DIR ) pCodeStr = "\\*"; /* C51子目錄不存在則列出根目錄下的文件 */ else pCodeStr = "\\C51\\CH375*"; /* CH375HFT.C文件不存在則列出\C51子目錄下的以CH375開(kāi)頭的文件 */ printf( "List file %s\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { /* 最多搜索前254個(gè)文件,超過(guò)254需參考EXAM0使用CH375vFileSize */ i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); /* 搜索文件名,*為通配符,適用于所有文件或者子目錄 */ mCmdParam.Open.mPathName[ i ] = c; /* 根據(jù)字符串長(zhǎng)度將結(jié)束符替換為搜索的序號(hào),從0到254 */ i = CH375FileOpen( ); /* 打開(kāi)文件,如果文件名中含有通配符*,則為搜索文件而不打開(kāi) */ if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已經(jīng)沒(méi)有匹配的文件名 */ if ( i == ERR_FOUND_NAME ) { /* 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區(qū)中 */ printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 顯示序號(hào)和搜索到的匹配文件名或者子目錄名 */ continue; /* 繼續(xù)搜索下一個(gè)匹配的文件名,下次搜索時(shí)序號(hào)會(huì)加1 */ } else { /* 出錯(cuò) */ mStopIfError( i ); break; } } pCodeStr = "找不到/C51/CH375HFT.C文件\xd\n"; for ( i = 0; i != 255; i ++ ) { if ( ( FILE_DATA_BUF[i] = *pCodeStr ) == 0 ) break; pCodeStr++; } NewSize = i; /* 新文件的長(zhǎng)度 */ SecCount = 1; /* (NewSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的 */ } else { /* 找到文件或者出錯(cuò) */ mStopIfError( i ); /* printf( "Query\n" ); i = CH375FileQuery( ); 查詢當(dāng)前文件的信息 mStopIfError( i );*/ printf( "Read\n" ); if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過(guò)63個(gè)扇區(qū),也就是不超過(guò)32256字節(jié) */ SecCount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過(guò)63個(gè)扇區(qū),也就是不超過(guò)32256字節(jié) */ NewSize = FILE_DATA_BUF_LEN; /* 由于RAM有限所以限制長(zhǎng)度 */ } else { /* 如果原文件較小,那么使用原長(zhǎng)度 */ SecCount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個(gè)扇區(qū)的部分 */ NewSize = (UINT16)CH375vFileSize; /* 原文件的長(zhǎng)度 */ } printf( "Size=%ld, Len=%d, Sec=%d\n", CH375vFileSize, NewSize, (UINT16)SecCount ); mCmdParam.Read.mSectorCount = SecCount; /* 讀取全部數(shù)據(jù),如果超過(guò)60個(gè)扇區(qū)則只讀取60個(gè)扇區(qū) */ /* current_buffer = & FILE_DATA_BUF[0]; 如果文件讀寫的數(shù)據(jù)的復(fù)制方式為"外部子程序",那么需要設(shè)置存放數(shù)據(jù)的緩沖區(qū)的起始地址 */ CH375vFileSize += 511; /* 默認(rèn)情況下,以扇區(qū)方式讀取數(shù)據(jù)時(shí),無(wú)法讀出文件尾部不足1個(gè)扇區(qū)的部分,所以必須臨時(shí)加大文件長(zhǎng)度以讀取尾部零頭 */ i = CH375FileRead( ); /* 從文件讀取數(shù)據(jù) */ CH375vFileSize -= 511; /* 恢復(fù)原文件長(zhǎng)度 */ mStopIfError( i ); /* 如果文件比較大,一次讀不完,可以再調(diào)用CH375FileRead繼續(xù)讀取,文件指針自動(dòng)向后移動(dòng) while ( 1 ) { c = 32; 每次讀取32個(gè)扇區(qū) mCmdParam.Read.mSectorCount = c; 指定讀取的扇區(qū)數(shù) CH375FileRead(); 讀完后文件指針自動(dòng)后移 處理數(shù)據(jù) if ( mCmdParam.Read.mSectorCount < c ) break; 實(shí)際讀出的扇區(qū)數(shù)較小則說(shuō)明文件已經(jīng)結(jié)束 }

如果希望從指定位置開(kāi)始讀寫,可以移動(dòng)文件指針 mCmdParam.Locate.mSectorOffset = 3; 跳過(guò)文件的前3個(gè)扇區(qū)開(kāi)始讀寫 i = CH375FileLocate( ); mCmdParam.Read.mSectorCount = 10; CH375FileRead(); 直接讀取從文件的第(512*3)個(gè)字節(jié)開(kāi)始的數(shù)據(jù),前3個(gè)扇區(qū)被跳過(guò)

或者自行定義數(shù)據(jù)緩沖區(qū)的起始地址 mCmdParam.ReadX.mSectorCount = 2; mCmdParam.ReadX.mDataBuffer = 0x2000; 將讀出的數(shù)據(jù)放到2000H開(kāi)始的緩沖區(qū)中 CH375FileReadX(); 從文件中讀取2個(gè)扇區(qū)到指定緩沖區(qū)

如果希望將新數(shù)據(jù)添加到原文件的尾部,可以移動(dòng)文件指針 i = CH375FileOpen( ); mCmdParam.Locate.mSectorOffset = 0xffffffff; 移到文件的尾部,以扇區(qū)為單位,如果原文件是3字節(jié),則從512字節(jié)開(kāi)始添加 i = CH375FileLocate( ); mCmdParam.Write.mSectorCount = 10; CH375FileWrite(); 在原文件的后面添加數(shù)據(jù)

或者自行定義數(shù)據(jù)緩沖區(qū)的起始地址 mCmdParam.WiiteX.mSectorCount = 2; mCmdParam.WriteX.mDataBuffer = 0x4600; 將4600H開(kāi)始的緩沖區(qū)中的數(shù)據(jù)寫入 CH375FileWriteX(); 將指定緩沖區(qū)中的數(shù)據(jù)寫入2個(gè)扇區(qū)到文件中

*/ printf( "Close\n" ); i = CH375FileClose( ); /* 關(guān)閉文件 */ mStopIfError( i );

i = FILE_DATA_BUF[100]; FILE_DATA_BUF[100] = 0; /* 置字符串結(jié)束標(biāo)志,最多顯示100個(gè)字符 */ printf( "Line 1: %s\n", FILE_DATA_BUF ); FILE_DATA_BUF[100] = i; /* 恢復(fù)原字符 */ for ( count=0; count < NewSize; count ++ ) { /* 將文件中的小寫字符轉(zhuǎn)換為大寫 */ c = FILE_DATA_BUF[ count ]; if ( c >= 'a' && c <= 'z' ) FILE_DATA_BUF[ count ] = c - ( 'a' - 'A' ); } }

#ifdef EN_DISK_WRITE /* 子程序庫(kù)支持寫操作 */ /* 產(chǎn)生新文件 */ LED_WR_ACT( ); /* 寫操作 */ printf( "Create\n" ); mCopyCodeStringToIRAM( mCmdParam.Create.mPathNa

首先你去看下你的外部RAM的地址是多少?還有在你讀寫數(shù)據(jù)的時(shí)候復(fù)值函數(shù)是什么樣子的,可以把前面的洪的定義也帖出來(lái)


用下面的方法計(jì)算: i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH375vSectorSize/512) / 2048 ) ); // 顯示為以MB為單位的容量


#define LIB_CFG_DISK_IO 3 /* 磁盤讀寫的數(shù)據(jù)的復(fù)制方式,1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_FILE_IO 3 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_INT_EN 1 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */

#define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375數(shù)據(jù)端口的I/O地址 */ /* 62256提供的32KB的RAM分為兩部分: 0000H-7DFFH為文件讀寫緩沖區(qū), 7E00H-7FFFH為磁盤數(shù)據(jù)緩沖區(qū) */ #define DISK_BASE_BUF_ADDR 0x7E00 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開(kāi)始的緩沖區(qū)長(zhǎng)度為SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長(zhǎng)度不小于一次讀寫的數(shù)據(jù)長(zhǎng)度 */ /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以外部RAM剩余長(zhǎng)度為32256字節(jié) */ #define FILE_DATA_BUF_LEN 0x7800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度不小于一次讀寫的數(shù)據(jù)長(zhǎng)度 */ /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_NO 0 /* CH375中斷號(hào), CH375的中斷線INT#引腳連接單片機(jī)的INT0引腳 */ #define CH375_INT_FLAG IE0 /* IE0,CH375中斷標(biāo)志 */ #define CH375_INT_EN EX0 /* EX0,CH375中斷允許 */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */

這就是前面的宏定義,外部ram就是按照官方的62256接法接的,地址是0000H---7fffH, 貌似程序沒(méi)進(jìn)到u盤里去一樣


用三樓的方法計(jì)算容量時(shí),顯示CH375vSectorSize未定義, 文件級(jí)子程序庫(kù)封裝得太好了,貌似我們看不到它 的實(shí)現(xiàn),所以也不知道問(wèn)題出在哪里、


#define LIB_CFG_DISK_IO 1 /* 磁盤讀寫的數(shù)據(jù)的復(fù)制方式,1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ 先設(shè)置為單DPTR方式. #define DISK_BASE_BUF_ADDR 0x7A00 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開(kāi)始的緩沖區(qū)長(zhǎng)度為 先按照上述設(shè)置以下,執(zhí)行完畢i = CH375DiskSize( );后去檢查以下CH375vSectorSize, mCmdParam.DiskSize.mDiskSizeSec.


CH375vSectorSize未定義,根本通不過(guò)編譯。


CH375vSectorSize在頭文件CH375HF6.H里面定義了 你把該文件填加進(jìn)去就可以了 #include "CH375HF6.H"


現(xiàn)在使用 #include "CH375HF6.H"和ch375hf6.lib, CH375vSectorSize雖然有定義,但是結(jié)果還是一樣: Start Wait Udisk...... Ready ? DiskSize TotalSize = 65535 MB Open u盤大小有問(wèn)題,執(zhí)行到這一步就不動(dòng)了。


CH375HF6.H你加進(jìn)去了嗎?CH375vSectorSize是我們庫(kù)里面定義的全局變量在頭文件中有聲明的.


現(xiàn)在使用 #include "CH375HF6.H"和ch375hf6.lib, CH375vSectorSize雖然有定義,但是結(jié)果還是一樣: Start Wait Udisk...... Ready ? DiskSize TotalSize = 65535 MB Open u盤大小有問(wèn)題,執(zhí)行到這一步就不動(dòng)了。


把你的工程發(fā)到我們技術(shù)支持郵箱里tech@wch.cn, 我們有相關(guān)的技術(shù)人員是去處理


工程已經(jīng)發(fā)送了, 有沒(méi)有一個(gè)非常簡(jiǎn)單的測(cè)試程序來(lái)檢驗(yàn)一下ch375b是否有效工作了?。?/p>


庫(kù)的鏈接方法你可以按照下面的帖子來(lái)進(jìn)行鏈接: http://m.findthetime.net/bbs/View.asp?S=101&I=1511 估計(jì)問(wèn)題還是出現(xiàn)在了RAM的地方,需要你的硬件原理圖來(lái)進(jìn)行判斷,即使按照你說(shuō)的拿我們的原理圖,但是還是需要確認(rèn),你可以先做一個(gè)RAM的測(cè)試,同時(shí)將上面的2個(gè)宏修改掉: #define LIB_CFG_DISK_IO 1 /* 磁盤讀寫的數(shù)據(jù)的復(fù)制方式,1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ 否則的話就會(huì)出現(xiàn)你說(shuō)的現(xiàn)象.至于工程的話只要庫(kù)鏈接正確的話操作是完全沒(méi)有問(wèn)題的.


看了一下你的程序,沒(méi)有多大問(wèn)題. #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開(kāi)始的緩沖區(qū)長(zhǎng)度為SECTOR_SIZE */ #define DISK_BASE_BUF_LEN 0x0800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度不小于一次讀寫的數(shù)據(jù)長(zhǎng)度 */ #define FILE_DATA_BUF_ADDR 0x1000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長(zhǎng)度不小于一次讀寫的數(shù)據(jù)長(zhǎng)度 */ 懷疑RAM有問(wèn)題。你做以下測(cè)試,往外部RAM寫數(shù)據(jù)再讀出來(lái)看看數(shù)據(jù)是否一樣


嗯,按照紅桃六大哥的說(shuō)明,我做了入下測(cè)試: #include #include #include #include #define uchar unsigned char #define nop() _nop_() unsigned char xdata *add;//這里定義是一定要注意數(shù)據(jù)類型,這里的類型是指地址里的內(nèi)容的數(shù)據(jù)類型 unsigned char temp[30]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43};

void mInitSTDIO( void ) {/* 僅用于調(diào)試用途及顯示內(nèi)容到PC機(jī),與該程序功能完全無(wú)關(guān) */ SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xfa; TR1=1; TI=1; /* 9600bps */ } void write() { uchar i; add=0x0000;//數(shù)據(jù)存儲(chǔ)的起始地址 for(i=0;i<14;i++)//連續(xù)存儲(chǔ)14個(gè)數(shù)據(jù) { *add=temp[i]; add++; }

} void read() {uchar i,t; add=0x0000; //讀取數(shù)據(jù)的起始地址 for(i=0;i<14;i++)//連續(xù)讀取14個(gè)數(shù)據(jù) { t=*add; add++; printf("Read Data is %x\n",t); } /*if(0x43==t) { P0=0xf7; } */ } void main() { mInitSTDIO(); write(); read(); while(1); }

返回結(jié)果是:

Read Data is 3000 Read Data is 3100 Read Data is 3200 Read Data is 3300 Read Data is 3400 Read Data is 3500 Read Data is 3600 Read Data is 3700 Read Data is 3800 Read Data is 3900 Read Data is 4000 Read Data is 4100 Read Data is 4200 Read Data is 4300

結(jié)果貌似沒(méi)有問(wèn)題, 是否需要DISK_BASE_BUF_ADDR、DISK_BASE_BUF_LEN、FILE_DATA_BUF_ADDR 的宏定義改了, 好像和這個(gè)沒(méi)什么關(guān)系吧


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

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