我用CH375的芯片+LPC2131,初始化已經(jīng)沒問題了,返回值為0,而且我用CHECK_EXIST測試過也沒有問題,但是在我想進(jìn)行刪除一個(gè)文件的操作,或創(chuàng)建一個(gè)文件時(shí),卻總是不成功,請問問題處在哪里呢??
(1)不成功,那么CH375FileErase(),CH375FileCreate()的返回值是多少? (2)CH375DiskConnect(),CH375DiskReady()都過沒?
如果測試命令沒問題的話,那么庫的初始化也應(yīng)該沒有問題,那么你就需要看下DISK-READY()這個(gè)函數(shù)返回的數(shù)據(jù)是多少?一定要在這個(gè)函數(shù)通過之后才能進(jìn)行打開文件和刪除文件,否則的話一定會(huì)不成功,在DISK-DEADY()這個(gè)函數(shù)操作成功的話,而打開文件不成功的話,那么你需要去測試下你的DISK-BASE-BUF這個(gè)緩沖區(qū)是否正常。
謝謝樓上兩位的答復(fù),我剛剛測了一下CH375DiskConnect()的返回值是0X00,CH375DiskReady()的返回值,是0X2C,包括CH375FileErase(),CH375FileCreate()的返回值都是0X2C。 請問我的問題應(yīng)該是在哪里呢???
關(guān)注以下幾點(diǎn): 1,看下USB的4根線有沒有接反,正確的接法為VCC,D-,D+,GND 2,USB口的供電是否充足,有些U盤的電壓低于4。8V就開始不正常工作了,在3。3V的供電系統(tǒng)中,需要對U盤單獨(dú)供電才可以。 3,USB口的UD+和UD-是否串接了電阻,如果串接了電阻,電阻一定要控制在5歐姆以內(nèi) 4,注意USB口的UD+,UD-和芯片的UD+,UD-是否連接正常,在檢測到設(shè)備之后,直接用示波器去探USB口的兩根信號線(探頭要打到*10的檔),正常情況下,應(yīng)該會(huì)出現(xiàn)周期為100NS做的方波。 5,命令與命令之間,命令與數(shù)據(jù)之間需要延時(shí)在1.5US,數(shù)據(jù)與數(shù)據(jù)之間需要0.6US,這個(gè)延時(shí)的時(shí)間太長的話,DISK-READY函數(shù)以及后面的函數(shù)都會(huì)出現(xiàn)問題,延時(shí)時(shí)間范圍在10US以內(nèi)
哦,謝謝樓上,VD+和VD-上要串接電阻么?我的USB的VD+和VD-上沒有串接電阻,是因?yàn)槲铱吹降湫碗娐分袥]有電阻啊 還有我用示波器看了以下信號線,出現(xiàn)不規(guī)則的方波,周期都在180NS以上,是因?yàn)槲覜]接電阻??? 還有如果我用函數(shù)來實(shí)現(xiàn)的話,命令與命令之間,命令與數(shù)據(jù)之間的延時(shí)應(yīng)該都是在庫函數(shù)里面做的吧,我能修改么? 請指點(diǎn)一下
(1)一般不用串,芯片內(nèi)部自帶 (2)上面的延時(shí)不在庫中,在用戶提供的三個(gè)讀寫子程序中,需要根據(jù)單片機(jī)的主頻進(jìn)行修改
修改了一下 錯(cuò)誤碼變成0x28了 崩潰了 我看。H里面的錯(cuò)誤碼0X2..都給省略了 ,請問我在哪里能看到????
首先你需要確定的幾個(gè)問題,一個(gè)就是USB的4根信號線一定要確定完全正確,其次,在出現(xiàn)波形的時(shí)候,D-,D+上面都應(yīng)該有才對,要是還不行的話,你可以拿下面的一斷程序去測試下看可以不可以: UINT8 mInitDisk( void ) { /* 初始化磁盤 */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB設(shè)備斷開 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ /*這里需要加上這個(gè)之后才可以,正確的做法也是這樣*/ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 獲取USB存儲(chǔ)器的容量 */ mDelaymS( 250 ); if(j==5) return(Status); } for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 獲取USB存儲(chǔ)器的容量 */ mDelaymS( 250 ); } return( 0 ); /* U盤已經(jīng)成功初始化 */ } 同時(shí)我們提供給你的頭文件是不允許客戶來進(jìn)行修改的,如果修改出了問題的話那肯定是你軟件上面的問題!?。?/p>
同時(shí)還有一個(gè)非常重要的就是375的晶振一定要是12M的,否則是操作不起來的
經(jīng)過測試u盤沒有初始化成功
我現(xiàn)在的是關(guān)于ARM和芯片的通信都沒有問題 就是在芯片和U盤的通信上存在問題 還沒有找到解決辦法
在線等回答 能不能再給些建議?。。?/p>
重新再確認(rèn)一下 (1)先前提到的硬件部分是否沒問題 (2)目前庫中那個(gè)函數(shù)出錯(cuò),代碼是多少? (3)把完整地程序貼出來看看
硬件部分ARM和芯片的通信完全沒問題,CH375GetVer( void );CH375Init( void ); CH375DiskConnect( ); 這幾個(gè)函數(shù)都沒問題,剩下的與u盤通信的函數(shù)就昨天都返回ox2c,今天都返回0x20,不知道怎么回事,還有就是 我用示波器看d+和d-都有方波出現(xiàn),就是周期長一點(diǎn),還有就是不是特別規(guī)則的方波 程序如下: #define Fcclk (Fosc * 5) //系統(tǒng)頻率,必須為Fosc的整數(shù)倍(1~32),且<=60MHZ #define Fcco (Fcclk /2) //CCO頻率,必須為Fcclk的2、4、8、16倍,范圍為156MHz~320MHz #define Fpclk (Fcclk / 4) * 1 //VPB時(shí)鐘頻率,只能為(Fcclk / 4)的1、2、4倍
/* 以下定義的詳細(xì)說明請看CH375HFM.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"內(nèi)部復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */
/* 單片機(jī)的RAM有限,其中CH375子程序用512字節(jié),剩余RAM部分可以用于文件讀寫緩沖 */ //#define DISK_BASE_BUF_LEN 4096 /* 默認(rèn)的磁盤數(shù)據(jù)緩沖區(qū)大小為512字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤,為0則禁止在.H文件中定義緩沖區(qū)并由應(yīng)用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_LEN 0x800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
#define CH375_INT_WIRE ( IO0PIN & 0x200000 ) /* P0.1, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ //#define EN_DISK_WRITE 1 #define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */
#include "CH375HFM.H"
/* 有些ARM單片機(jī)提供開放系統(tǒng)總線,那么直接將CH375掛在其系統(tǒng)總線上,以8位I/O方式進(jìn)行讀寫 */ /* 本例使用的LPC2114不開放系統(tǒng)總線,所以用I/O引腳模擬產(chǎn)生CH375的并口讀寫時(shí)序 */ /* 本例中的硬件連接方式如下(實(shí)際應(yīng)用電路可以參照修改下述3個(gè)并口讀寫子程序) */ /* LPC2114單片機(jī)的引腳 CH375芯片的引腳 P0.21 INT# P0.4 A0 P0.7 CS# P0.6 WR# P0.5 RD# P0.15-P0.8(8位端口) D7-D0 */
void mDelay1_2uS( ) /* 至少延時(shí)1.2uS,根據(jù)單片機(jī)主頻調(diào)整 */ { UINT32 i; for ( i = 10; i != 0; i -- ); /* 本例由于模擬I/O較慢故只需少量延時(shí) */ }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時(shí)序,所以進(jìn)行初始化 */ { IO0SET |= 0x00010060; /* 設(shè)置CS,WR,RD默認(rèn)為高電平 */ IO0DIR &= 0xFFDF00FF; /* 設(shè)置8位并口和INT#為輸入 */ IO0DIR |= 0x00010070; /* 設(shè)置CS,WR,RD,A0為輸出 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { mDelay1_2uS( ); /* 至少延時(shí)1uS */ IO0CLR |= 0x0000FF00; /* 清并口輸出 */ IO0SET |= ( (UINT32)mCmd << 8 ) | 0x00000010; /* 向CH375的并口輸出數(shù)據(jù), 輸出A0(P0.4)=1; */ IO0DIR |= 0x0001FF70; /* 寫操作所以數(shù)據(jù)輸出, 設(shè)置CS,WR,RD,A0為輸出 */ IO0CLR |= 0x00010040; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口, A0(P0.4)=1; CS(P0.16)=0; WR=(P0.6)=0; RD(P0.5)=1; */ IO0DIR = IO0DIR; IO0DIR = IO0DIR; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ IO0SET |= 0x00010070; /* 輸出無效的控制信號, 完成操作CH375芯片, A0(P0.4)=1; CS(P0.16)=1; WR=(P0.6)=1; RD(P0.5)=1; */ IO0CLR |= 0x00000010; /* 輸出A0(P0.4)=0; 可選操作 */ IO0DIR &= 0xFFFF00FF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /* 至少延時(shí)2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { mDelay1_2uS( ); IO0CLR |= 0x0000FF00; /* 清并口輸出 */ IO0SET |= (UINT32)mData << 8; /* 向CH375的并口輸出數(shù)據(jù) */ IO0DIR |= 0x0000FF00; /* 寫操作所以數(shù)據(jù)輸出 */ IO0CLR |= 0x00010050; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口, A0(P0.4)=0; CS(P0.16)=0; WR=(P0.6)=0; RD(P0.5)=1; */ IO0DIR = IO0DIR; IO0DIR = IO0DIR; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ IO0SET |= 0x00010060; /* 輸出無效的控制信號, 完成操作CH375芯片, A0(P0.4)=0; CS(P0.16)=1; WR=(P0.6)=1; RD(P0.5)=1; */ IO0DIR &= 0xFFFF00FF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { //mDelay1_2uS( ); UINT8 mData; IO0DIR &= 0xFFFF00FF; /* 讀操作所以數(shù)據(jù)輸入 */ IO0CLR |= 0x00010030; /* 輸出有效讀控制信號, 讀CH375芯片的數(shù)據(jù)端口, A0(P0.4)=0; CS(P0.16)=0; WR=(P0.6)=1; RD(P0.5)=0; */ IO0DIR = IO0DIR; IO0DIR = IO0DIR; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ mData = (UINT8)( IO0PIN >> 8 ); /* 從CH375的并口P0.15-P0.8輸入數(shù)據(jù) */ IO0SET |= 0x00010060; /* 輸出無效的控制信號, 完成操作CH375芯片, A0(P0.4)=0; CS(P0.16)=1; WR=(P0.6)=1; RD(P0.5)=1; */ mDelay1_2uS( ); return( mData ); } void InitSTDIO( ) { UINT32 x; PINSEL0 = PINSEL0 & 0xFFFFFFF0 | 0x00000005; // 設(shè)置I/O連接到UART0 U0LCR = 0x80; // DLAB位置1 x = (Fpclk>>4)/9600; // 9600bps U0DLM = x>>8; U0DLL = x&0xff; U0LCR = 0x03; // 8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn) //U0FCR = 0x01; } void transmitchar(char ch) { U0THR = ch; // 發(fā)送數(shù)據(jù) while( ( U0LSR & 0x20)== 0 ); // 等待數(shù)據(jù)發(fā)送 }
/* 在P0.20連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮 */ #define LED_OUT_INIT( ) { IO0DIR |= (~0xefffff); } /* P0.0 高電平為輸出方向 */ #define LED_OUT_ACT( ) { IO0CLR |= (~0xefffff); } /* P0.0 低電平驅(qū)動(dòng)LED顯示 */ #define LED_OUT_INACT( ) { IO0SET |= (~0xefffff); } /* P0.0 低電平驅(qū)動(dòng)LED顯示 */
/* 延時(shí)指定毫秒時(shí)間,根據(jù)單片機(jī)主頻調(diào)整,不精確 */ void mDelaymS( UINT32 ms ) { UINT32 i; while ( ms -- ) for ( i = 25000; i != 0; i -- ); }
int main( ) { UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因?yàn)镽AM容量有限,所以NewSize限制為16位,實(shí)際上如果文件較大,應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計(jì) */ UINT8 *pCodeStr; LED_OUT_INIT( ); LED_OUT_ACT( ); mDelaymS( 100 ); /* 延時(shí)100毫秒 */ LED_OUT_INACT( ); CH375_PORT_INIT(); InitSTDIO(); xWriteCH375Cmd(CMD_RESET_ALL); i = CH375LibInit(); transmitchar(i); xWriteCH375Cmd(CMD_GET_IC_VER); i=xReadCH375Data(); transmitchar(i); i=CH375DiskConnect(); transmitchar(i); i = CH375DiskSize(); transmitchar(i); i=CH375DiskReady(); transmitchar(i); i = CH375FileCreate(); transmitchar(i); mDelaymS( 200 ); }
我把原來的例子程序改了一下,用來測試的