我用CH375標(biāo)準(zhǔn)U盤(pán)讀寫(xiě)模塊在c8051f020的單片機(jī)上做一個(gè)讀寫(xiě)口,因?yàn)槲乙娴臄?shù)據(jù)不是太多,用字節(jié)讀寫(xiě)方式就行了,可是不知道字節(jié)讀寫(xiě)方式該咋樣的讀寫(xiě),誰(shuí)有這方面的例程能不能該我發(fā)個(gè)來(lái)呢?謝謝了在此?。。∥业泥]箱:個(gè)人信息保護(hù),已隱藏
你到我們公司網(wǎng)站上下載CH375HM.ZIP,這里面有字節(jié)讀寫(xiě)的例子程序。
謝謝你的回答,你說(shuō)的是應(yīng)用資料中的ch375hm.zip 嗎? 我已經(jīng)下了,可是沒(méi)有字節(jié)讀寫(xiě)的例子
那里面,并口方式只提供了扇區(qū)模式讀寫(xiě)的例子。 但是你可以根據(jù)我們提供的串口方式下,以字節(jié)模式讀寫(xiě)的例子作些簡(jiǎn)單的修改就可以了。
你說(shuō)得是不是SER_BYTE 中的CH375HMS.C 你的一是我只改以下兩個(gè)函數(shù)就可以了嗎? /* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)給CH375模塊 */ void mSendByte( unsigned char c ) { TI = 0; SBUF = c; while ( TI == 0 ); }
/* 從CH375模塊接收一個(gè)字節(jié)數(shù)據(jù) */ unsigned char mRecvByte( ) { unsigned char c; while ( RI == 0 ); c = SBUF; RI = 0; return( c ); }
不是,這兩個(gè)子函數(shù)是串口發(fā)送接收一個(gè)字節(jié)的數(shù)據(jù)的函數(shù),你用并口不需要它們。 扇區(qū)模式的讀寫(xiě)用CMD_FileRead和CMD_FileWrite函數(shù),你用字節(jié)模式讀寫(xiě)的話(huà),應(yīng)該用CMD_ByteRead和CMD_ByteWrite,需要設(shè)置讀寫(xiě)大小的輸入?yún)?shù)。 最好先仔細(xì)看看我們模塊的說(shuō)明書(shū)CH375HM.PDF和CH375HMP.PDF。
這個(gè)是并口讀寫(xiě)數(shù)據(jù)的例子,可以參考: #include #include #include #include
#define MAX_PATH_LEN 20 /* 最大路徑長(zhǎng)度,含所有斜杠分隔符和小數(shù)點(diǎn)間隔符以及路徑結(jié)束符00H,CH375模塊支持的最大值是64,最小值是13,并口最大值62 */ #include "CH375HM.H" unsigned char TempLength;
#define CH375HM_INDEX XBYTE[0xBCF0] /* CH375模塊的索引端口的I/O地址 */ #define CH375HM_DATA XBYTE[0xBDF1] /* CH375模塊的數(shù)據(jù)端口的I/O地址 */ #define CH375HM_INT_WIRE INT0 /* 假定CH375模塊的INT#引腳連接到單片機(jī)的INT0引腳 */ sbit P15 = P1^5; #define CH375HM_STA P15 /* 假定CH375模塊的STA#引腳連接到單片機(jī)的P15引腳 */ sbit LED_OUT =P1^4; /* P1.4 低電平驅(qū)動(dòng)LED顯示,用于監(jiān)控演示程序的進(jìn)度 */
/* 假定文件數(shù)據(jù)緩沖區(qū): ExtRAM: 0000H-7FFFH */ //unsigned char xdata DATA_BUF[ 512 * 2 ] _at_ 0x0000; /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),從該單元開(kāi)始的緩沖區(qū)長(zhǎng)度不小于一次讀寫(xiě)的數(shù)據(jù)長(zhǎng)度,最少為512字節(jié) */
//unsigned char xdata TempBuffer[80] _at_ 0x0000; unsigned char str[2]; unsigned char m_var; char n; CMD_PARAM mCmdParam; /* 默認(rèn)情況下該結(jié)構(gòu)將占用64字節(jié)的RAM,可以修改MAX_PATH_LEN常量,當(dāng)修改為32時(shí),只占用32字節(jié)的RAM */ unsigned char mIntStatus; /* CH375模塊的中斷狀態(tài)或者操作完成狀態(tài) */
/* 對(duì)于模擬的并口讀寫(xiě)時(shí)序或者其它并口讀寫(xiě)方式,請(qǐng)修改以下3個(gè)子程序 */ #define CH375HM_INDEX_WR( Index ) { CH375HM_INDEX = (Index); } /* 寫(xiě)索引地址 */ #define CH375HM_DATA_WR( Data ) { CH375HM_DATA = (Data); } /* 寫(xiě)數(shù)據(jù) */ #define CH375HM_DATA_RD( ) ( CH375HM_DATA ) /* 讀數(shù)據(jù) */
/* 以毫秒為單位延時(shí),適用于24MHz時(shí)鐘 */ void mDelaymS( unsigned char delay ) { unsigned char i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ } }
//void atoi( char *s) reentrant //{
// n = 0; // for ( i = 0; s[i] >= '0' && s[i] <= '9'; ++i ) // n = 16 *(s[0] - '0') + (s[1] - '0'); // return n; //}
/* 執(zhí)行命令 */ unsigned char ExecCommandBuf( unsigned char cmd, unsigned char len, unsigned char xdata *bufstart ) reentrant /* 輸入命令碼和輸入?yún)?shù)長(zhǎng)度,返回操作狀態(tài)碼,輸入?yún)?shù)和返回參數(shù)都在CMD_PARAM結(jié)構(gòu)中 */ /* 輸入?yún)?shù)bufstart僅用于CMD_FileRead或者CMD_FileWrite命令,指定外部RAM緩沖區(qū)的起始地址,可以參考中斷方式C程序采用全局變量buffer的方式 */ { unsigned char i, status; #define DataCount status /* 節(jié)約一個(gè)變量單元 */ unsigned char data *buf; unsigned char xdata *CurrentBuf; CH375HM_INDEX_WR( 0 ); /* 索引地址置0 */ CH375HM_DATA_WR( cmd ); /* 向索引地址0寫(xiě)入命令碼 */ CH375HM_DATA_WR( len ); /* 向索引地址1寫(xiě)入后續(xù)參數(shù)的長(zhǎng)度 */ if ( len ) { /* 有參數(shù) */ i = len; buf = (unsigned char *)&mCmdParam; /* 指向輸入?yún)?shù)的起始地址 */ do { CH375HM_DATA_WR( *buf ); /* 從索引地址2開(kāi)始,寫(xiě)入?yún)?shù) */ buf ++; } while ( -- i ); }
CH375HM_STA = 0; /* 產(chǎn)生下降沿通知模塊,說(shuō)明命令包已經(jīng)寫(xiě)入,請(qǐng)求開(kāi)始執(zhí)行命令 */ CurrentBuf = bufstart; /* 外部RAM緩沖區(qū)起始地址,僅用于FileRead或者FileWrite命令 */ while ( 1 ) { /* 處理數(shù)據(jù)傳輸,直到操作完成才退出 */
while ( CH375HM_INT_WIRE ); /* 等待模塊完成操作產(chǎn)生低電平中斷,最佳檢測(cè)方式是對(duì)模塊的INT#信號(hào)進(jìn)行下降沿邊沿檢測(cè) */
CH375HM_INDEX_WR( 63 ); /* 寫(xiě)入索引地址63 */ status = CH375HM_DATA_RD( ); /* 從索引地址63讀取中斷狀態(tài) */
CH375HM_STA = 1; /* 中斷應(yīng)答,取消來(lái)自模塊的中斷請(qǐng)求 */
/* 因?yàn)槟K在收到中斷應(yīng)答后3uS之內(nèi)才撤消中斷請(qǐng)求,所以,如果是查詢(xún)INT#信號(hào)的低電平,那么在發(fā)出中斷應(yīng)答后3uS之內(nèi)不應(yīng)該再查詢(xún)INT#信號(hào)的狀態(tài) 但是由于51單片機(jī)較慢,下面的處理時(shí)間已經(jīng)超過(guò)3uS,所以不必另加延時(shí)等待模塊撤消中斷請(qǐng)求 */ if ( status == ERR_SUCCESS ) { /* 操作成功 */ CH375HM_INDEX_WR( 1 ); DataCount = CH375HM_DATA_RD( ); /* 從索引地址1讀取返回結(jié)果數(shù)據(jù)的長(zhǎng)度,計(jì)數(shù) */ if ( DataCount ) { /* 有結(jié)果數(shù)據(jù) */ buf = (unsigned char *)&mCmdParam; /* 指向輸出參數(shù)的起始地址 */ i = 2; do { CH375HM_INDEX_WR( i ); i ++; *buf = CH375HM_DATA_RD( ); /* 從索引地址2開(kāi)始,讀取結(jié)果 */ buf ++; } while ( -- DataCount ); } //status = ERR_SUCCESS; break; /* 操作成功返回 */ }
else if ( status == USB_INT_DISK_READ || status == USB_INT_DISK_WRITE || status == USB_INT_DISK_RETRY ) { break; } else { /* 操作失敗 */ if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) mDelaymS( 100 ); /* U盤(pán)剛剛連接或者斷開(kāi),應(yīng)該延時(shí)幾十毫秒再操作 */ break; } } while( CH375HM_INT_WIRE == 0 );// 如果單片機(jī)速度很快,有可能該程序返回前模塊尚未撤消中斷請(qǐng)求,那么應(yīng)該等待中斷請(qǐng)求引腳無(wú)效 */ return( status ); }
/* 執(zhí)行命令 */ unsigned char ExecCommand( unsigned char cmd, unsigned char len ) reentrant /* 輸入命令碼和輸入?yún)?shù)長(zhǎng)度,返回操作狀態(tài)碼,輸入?yún)?shù)和返回參數(shù)都在CMD_PARAM結(jié)構(gòu)中 */ { return( ExecCommandBuf( cmd, len, 0 ) ); /* 只有CMD_FileRead或者CMD_FileWrite命令用到輸入?yún)?shù)bufstart,其它命令沒(méi)有用到 */ }
/* 檢查操作狀態(tài),如果錯(cuò)誤則顯示錯(cuò)誤代碼并停機(jī),應(yīng)該替換為實(shí)際的處理措施 */ void mStopIfError( unsigned char iError ) reentrant { unsigned char led; if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ //printf( "Error: %02X\n", (unsigned short)iError ); /* 顯示錯(cuò)誤 */ led=0; while ( 1 ) { LED_OUT = led&1; /* LED閃爍 */ mDelaymS( 100 ); led^=1; } }
/* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) {
SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }
/* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)給CH375模塊 */ void mSendByte( unsigned char c ) { TI = 0; SBUF = c; while ( TI == 0 ); }
/* 從CH375模塊接收一個(gè)字節(jié)數(shù)據(jù) */ //unsigned char mRecvByte( ) //{ // unsigned char c; // while ( RI == 0 ); // c = SBUF; // RI = 0; // return( c ); //}
main( ) { unsigned char i; LED_OUT = 0; mDelaymS( 200 ); /* 延時(shí)100毫秒,CH375模塊上電后需要100毫秒左右的復(fù)位時(shí)間 */ mDelaymS( 200 ); mDelaymS( 200 ); mDelaymS( 200 ); mDelaymS( 200 ); LED_OUT = 1; mInitSTDIO( ); printf( "Start\n" );
while ( 1 ) {
printf( "Wait Udisk\n" ); while ( 1 ) { /* 使用查詢(xún)方式看U盤(pán)是否連接 */ i = ExecCommand( CMD_QueryStatus, 0 ); /* 查詢(xún)當(dāng)前模塊的狀態(tài) */ mStopIfError( i ); if ( mCmdParam.Status.mDiskStatus >= DISK_CONNECT ) break; /* U盤(pán)已經(jīng)連接 */ mDelaymS( 200 ); } mDelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */ LED_OUT = 0; /* LED亮 */ for ( i = 0; i < 5; i ++ ) { mDelaymS( 100 ); printf( "Ready ?\n" ); if ( ExecCommand( CMD_DiskReady, 0 ) == ERR_SUCCESS ) break; /* 查詢(xún)磁盤(pán)是否準(zhǔn)備好 */ }
/* 讀取原文件 */ printf( "open\n" ); // memcpy( mCmdParam.Open.mPathName, "\\C51\\CH375HFT.C", MAX_PATH_LEN ); /* 文件名,該文件在C51子目錄下 */ memcpy( mCmdParam.Open.mPathName, "\\CH375.C", MAX_PATH_LEN ); i = ExecCommand( CMD_FileOpen, MAX_PATH_LEN ); /* 打開(kāi)文件,輸入?yún)?shù)置為最大值,省得再計(jì)算參數(shù)長(zhǎng)度 */
if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { printf( "miss_file\n" ); } else { mStopIfError( i );
while(1) {
mCmdParam.ByteRead.mByteCount = 20; /* 請(qǐng)求讀出20字節(jié)數(shù)據(jù), 單次讀寫(xiě)的長(zhǎng)度不能超過(guò) sizeof( mCmdParam.ByteWrite.mByteBuffer ) */ i = ExecCommand( CMD_ByteRead, 1 ); /* 以字節(jié)為單位讀取數(shù)據(jù) */ mStopIfError( i );
if ( mCmdParam.ByteRead.mByteCount<20 ) break; for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] ); }
mCmdParam.Close.mUpdateLen = 0; i = ExecCommand( CMD_FileClose, 1 ); /* 關(guān)閉文件 */ mStopIfError( i );
}
/* 查詢(xún)磁盤(pán)信息 */ pri
(1)請(qǐng)問(wèn)hcn 用的是并行查詢(xún)的方式,字節(jié)讀寫(xiě)還需要時(shí)值下面的函數(shù)嗎? (2)還有我把數(shù)據(jù)線(xiàn)接到了p7口上,(我用的c8051f020單片機(jī)控制的),寫(xiě)的時(shí)候咋樣往p7 口上送的數(shù)據(jù)呢? 我在您的程序中沒(méi)有看到(也就是說(shuō)不知道哪句是往p7口的送的數(shù)據(jù)?) 因?yàn)槲覍?duì)c語(yǔ)言也不是太精通,看不太懂上邊的函數(shù)是怎么寫(xiě)入的數(shù)據(jù)? 請(qǐng)針對(duì)我的問(wèn)題給出些詳細(xì)的解答,好嗎? 在此謝謝了! /* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) {
SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }
/* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)給CH375模塊 */ void mSendByte( unsigned char c ) { TI = 0; SBUF = c; while ( TI == 0 ); }
/* 從CH375
1,下面的函數(shù)是不需要的,只是為了用串口數(shù)據(jù)來(lái)監(jiān)測(cè)程序運(yùn)行的 2,你要修改的就是索引口地址和數(shù)據(jù)口地址