求助CH375與單片機(jī)的連接使用問題

各位大師,我按照+CH375中文手冊里并口連接方式將375與STC89連接,但使用不起來.我的住程序是用的CH375.EVT里的EXAM4, main( ) { UINT8 i, c, SecCount; UINT16 NewSize; /* 因?yàn)檠菔景宓腞AM容量只有32KB,所以NewSize限制為16位,實(shí)際上如果文件大于32256字節(jié),應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計(jì) */ UINT8 code *pCodeStr; LED_OUT_INIT( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); LED_OUT_ACT( ); /* 開機(jī)后LED亮一下以示工作 */ mDelay100mS( ); /* 延時(shí)100毫秒 */ mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ printf( "Start\n" ); LED_RUN_INACT( ) mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); LED_RUN_ACT( ); /* 開機(jī)后LED亮一下以示工作 */

i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i );

LED_WR_ACT( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */ mDelay100mS( ); LED_WR_INACT( ); /* 開機(jī)后LED亮一下以示工作 */

程序運(yùn)行到 i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i );就停在這了,與P1.4和P1.5連接的兩個(gè)LED交替循環(huán)亮,而與P1.6連接的不亮,好象初始化不了,請問這個(gè)是什么原因啊,我仔細(xì)檢查了我的電路,應(yīng)該沒有問題的.求+助各位大仙了

LED_OUT_INIT( );是與P1.4連接的燈亮. LED_RUN_INACT( )是與P1.5連接的燈亮. LED_WR_ACT( );是與P1.6連接的燈亮.


庫的初始化過不了的話,很大可能還是你的硬件上還有問題。先不用庫的初始化,你自己寫個(gè)測試命令(發(fā)命令CHECK_EXIST)測試一下你的375與單片機(jī)之間的連接是不是有問題。


謝謝,具體應(yīng)該怎么寫???(新手,多多照顧)


發(fā)測試命令,寫入測試數(shù)據(jù)看返回?cái)?shù)據(jù)是否是原數(shù)據(jù)取反. 程序如下: CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); CH375_WR_DAT_PORT( 0x55 ); i = ~ 0x55; if ( CH375_RD_DAT_PORT( ) != i ) { for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); CH375_RD_DAT_PORT( ); }

}


375.C(191): error C267: 'CH375_WR_CMD_PORT': requires ANSI-style prototype 375.C(191): warning C206: 'CH375_WR_CMD_PORT': missing function-prototype 編譯的時(shí)候這個(gè)問題怎么解決啊?


你將命令寫到命令端口,數(shù)據(jù)寫到數(shù)據(jù)端口,在你文件中是定義了: #define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375數(shù)據(jù)端口的I/O地址 */

你用下面的試:

CH375_CMD_PORT= CMD_CHECK_EXIST; /* 測試CH375是否正常工作 */ delay2us( ); /* 如果時(shí)鐘頻率低于16MHz則無需該指令延時(shí) */ CH375_DAT_PORT= 0x55; /* 寫入測試數(shù)據(jù) */ delay2us( ); printf("CH375_DAT_PORT:%d\n",(unsigned short)CH375_DAT_PORT); i = ~ 0x55; /* 返回?cái)?shù)據(jù)應(yīng)該是測試數(shù)據(jù)取反 */ if ( CH375_DAT_PORT != i ) { /* CH375不正常 */    for ( i=80; i!=0; i-- ) {       CH375_CMD_PORT = CMD_RESET_ALL; /* 多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */       delay2us( );    }    CH375_CMD_PORT = 0;    Delay50ms( ); /* 延時(shí)50ms */ }


但測試結(jié)果返回值是正常的,返回?cái)?shù)據(jù)和原數(shù)據(jù)是取反。:(


那庫初使話之后返回的數(shù)據(jù)是多少????如果測試命令通過的話,那么應(yīng)該是返回0X00


大師,現(xiàn)在初始化可以了,但我自己做的375與單片機(jī)連接的板子,與P1。4連接的LED一開始不亮,當(dāng)插上U盤后先亮一下后就一直閃爍,請問這是什么原因啊?我用的是EVT文件夾里的EXAM4程序。我用的是STC公司的單片機(jī),沒有使用外部的RAM。謝謝貴人指導(dǎo)方向。


如果你的庫的初始化是過了的話,那么,你有沒有監(jiān)測你的程序是跑到什么地方停下來的?還有就是你用的STC單片機(jī)有雙DPTR嗎?這個(gè)例子是采用雙DPTR的方式


我用的是STC的89系列,支持雙DPTR的,.我想先搞個(gè)簡單的,U盤里建個(gè)新文件,所以把EXAM4的主程序刪減了點(diǎn),就是下面的.現(xiàn)在的問題是U盤插進(jìn)去后,375是對U盤操作(U盤的指示燈閃了) ,但當(dāng)P1.4連接一個(gè)LED(用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)U盤插入后亮 ) 在P1.5連接一個(gè)LED(用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤操作時(shí)亮 */) P1.6連接一個(gè)LED(用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤寫操作時(shí)亮 )這三個(gè)LED都亮了后,與P1.4連接的LED一只閃爍不停,U盤里也沒有新建的文件,是不是 /* 檢查操作狀態(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( ); } }這個(gè)操作狀態(tài)檢測出問題了啊?請高人指點(diǎn)應(yīng)該怎么解決,謝謝:)

程序如下: #include #include

/* 以下定義的詳細(xì)說明請看CH375HF6.H文件 */ #define LIB_CFG_DISK_IO 2 /* 磁盤讀寫的數(shù)據(jù)的復(fù)制方式,1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_FILE_IO 0 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */ /*#define LIB_CFG_FILE_IO_DEFAULT 1*/ /* 使用CH375HF6.H提供的默認(rèn)"外部子程序" */

#define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375數(shù)據(jù)端口的I/O地址 */ /* 只使用單片機(jī)內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區(qū), 沒有文件數(shù)據(jù)緩沖區(qū) */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ /* 由于單片機(jī)內(nèi)置的外部RAM只有1KB, 有些單片機(jī)還要去掉256字節(jié)內(nèi)部RAM, 只剩下768字節(jié)的外部RAM, 其中前512字節(jié)由CH375子程序用于磁盤數(shù)據(jù)緩沖, 由于"外部子程序"處理文件數(shù)據(jù)復(fù)制, 所以沒有文件數(shù)據(jù)緩沖區(qū) */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,使用"外部子程序"時(shí)該定義沒有意義 */ /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */

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

#include "..\CH375HF6.H" /* 如果不需要支持FAT32,那么請選用CH375HF4.H */

UINT8X mFileReadBuffer[ 64 ] _at_ 0x0200; /* 緩沖CH375讀文件的一次數(shù)據(jù)傳輸,長度為CH375_MAX_DATA_LEN */

void xWriteToExtBuf( UINT8 mLength ) /* 該子程序由CH375的子程序庫調(diào)用,用于從CH375讀取文件數(shù)據(jù)到外部緩沖區(qū),被CH375FileRead調(diào)用 */ { UINT8 i; PUINT8X p; if ( mLength == 64 ) { p = mFileReadBuffer; do { /* 根據(jù)長度讀取數(shù)據(jù),實(shí)際上長度總是CH375_MAX_DATA_LEN,也就是64 */ *p = CH375_DAT_PORT; /* 將U盤讀出數(shù)據(jù)暫存到內(nèi)部RAM緩沖區(qū),可以用這種方式將文件數(shù)據(jù)保存到單片機(jī)的各種串行存儲器中 */ p ++; } while ( -- mLength ); /* 復(fù)制上述數(shù)據(jù)的總時(shí)間不得超過2mS */ /* PutDataToDAC( mFileReadBuffer ); 將mFileReadBuffer緩沖區(qū)中的數(shù)據(jù)輸出給DAC */ for ( i = 0; i != 4; i ++ ) { while( TI == 0 ); TI = 0; SBUF = mFileReadBuffer[ i ]; } /* 顯示前4個(gè)字符 */ } else if ( mLength == 0 ) { /* 重試,恢復(fù)緩沖區(qū)起址,如果將文件數(shù)據(jù)讀寫的緩沖區(qū)的當(dāng)前指針放在mCmdParam.ReadX.mDataBuffer中則會(huì)被自動(dòng)恢復(fù),無需下面的兩行程序 */ // (UINT16)mCmdParam.ReadX.mDataBuffer; /* mDataBuffer中為負(fù)值,重試的字節(jié)數(shù) */ } }

UINT8 GetDataFromADC( ) /* 沒有ADC,所以總是模擬返回?cái)?shù)據(jù)30H */ { /* while ( RI == 0 ); RI = 0; return( SBUF ); 通過串口獲得數(shù)據(jù)或者從各種串行存儲器中取出數(shù)據(jù) */ return( '0' ); }

void xReadFromExtBuf( UINT8 mLength ) /* 該子程序由CH375的子程序庫調(diào)用,用于從外部緩沖區(qū)讀取文件數(shù)據(jù)到CH375,被CH375FileWrite調(diào)用 */ { if ( mLength ) { while ( mLength ) { /* 根據(jù)長度寫入數(shù)據(jù),實(shí)際上長度總是CH375_MAX_DATA_LEN,也就是64 */ CH375_DAT_PORT = GetDataFromADC( ); /* 從ADC獲取一字節(jié)數(shù)據(jù)寫入U(xiǎn)盤,可以用這種方式從單片機(jī)的各種串行存儲器中取出文件數(shù)據(jù) */ mLength --; } /* 復(fù)制上述數(shù)據(jù)的總時(shí)間不得超過2mS,如果超過2mS請參考下述方法 */ } else { /* 重試,恢復(fù)緩沖區(qū)起址,如果將文件數(shù)據(jù)讀寫的緩沖區(qū)的當(dāng)前指針放在mCmdParam.WriteX.mDataBuffer中則會(huì)被自動(dòng)恢復(fù),無需下面的兩行程序 */ // (UINT16)mCmdParam.WriteX.mDataBuffer; /* mDataBuffer中為負(fù)值,重試的字節(jié)數(shù) */ } }

#if 0 /* 如果xReadFromExtBuf子程序執(zhí)行總時(shí)間超過1mS,那么應(yīng)該用下述方法避免CH375長時(shí)間等待數(shù)據(jù) */ UINT8X mFileWriteBuffer[ 64 ] _at_ 0x0240; /* 緩沖CH375寫文件的一次數(shù)據(jù)傳輸,長度為CH375_MAX_DATA_LEN */ void xReadFromExtBuf( UINT8 mLength ) /* 該子程序由CH375的子程序庫調(diào)用,用于從外部緩沖區(qū)讀取文件數(shù)據(jù)到CH375,被CH375FileWrite調(diào)用 */ { UINT8 i; while ( mLength ) CH375_DAT_PORT = mLength --; /* 由于CH375的命令必須在2mS之內(nèi)完成,所以先寫入無意義數(shù)據(jù)結(jié)束前一個(gè)命令 */ for ( i = 0; i != 64; i ++ ) mFileWriteBuffer[ i ] = GetDataFromADC( ); /* 從ADC獲得數(shù)據(jù)暫存到臨時(shí)緩沖區(qū), 沒有時(shí)間限制 */ CH375_CMD_PORT = CMD_WR_USB_DATA7; /* 重新發(fā)出寫數(shù)據(jù)命令,向CH375的主機(jī)端點(diǎn)發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ if ( CH375IntStatus ) CH375IntStatus = 0; /* 僅作延時(shí),不短于2uS */ CH375_DAT_PORT = 64; /* 后續(xù)數(shù)據(jù)的長度,對于寫U盤必須是64 */ for ( i = 0; i != 64; i ++ ) CH375_DAT_PORT = mFileWriteBuffer[ i ]; /* 將臨時(shí)緩沖區(qū)中的數(shù)據(jù)寫入CH375,覆蓋前面寫入的無意義數(shù)據(jù) */ } #endif

/* 在P1.4連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)U盤插入后亮 */ sbit P1_4 = P1^4; #define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高電平 */ #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_5 = P1^5; /* 在P1.5連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤操作時(shí)亮 */ #define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ #define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_6 = P1^6; /* 在P1.6連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤寫操作時(shí)亮 */ #define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */ #define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */

/* 延時(shí)100毫秒,不精確 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }

/* 將程序空間的字符串復(fù)制到內(nèi)部RAM中,返回字符串長度 */ 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 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }

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

i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它電路初始化 */

while ( 1 ) { printf( "Wait Udisk\n" ); // while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設(shè)備連接則返回成功,CH375DiskConnect同時(shí)會(huì)更新全局變量CH375DiskStatus */


好象是你的外部緩沖區(qū)溢出了,死在建立文件的地方,你將: #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,使用"外部子程序"時(shí)該定義沒有意義 */ 中的0X0200改小了,其實(shí)沒用到FILE_DATA_BUF,該定義無意義。 還有就是你在寫的時(shí)候,得給出扇區(qū)數(shù)SecCount值;更新文件長度的時(shí)候給出文件長度NewSize的值。


恩,好了,謝謝大師了.我用的是內(nèi)置1K的RAM,如果以扇區(qū)讀寫的話一次可以讀寫多少扇區(qū)啊?如果在進(jìn)行簡單的數(shù)據(jù)采集把數(shù)據(jù)要保存到U盤,不用外置的RAM行不行?


我們的375芯片+單片機(jī)操作U盤的話,對于以文件系統(tǒng)來操作U盤的話,對于51單片機(jī)來講,需要RAM最少600字節(jié)(512磁盤緩沖區(qū)+10多個(gè)外部變量+幾十字節(jié)的變量),對于普通的51單片機(jī),對于操作物理扇區(qū)的話,RAM是可以的,最少大概需要100多字節(jié)吧


我想把U盤里的數(shù)據(jù)(譬如數(shù)字)通過375讀出后顯示在LED上,請問375將數(shù)據(jù)讀出后存放在內(nèi)部RAM的哪了?單片機(jī)應(yīng)該讀哪的地址?


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

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