大俠們,請教一個問題,我的一個應(yīng)用中使用了CH375B,但是感覺讀速度很慢,讀1M數(shù)據(jù)需要使用近4分鐘。 我使用的是扇區(qū)讀寫方式,沒有使用文件系統(tǒng),讀扇區(qū)也是一個接著一個的讀出來的。 我使用的是ARM cortex m3 運行在50M速度上。 請教一下,這個讀速度是否正常,CH375B在我這個情況下,理論上能將U盤讀到多快? 最后還有一個問題,我手里有一個多功能讀卡器,就是能同時插入很多種卡的讀卡器,插到電腦上顯示為4個盤符,但是CH375B無法操作它,返回的數(shù)據(jù)說是無法讀寫,無論我怎么設(shè)置邏輯單元也一樣,這個請大俠也幫著告訴一下! 謝謝?。。size=6]文字[/size]
按照你的如果是M3的話,讀U盤的速度應(yīng)該可以做到500K字節(jié)/S,你可以去優(yōu)化你讀扇區(qū)函數(shù)以及三個讀寫子函數(shù),至于你所說的多合一讀卡器的話,你可以把你初始化那部分代碼帖出來看下
與375的通訊接口是什么方式?硬件并口、模擬I/O,還是串口,1樓所說的速度必須是硬件并口才能達到
我使用的是流明的1138,直接使用它的8位GPIO 我貼一下我的讀扇區(qū)函數(shù) unsigned char mReadSector(unsigned char f[]) { unsigned char mIntStatus; // unsigned char *mBufferPoint; unsigned int mBlockCount; unsigned char mLength; unsigned int i=0; CH375_WR_CMD_PORT(CMD_DISK_READ); //發(fā)送命令 CH375_WR_DAT_PORT(total_sector[15]); //按照最小地址首先發(fā)送原則發(fā)送 CH375_WR_DAT_PORT(total_sector[14]); CH375_WR_DAT_PORT(total_sector[13]); CH375_WR_DAT_PORT(total_sector[12]); CH375_WR_DAT_PORT(0X01); //默認(rèn)讀取1個扇區(qū) // mBufferPoint = DATA_BUFFER; /* 指向緩沖區(qū)起始地址 */ for ( mBlockCount = BlockPerSector; mBlockCount != 0; mBlockCount -- ) { /* 數(shù)據(jù)塊計數(shù) */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存儲器讀數(shù)據(jù)塊,請求數(shù)據(jù)讀出 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ mLength = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長度 */ while ( mLength ) { /* 根據(jù)長度讀取數(shù)據(jù) */ //*mBufferPoint = CH375_RD_DAT_PORT( ); /* 讀出數(shù)據(jù)并保存 */ //mBufferPoint ++; f[i]=CH375_RD_DAT_PORT( ); i=i+1; mLength --; } CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲器的讀操作 */ } else break; /* 返回錯誤狀態(tài) */ } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( mIntStatus ); /* 操作失敗 */ }
接著貼一下初始化代碼,基本上都是從例程里抄來的
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存儲器 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出現(xiàn)錯誤 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出錯重試 */ mDelaymS( 200 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ } if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出現(xiàn)錯誤 */
/* 可以由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ù)的長度 */ if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 異常 */ for ( i = 0; i != 8; i ++ ) { /* 根據(jù)長度讀取數(shù)據(jù) */ DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); /* 讀出數(shù)據(jù)并保存 */ } i = DATA_BUFFER[ 6 ]; /* U盤容量數(shù)據(jù)中的每扇區(qū)字節(jié)數(shù),大端格式 */ if ( i == 0x04 ) BlockPerSector = 1024/CH375_BLOCK_SIZE; /* 磁盤的物理扇區(qū)是1K字節(jié) */ else if ( i == 0x08 ) BlockPerSector = 2048/CH375_BLOCK_SIZE; /* 磁盤的物理扇區(qū)是2K字節(jié) */ else if ( i == 0x10 ) BlockPerSector = 4096/CH375_BLOCK_SIZE; /* 磁盤的物理扇區(qū)是4K字節(jié) */ else BlockPerSector = 512/CH375_BLOCK_SIZE; /* 默認(rèn)的磁盤的物理扇區(qū)是512字節(jié) */ BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盤的扇區(qū)大小 */ CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); /* 設(shè)置USB存儲器的每扇區(qū)數(shù)據(jù)包總數(shù) */ CH375_WR_DAT_PORT( 0x39 ); CH375_WR_DAT_PORT( BlockPerSector ); /* 設(shè)置每扇區(qū)數(shù)據(jù)包總數(shù) */ return( 0 ); /* U盤已經(jīng)成功初始化 */ }
請各位大俠幫著看看,謝謝了!?。? 我這個程序,在我這里讀只能達到5KB/S
單片機主頻和GPIO的速度是多少? 影響速度的是3個接口函數(shù):CH375_WR_CMD_PORT、CH375_WR_DAT_PORT、CH375_RD_DAT_PORT,貼出來看看
我單片機的主頻是50M,GPIO的速度實話講不太清楚,由于使用的是固件庫,庫中也沒有說明 //寫入命令函數(shù) void CH375_WR_CMD_PORT(unsigned char cmd) { GPIOPinTypeGPIOOutput(ch375_cmd,0xff); //設(shè)置PGE為輸出,并且輸出高電平
GPIOPinWrite(ch375_cmd,CH375_A0,0xff); //設(shè)置CH375為輸入命令狀態(tài) GPIOPinTypeGPIOOutput(ch375_data,0xff); //設(shè)置PGA為輸出 GPIOPinWrite(ch375_data,0xff,cmd); //輸出命令
GPIOPinWrite(ch375_cmd,CH375_WR,0x00); //設(shè)置CH375寫入命令
GPIOPinWrite(ch375_cmd,CH375_WR,0xff); // }
//寫入數(shù)據(jù)函數(shù) void CH375_WR_DAT_PORT(unsigned char data) { GPIOPinTypeGPIOOutput(ch375_cmd,0xff); //設(shè)置PGE為輸出,并且輸出高電平
GPIOPinWrite(ch375_cmd,CH375_A0,0x00); //設(shè)置CH375為輸入數(shù)據(jù)狀態(tài) GPIOPinTypeGPIOOutput(ch375_data,0xff); //設(shè)置PGA為輸出 GPIOPinWrite(ch375_data,0xff,data); //輸出數(shù)據(jù)
GPIOPinWrite(ch375_cmd,CH375_WR,0x00); //設(shè)置CH375寫數(shù)據(jù)
GPIOPinWrite(ch375_cmd,CH375_WR,0xff); // }
//讀出數(shù)據(jù)函數(shù) unsigned char CH375_RD_DAT_PORT() { unsigned char a; GPIOPinTypeGPIOOutput(ch375_cmd,0xff); //設(shè)置PGE為輸出,并且輸出高電平
GPIOPinTypeGPIOOutput(ch375_cmd,CH375_A0); //設(shè)置A0管教為輸出 GPIOPinWrite(ch375_cmd,CH375_A0,0x00); //設(shè)置CH375為讀出數(shù)據(jù)狀態(tài) GPIOPinTypeGPIOInput(ch375_data,0xff); //設(shè)置PGA為輸出 GPIOPinTypeGPIOOutput(ch375_cmd,CH375_RD); //設(shè)置WR管教為輸出 GPIOPinWrite(ch375_cmd,CH375_RD,0x00); //設(shè)置CH375寫入命令
a=GPIOPinRead(ch375_data,0xff); //讀出數(shù)據(jù) GPIOPinWrite(ch375_cmd,CH375_RD,0xff); // return(a); }
優(yōu)化這三個函數(shù)吧,速度太慢了.你可以自己測試一下,循環(huán)寫數(shù)據(jù),用示波器看看寫一個字節(jié)需要多上時間,就可以計算出實際的速度了.
我通過提高主控頻率,現(xiàn)在能夠達到41KB/S,但是下一步提高,我也不知道該怎么辦了,希望大家給個提示
對I/O的操作,直接操作相關(guān)寄存器,不調(diào)用函數(shù),速度會提升一些