我使用:MCS51\FILELIBC\EXAM7中的例子,模擬并口調(diào)程序,使用查詢方式。前邊的CH375LibInit( )和CH375DiskReady()都正常通過,但是到這一步: mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,該文件在根目錄下 */ i = CH375FileOpen( ); /* 打開文件 */ 進(jìn)入CH375FileOpen( )后就再也出不來了,請問這是怎么回事? 我用的是C8051F340,庫函數(shù)用的就是FILELIBC中帶的庫
有可能是模擬時(shí)序不好,把CH375的接口子程序貼出來
void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時(shí)序,所以進(jìn)行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P3 = 0xFF; /* 并口輸入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)1uS */ P3MDOUT=0XFF; P3 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ mDelaymS(2); CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P3MDOUT=0; P3 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { //*(UINT8XV *)0XBCF0 = mData; //return; P3MDOUT=0XFF; P3 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ mDelaymS(2); CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; P3MDOUT=0; P3 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ P3 = 0xFF; /* 輸入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 輸出有效寫控制信號, 讀CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ mDelaymS(2); mData = P3; /* 從CH375的并口輸入數(shù)據(jù) */ CH375_RD = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }
/* 如果單片機(jī)與CH375是串口連接,那么參考下面的子程序 void CH375_PORT_INIT( ) { SCON = 0xD0; 設(shè)置串口為9位數(shù)據(jù) 設(shè)置波特率和其它串口參數(shù) }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } */
/* 將程序空間的字符串復(fù)制到外部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }
/* 檢查操作狀態(tài),如果錯誤則顯示錯誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ // printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯誤 */ while ( 1 ) { LED_OUT_ACT( ); /* LED閃爍 */ mDelaymS( 200 ); LED_OUT_INACT( ); mDelaymS( 200 ); } }
用下面的讀寫時(shí)序試試: void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)1uS */ P3 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ P3MDOUT=0XFF; CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ CH375_WR = 0;CH375_WR = 0;CH375_WR = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P3MDOUT=0X00;/* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /* 調(diào)整延時(shí),CH375B延時(shí)1.5uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { //*(UINT8XV *)0XBCF0 = mData; //return; P3 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ P3MDOUT=0XFF; CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ CH375_WR = 0;CH375_WR = 0;CH375_WR = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; P3MDOUT=0X00;/* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /*調(diào)整延時(shí),CH375B延時(shí)0.6uS */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); P3MDOUT=0X00; /*置方向輸入*/ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 輸出有效讀控制信號, 寫CH375芯片的命令端口 */ CH375_RD = 0;CH375_RD = 0;CH375_RD = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ mData = P3; /* 從CH375的并口輸入數(shù)據(jù) */ CH375_RD = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ CH375_CS = 1; mDelay1_2uS( ); /*調(diào)整延時(shí),CH375B延時(shí)0.6uS */ return( mData ); }
我想問一下你為什么這么改呢? 按你給的改完,連初始化都不行了
這個是按照手冊中375并口時(shí)序要求修改的 (1)庫初始化返回值是多少 (2)參考手冊,做一下測試命令 (3)不知道硬件上CH375_CS、CH375_WR、CH375_RD、CH375_A0是怎么定義的,在CH375_PORT_INIT中需要把這幾個引腳定義為輸出。 (4)讀寫脈寬以及寫命令、寫數(shù)據(jù)、讀數(shù)據(jù)后的延時(shí)是否滿足375的要求 (5)配置好I/O口以后,對各個控制線,數(shù)據(jù)口做個高低電平測試,實(shí)際能否輸出高低電平
CH375DiskReady是循環(huán)5次通過的還是正常通過?一般來說CH375DiskReady能夠正常通過的話下面的操作基本沒什么問題,如果CH375DiskReady沒有正常通過請看看返回的錯誤代碼是多少.
使用CMD_CHECK_EXIST命令測試成功 執(zhí)行i = CH375LibInit( );后 i=0x00; 執(zhí)行 for ( i = 0; i < 5; i ++ ) { /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */ mDelaymS( 100 ); if ( CH375DiskReady( ) == ERR_SUCCESS ) { x=CH375DiskReady(); break; /* 查詢磁盤是否準(zhǔn)備好 */ } } for循環(huán)只一次,然后 x=CH375DiskReady(); x值為0x00;然后就break了 我的硬件定義如下: sbit CH375_A0 = P1^1; sbit CH375_CS = P1^3; sbit CH375_WR = P1^7; sbit CH375_RD = P1^5; sbit CH375_INT_WIRE = P2^0; P3為數(shù)據(jù)口
端口的定義: void C8051F340_INIT(void) { PCA0MD &= ~0x40; //關(guān)閉看門狗 OSCICN |= 0x03; //使用內(nèi)部12M晶振 mDelay1_2uS( ); //延時(shí)6us mDelay1_2uS( ); mDelay1_2uS( ); mDelay1_2uS( ); mDelay1_2uS( ); //初始化端口:P3.0至P3.7為D0至D7; P1.1為WR; P1.3為RD; P1.5為CS; P1.7為A0; P2.0為中斷 P1MDOUT=0xFF; //P1設(shè)置為推挽 P2MDOUT&=0XFE; //P2.0中斷引腳設(shè)置為開漏 P2|=0X01; //將P2.0寫1,禁止P2.0輸出 CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P3 = 0xFF; /* 并口輸入 */ XBR1 = 0xC0; // 允許交叉開關(guān) }
請問這個問題沒人能解答一下么? 我把整個程序發(fā)到你們技術(shù)的郵箱里了,能否幫忙解決一下呢,急?。?!
你把你的原理圖和程序發(fā)給我,我能幫你解決。這個芯片我用過很多了,還是很好用的。我大多數(shù)問題都碰到過幫你解決應(yīng)該沒有問題。
個人信息保護(hù),已隱藏
郵件已發(fā)送,謝謝
如果說發(fā)送DISK-READY這個函數(shù)可以操作過了的話,那么,你可以去看下你編譯之后RAM的資源是怎么分配的,是否超過了你的RAM空間,如果用FILELIBC的話,那么,全部使用的是外部RAM,是否在RAM上面存在問題,你也可以做下DISK-BASE-BUF的RAM測試,看下這個RAM測試是否正常?;蛘吣阍挸蒄ILELIB5庫去測試下看效果是否一樣
謝謝,請問我使用KEIL,如何看RAM的資源分配以及如何做DISK-BASE-BUF的RAM測試呢? 還有FILELIB5和FILELIBC有什么區(qū)別呢? 謝謝樓上,本人剛開始接觸所以不是太明白
FILEB5和FILEC的區(qū)別在于FILBC的RAM主要分配到了外部的RAM,而FILE5則是一部分RAM在外部,一部分在內(nèi)部,你用KEIL編譯的時(shí)候,你看下XDATA和DATA是多少?和你自己本身的資源分配的話會不會多了
FILELIBC:Program Size: data=20.4 xdata=663 code=10336 FILELIB5:Program Size: data=128.5 xdata=528 code=8117 我使用的單片機(jī)64Kflash,data=256,xdata=4K
那使用LIB5的時(shí)候出現(xiàn)了你說的上面的現(xiàn)象了嗎?