由于調(diào)用 U 盤(pán)讀寫(xiě)文件級(jí)子程序庫(kù)函數(shù)CH375FileOpen( )和CH375FileCreate( )失敗,于是嘗試直接進(jìn)行物理扇區(qū)讀寫(xiě)操作,其間遇到以下問(wèn)題,還請(qǐng)高人指點(diǎn): 1、使用愛(ài)國(guó)者“迷你王”64M 優(yōu)盤(pán):無(wú)法執(zhí)行 mReadSector( 0,1 ) 子程序;可以完成 mWriteSector( 600,1 ) 子程序,但用 WinHex 查看發(fā)現(xiàn),實(shí)際并沒(méi)有將數(shù)據(jù)寫(xiě)進(jìn)指定扇區(qū)。還有一款金星牌 MP3 128M 情況也是一樣。 使用 Kingston 512M 優(yōu)盤(pán):可以完成 mReadSector( 0,1 )和 mWriteSector( 600,1 ) 子程序,但是返回值都為錯(cuò)誤代碼 0x1f (USB_INT_DISK_ERR 或者 ERR_USB_DISK_ERR)。 使用“超速王”128M:執(zhí)行 mReadSector( 0,1 )和 mWriteSector( 600,1 ) 子程序,全部卡在其過(guò)程中的 mIntStatus = mWaitInterrupt( ) 命令行。 請(qǐng)問(wèn)這是什么原因造成的?應(yīng)該如何解決? 2、我在使用的頭文件 CH375HFQ.H 中看到有 CH375ReadBlock(void)和CH375WriteBlock(void) 的函數(shù)聲明,請(qǐng)問(wèn)這兩個(gè)子程序是否也是用作物理扇區(qū)讀寫(xiě)的?如果是,應(yīng)該如何使用? 3、請(qǐng)問(wèn)子程序 mReadCH375Data( unsigned char *buf )和 mWriteCH375Data( unsigned char *buf ,unsigned char len )與 mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )和 mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )函數(shù)之間,是否有何聯(lián)系和區(qū)別?
1、如果前面庫(kù)的初始化、檢測(cè)U盤(pán)連接、CH375DiskReady( )能正常通過(guò),而CH375FileOpen( )和CH375FileCreate( )失敗的話,你可以檢查一下磁盤(pán)緩沖區(qū)是否存在問(wèn)題,以及模擬并口的三個(gè)讀寫(xiě)子程序會(huì)不會(huì)速度太慢。 如果采用直接操作物理扇區(qū)的里子的話,由于U盤(pán)初始化沒(méi)有庫(kù)做的那么完善,U盤(pán)支持率沒(méi)有使用庫(kù)的高。
2、CH375ReadBlock(void)和CH375WriteBlock(void) 可以用來(lái)操作物理扇區(qū)的讀寫(xiě),但相應(yīng)頭文件部分得添加?xùn)|西,你可以發(fā)封郵件到技術(shù)信箱,再給你回過(guò)去。 3、mReadCH375Data和mWriteCH375Data為讀取375端點(diǎn)緩沖區(qū)的數(shù)據(jù)、將數(shù)據(jù)寫(xiě)入375緩沖區(qū);而mReadSector或mWriteSector則是將數(shù)據(jù)從U盤(pán)對(duì)應(yīng)的物理扇區(qū)讀出或?qū)懭搿?/p>
謝謝luoye268268的細(xì)心指導(dǎo)!非常感激! 我使用物理扇區(qū)讀寫(xiě),只是想確認(rèn)一下 CH375 與 U 盤(pán)之間是否能夠正常通訊!因?yàn)槲衣?tīng)說(shuō),有些 U 盤(pán)雖然能夠被識(shí)別和初始化,但是不一定能夠正常讀寫(xiě),所以做此測(cè)試. 另外,我想進(jìn)一步了解一下,您所說(shuō)的"模擬并口的三個(gè)讀寫(xiě)子程序速度太慢",是說(shuō)會(huì)影響 U 盤(pán)的讀寫(xiě)速度,還是說(shuō)會(huì)導(dǎo)致無(wú)法正常運(yùn)行程序,或?qū)е鲁绦蚍祷劐e(cuò)誤代碼? 以下是我編寫(xiě)的"模擬并口的三個(gè)讀寫(xiě)子程序",還請(qǐng)您受累幫忙看一下,是否有不妥之處?謝謝! void xWriteCH375Cmd( UINT8 mCmd ) // 外部定義的被CH375程序庫(kù)調(diào)用的子程序,向CH375寫(xiě)命令 { DDRA=0xFF; //單片機(jī) I/O 口 A 口寄存器 DDRA;指定數(shù)據(jù)傳輸方向?yàn)檩敵?付值0xFF A0=1; PORTA=mCmd; WR=0; CS_HOST=0; xDelay100uS( ); // 延時(shí),CH375要求讀寫(xiě)脈沖寬度大于100nS CS_HOST=1; WR=1; A0=0; mDelay1uS( ); mDelay1uS( ); // 至少延時(shí)2uS }
void xWriteCH375Data( UINT8 mData ) // 外部定義的被CH375程序庫(kù)調(diào)用的子程序,向CH375寫(xiě)數(shù)據(jù) { A0=0; DDRA=0xFF; // 指定單片機(jī) I/O 口 A 口數(shù)據(jù)傳輸方向?yàn)檩敵? PORTA=mData; WR=0; CS_HOST=0; xDelay100uS( ); // 延時(shí),CH375要求讀寫(xiě)脈沖寬度大于100nS CS_HOST=1; WR=1; A0=1; mDelay1uS( ); mDelay1uS( ); // 至少延時(shí)1.5uS }
UINT8 xReadCH375Data(void) // 外部定義的被CH375程序庫(kù)調(diào)用的子程序,從CH375讀數(shù)據(jù),最小周期為1.5uS, 否則之前延時(shí)1.5uS { UINT8 mData; mDelay1uS( );mDelay1uS( ); // 至少延時(shí)1.5uS DDRA=0x00; // 指定單片機(jī) I/O 口 A 口數(shù)據(jù)傳輸方向?yàn)檩斎? PORTA=0x00; A0=0; RD=0; CS_HOST=0; mData=PORTA; xDelay100uS( ); // 延時(shí) CS_HOST=1; RD=1; A0=1; return (mData); }
void xWriteCH375Cmd( UINT8 mCmd ) // 外部定義的被CH375程序庫(kù)調(diào)用的子程序,向CH375寫(xiě)命令 { DDRA=0xFF; //單片機(jī) I/O 口 A 口寄存器 DDRA;指定數(shù)據(jù)傳輸方向?yàn)檩敵?付值0xFF A0=1; PORTA=mCmd; CS_HOST=0; WR=0; WR=0; //xDelay100uS( ); // 延時(shí),CH375要求讀寫(xiě)脈沖寬度大于100nS
WR=1; CS_HOST=1; A0=0; mDelay1uS( ); mDelay1uS( ); // 至少延時(shí)2uS } void xWriteCH375Data( UINT8 mData ) // 外部定義的被CH375程序庫(kù)調(diào)用的子程序,向CH375寫(xiě)數(shù)據(jù) { A0=0; DDRA=0xFF; // 指定單片機(jī) I/O 口 A 口數(shù)據(jù)傳輸方向?yàn)檩敵? PORTA=mData; CS_HOST=0; WR=0; WR=0; WR=1; //xDelay100uS( ); // 延時(shí),CH375要求讀寫(xiě)脈沖寬度大于100nS CS_HOST=1; // WR=1; mDelay1uS( ); mDelay1uS( ); // 至少延時(shí)1.5uS }
UINT8 xReadCH375Data(void) // 外部定義的被CH375程序庫(kù)調(diào)用的子程序,從CH375讀數(shù)據(jù),最小周期為1.5uS, 否則之前延時(shí)1.5uS { UINT8 mData; mDelay1uS( );mDelay1uS( ); // 至少延時(shí)1.5uS DDRA=0x00; // 指定單片機(jī) I/O 口 A 口數(shù)據(jù)傳輸方向?yàn)檩斎? PORTA=0x00; A0=0; CS_HOST=0; RD=0; RD=0; mData=PORTA; // xDelay100uS( ); // 延時(shí) RD=1; CS_HOST=1; return (mData); }
不知道你的延時(shí)是否準(zhǔn)確 如果準(zhǔn)確 xDelay100uS( ); 執(zhí)行時(shí)間太長(zhǎng)