初始化都正常,連接通過,打開文件怎么都不行,看了下返回值是0X10,發(fā)現(xiàn)沒有這種錯(cuò)誤類型,怎么回事啊
DiskReady通過沒?文件名賦值對(duì)么?另,請(qǐng)把情況說清楚點(diǎn),是CH375,還是374?主控單片機(jī)是什么?用了哪個(gè)庫文件?
請(qǐng)問有固定電話嗎,我直接打過來問吧
DiskReady也沒法通過,但是得不到返回值,文件名賦值CopyStrToRAM(mCmdParam.Open.mPathName,"/BBB.C");,是CH375,主控芯片是ARM 的Cortex_m3,用的是ARM的IAR的庫,CH375HFU.R79,
這個(gè)問題你可以去查下USB口的信號(hào)是否有問題,其次就是仔細(xì)檢查你的USB那端是否有問題,要是實(shí)在解決不了的話,你可以把硬件寄過來我們幫你調(diào)試
(1)測(cè)試DISK_BASE_BUF,寫入再讀出,比較數(shù)據(jù)是否正確 (2)CopyStrToRAM(mCmdParam.Open.mPathName,"/BBB.C")執(zhí)行完之后有沒有添加: mCmdParam.Open.mPathName[ 6 ] = 0 表示結(jié)束標(biāo)志? (3)另,對(duì)比一下示例程序(僅通過編譯,需要添時(shí)鐘配置,I/O初始化等程序):UploadImages/200872417333381.rar
現(xiàn)在的情況是我不使用文件庫,直接用寫命令,返回消息來判斷,大致流程是: 插入U(xiǎn)盤后,獲得中斷,進(jìn)入程序,然后執(zhí)行 xWriteCH375Cmd(CMD_TEST_CONNECT); 判斷返回值xReadCH375Data(); 得到返回值USB_INT_CONNECT;說明連接好但U盤沒有初始化,然后初始化U盤 xWriteCH375Cmd(CMD_DISK_INIT);產(chǎn)生中斷 xWriteCH375Cmd(CMD_GET_STATUS);取消中斷,并獲得連接狀態(tài) xReadCH375Data();這時(shí)問題出來了,返回值不在定義的范圍內(nèi),我想文件庫中DiskReady的問題肯定是初始化U盤出問題了,為什么呢
xWriteCH375Cmd(CMD_DISK_INIT);產(chǎn)生中斷 上面命令發(fā)下去之后需要等待中斷引腳為低之后在去獲取中斷狀態(tài),否則的話,可能獲取不到正常的中斷狀態(tài),還有就是你有沒有配置你的中斷引腳之類的都會(huì)出現(xiàn)你說的現(xiàn)象
恩,找你的方法,我在xWriteCH375Cmd(CMD_DISK_INIT);產(chǎn)生中斷后面加了一步 while(CH375_INT_WIRE == (u8)Bit_SET); 然后xWriteCH375Cmd(CMD_GET_STATUS);取消中斷,并獲得連接狀態(tài) xReadCH375Data();或者的值是USB_INT_SUCCESS,說明初始化成功,然后調(diào)用 CH375DiskReady();還是無法成功,不知道怎么辦了,,,,
然后我又繼續(xù)調(diào)用xWriteCH375Cmd(CMD_DISK_READY); while(CH375_INT_WIRE == (u8)Bit_SET); xWriteCH375Cmd(CMD_GET_STATUS); 獲得的返回值xReadCH375Data()是USB_INT_SUCCESS,這樣是否說明U盤是準(zhǔn)備好了呢,但是我接下去調(diào)用庫函數(shù)fileopen(),返回的還是0x10啊,真的無語了,,,,
子程序庫中的函數(shù)調(diào)用是有先后次序的 調(diào)用CH375DiskReady()之前一定要成功執(zhí)行CH375LibInit( )和CH375DiskConnect() 你的程序中沒有體現(xiàn)這個(gè)過程,另,如果通過庫去操作U盤,是不需要用戶處理底層命令的,如:CMD_DISK_READY,CMD_DISK_INIT等
如果是你說的是操作成功的話,你去看下你在調(diào)用我們庫的時(shí)候有沒有定義我們的中斷引腳???? #define CH375_INT_WIRE ( PINB & 0x10 ) /* PINB.4, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */
知道你的意思,我把關(guān)鍵代碼貼一下 #define CH375_INT_WIRE GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) 這是定義的中斷腳,目前用查詢 當(dāng)獲得低電平時(shí),進(jìn)入中斷處理函數(shù),然后執(zhí)行CH375DiskConnect(),如果返回值是ERR_SUCCESS,則繼續(xù)執(zhí)行,否則返回,我這里獲得的返回值是ERR_SUCCESS,然后執(zhí)行CH375DiskReady(),這里我做了個(gè)死循環(huán),即 while((k = CH375DiskReady()) != ERR_SUCCESS);結(jié)果就無法出來,但是可以明顯看到在運(yùn)行這步的時(shí)候U盤的指示燈狂閃,如果直接去運(yùn)行ch375fileopen(),結(jié)果是返回0x10,就這樣。
我作的改動(dòng)還有個(gè)緩沖的改動(dòng),pDISK_BASE_BUF = &buf[0];自己定義了外部文件存儲(chǔ)區(qū)buf[1024];并且定義 #define DISK_BASE_BUF_LEN 0,這樣沒問題吧,不過我理解在CH375DiskReady()的時(shí)候應(yīng)該不需要用到文件存儲(chǔ)區(qū)吧,后面的文件讀取用到吧
那這樣,按照我下面給你的初始化代碼看下返回的數(shù)據(jù)是多少?如果這個(gè)都操作成功的話,在打開文件返回0X10就需要你去測(cè)試下DISK-BASE-BUF,或者返回0X10之后,你把DISK-BASE-BUF里面的數(shù)據(jù)帖出來看下: unsigned char mInitDisk( ) { unsigned char mIntStatus, i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB設(shè)備斷開 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出現(xiàn)錯(cuò)誤 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出錯(cuò)重試 */ mDelaymS( 200 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ } if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出現(xiàn)錯(cuò)誤 */
/* 可以由CMD_RD_USB_DATA命令將容量數(shù)據(jù)讀出,分析每扇區(qū)字節(jié)數(shù) */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ i = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長(zhǎng)度 */ if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 異常 */ for ( i = 0; i != 8; i ++ ) { /* 根據(jù)長(zhǎng)度讀取數(shù)據(jù) */ DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); /* 讀出數(shù)據(jù)并保存 */ } i = DATA_BUFFER[ 6 ]; /* U盤容量數(shù)據(jù)中的每扇區(qū)字節(jié)數(shù),大端格式 */ printf("i=%02x\n",(unsigned short)i); if ( i == 0x04 ){ BlockPerSector = 1024/CH375_BLOCK_SIZE; SectorSize=1024;} /* 磁盤的物理扇區(qū)是1K字節(jié) */ else if ( i == 0x08 ){ BlockPerSector = 2048/CH375_BLOCK_SIZE;SectorSize=2048; }/* 磁盤的物理扇區(qū)是2K字節(jié) */ else if ( i == 0x10 ){ BlockPerSector = 4096/CH375_BLOCK_SIZE;SectorSize=4096; }/* 磁盤的物理扇區(qū)是4K字節(jié) */ else {BlockPerSector = 512/CH375_BLOCK_SIZE;SectorSize=512; }/* 默認(rèn)的磁盤的物理扇區(qū)是512字節(jié) */ BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盤的扇區(qū)大小 */ printf("sec=%02x\n",(unsigned short)SectorSize); return( 0 ); /* U盤已經(jīng)成功初始化 */ }
呵呵,大致知道原因了,目前CH375DiskReady()已經(jīng)通過,原來是需要應(yīng)用程序完成的幾個(gè)程序如 void xQueryInterrupt(),xDelayAfterWrite()等函數(shù)沒有寫完全,我想那些庫函數(shù)一定調(diào)用了這些函數(shù),如果返回值不對(duì)的話庫函數(shù)的調(diào)用就會(huì)出問題吧,