關(guān)于 CH374

我用374讀寫(xiě)U盤(pán) CH374LibInit( );成功執(zhí)行后,多次調(diào)用CH374DiskConnect(),返回值交替為ERR_SUCCESS和ERR_DISK_DISCON。但是同此時(shí)讀取374寄存器發(fā)現(xiàn)寄存器內(nèi)值是一樣的: C9 40 80 F3 00 A0 C0 00 00 D0 00(從04-0E號(hào)寄存器)

寄存器REG_INTER_FLAG的值一直保持A0--1 0 1 0 0 0 0 0 位 7 6 5 4 3 2 1 0 位5 BIT_IF_DEV_ATTACH(USB 設(shè)備的當(dāng)前連接狀態(tài)) 0=尚未連接/斷開(kāi)/拔出;1=已經(jīng)連接/插入 綜上,寄存器可知U盤(pán)一直連接的,但是函數(shù)CH374DiskConnect返回值卻不同,這是為什么?? 麻煩解釋下,不勝感激

寄存器能知道U盤(pán)連接,函數(shù)CH374DiskConnect()應(yīng)該是返回成功的.

你是用中斷方式還是用查詢方式檢測(cè)U盤(pán)連接的 要是中斷方式你給定義中斷引腳去掉,采用查詢寄存器方式試下可不可以.


還有就是你的庫(kù)可能沒(méi)鏈接進(jìn)去


如果庫(kù)沒(méi)有鏈接進(jìn)去,我的CH374DiskConnect(),及CH374DiskReady()怎么還能使用并會(huì)返回值呢?


是用例子程序還是自己寫(xiě)的程序,CH374DiskConnect()函數(shù)是自己寫(xiě)的嗎?可加了延時(shí)?U盤(pán)插上時(shí),有時(shí)會(huì)產(chǎn)生抖動(dòng),要加延時(shí)


可以不可以將程序帖出來(lái)看下??????


#include #include #include

/* 以下定義的詳細(xì)說(shuō)明請(qǐng)看CH374HF6.H文件 */ #define LIB_CFG_INT_EN 0 /* CH374的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */

#define CH374_IDX_PORT_ADDR 0xDFFF /* CH374索引端口的I/O地址 */ #define CH374_DAT_PORT_ADDR 0x9FFF /* CH374數(shù)據(jù)端口的I/O地址 */ /* 62256提供的32KB的RAM分為兩部分: 0000H-01FFH為磁盤(pán)讀寫(xiě)緩沖區(qū), 0200H-7FFFH為文件數(shù)據(jù)緩沖區(qū) */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤(pán)數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開(kāi)始的緩沖區(qū)長(zhǎng)度為SECTOR_SIZE */

#define CH374_INT_WIRE INT0 /* P3.2, INT0, CH374的中斷線INT#引腳,連接CH374的INT#引腳,用于查詢中斷狀態(tài) */ /* 如果未連接CH374的中斷引腳,那么應(yīng)該去掉上述定義,自動(dòng)使用寄存器查詢方式 */

#define DISK_BASE_BUF_LEN 2048 /* 默認(rèn)的磁盤(pán)數(shù)據(jù)緩沖區(qū)大小為512字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤(pán),為0則禁止在.H文件中定義緩沖區(qū)并由應(yīng)用程序在pDISK_BASE_BUF中指定 */ /* 如果需要復(fù)用磁盤(pán)數(shù)據(jù)緩沖區(qū)以節(jié)約RAM,那么可將DISK_BASE_BUF_LEN定義為0以禁止在.H文件中定義緩沖區(qū),而由應(yīng)用程序在調(diào)用CH375Init之前將與其它程序合用的緩沖區(qū)起始地址置入pDISK_BASE_BUF變量 */

#define NO_DEFAULT_CH374_F_ENUM 1 /* 未調(diào)用CH374FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH374_F_QUERY 1 /* 未調(diào)用CH374FileQuery程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH374_RESET 1 /* 未調(diào)用CH374Reset程序故禁止以節(jié)約代碼 */

#include "CH374HF6.H"

unsigned char R_buffer[2]; //用戶指令緩存區(qū)1,大小暫時(shí)定為8 unsigned char R_count; //按字節(jié)輸入指令時(shí)作計(jì)數(shù)器用 UINT8X my_buffer[ 0x7000 ]; /* 外部RAM的文件數(shù)據(jù)緩沖區(qū) */ unsigned char FLAG; /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫(xiě),那么可以在參數(shù)中指定緩沖區(qū)起址 */

void mDelaymS( unsigned char delay ) { unsigned char i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ } }

void send_char(unsigned char send_pcdata) {

ES=0; //暫時(shí)關(guān)中斷 SBUF=send_pcdata; while(1) { if(TI==1) //等待輸出緩沖區(qū)為空;發(fā)送完一幀后單片機(jī)置TI=1 break; } TI=0; //申請(qǐng)輸出緩沖區(qū) ES=1; //開(kāi)中斷,串口傳輸 }

void send_string(unsigned char code *send_pcdata)//關(guān)鍵字code起了很大的作用,而沒(méi)有使用code定義的*string,說(shuō)明指針是一般類(lèi)型,可以指向代碼空間,內(nèi)部ram 空間或外部ram空間。 //使用code定義的說(shuō)明僅指向代碼空間 { while(*send_pcdata!=0) { send_char(*send_pcdata); send_pcdata++; } }

/* 檢查操作狀態(tài),如果錯(cuò)誤則顯示錯(cuò)誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ send_string( "Error: ");send_char((UINT16)iError+48); send_string("\n"); /* 顯示錯(cuò)誤 */ /* 遇到錯(cuò)誤后,應(yīng)該分析錯(cuò)誤碼以及CH374DiskStatus狀態(tài),例如調(diào)用CH374DiskConnect查詢當(dāng)前U盤(pán)是否連接,如果U盤(pán)已斷開(kāi)那么就重新等待U盤(pán)插上再操作, 建議出錯(cuò)后的處理步驟: 1、調(diào)用一次CH374DiskReady,成功則繼續(xù)操作,例如Open,Read/Write等,在CH374DiskReady中會(huì)自動(dòng)調(diào)用CH374DiskConnect,不必另外調(diào)用 2、如果CH374DiskReady不成功,那么強(qiáng)行將CH374DiskStatus置為DISK_CONNECT狀態(tài),然后從頭開(kāi)始操作(等待U盤(pán)連接CH374DiskConnect,CH374DiskReady等) */ while ( 1 ) { send_string("error\n"); mDelaymS( 100 ); mDelaymS( 100 ); } }

void uart(void) interrupt 4 using 3//串行口中斷 { if(RI==1) //pc通過(guò)串口發(fā)送過(guò)來(lái)數(shù)據(jù) // 輸入緩沖區(qū)可以使用 { RI = 0; //申請(qǐng)輸入緩沖區(qū) R_buffer[R_count]=SBUF;//讀入一個(gè)字節(jié)用戶指令 R_count++; //下一個(gè)字節(jié)用戶指令 if(R_buffer[0]!= 0xff) //不以"ff"開(kāi)頭即為無(wú)效指令,若發(fā)生,重新讀取 { R_count=0; } if((R_count==2)&&(R_buffer[0]==0xff)) //讀滿四個(gè)有效字節(jié),完成一次指令讀取,釋放輸入緩沖,置讀有效標(biāo)志位 { R_count=0; FLAG=1; } } else//TI=1;單片機(jī)請(qǐng)求發(fā)送 { TI = 0; //沒(méi)讀完時(shí)申請(qǐng)輸出緩沖區(qū)發(fā)送 } }

/* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 244; /* 22.1184MHz晶振, 9600bps */ TR1 = 1; TI = 1; EA=1; }

void initram()//初始化外部ram0x0000--0x7000 { int i,j,k,l; for(i=0;i<7;i++) { for(j=0;j<15;j++) { for(k=0;k<15;k++) { for(l=0;l<15;l++) my_buffer[l+16*k+j*16*16+i*16*16*16]=l%2; } } } }

void read_RE() { UINT8 mAddr,i,j; i=0; for(mAddr=0x04;mAddr<0x0F;mAddr++) { send_char(0xFF); send_char(mAddr); j=CH374_READ_REGISTER( mAddr ); send_char(j); } }

main( ) { UINT8 i,j, SecCount=10,UnknownUsbDevice=0; UINT16 NewSize;// count; /* 因?yàn)檠菔景宓腞AM容量只有32KB,所以NewSize限制為16位,實(shí)際上如果文件大于32256字節(jié),應(yīng)該分幾次讀寫(xiě)并且將NewSize改為UINT32以便累計(jì) */ // UINT8 code *pCodeStr; FLAG=0; R_count=0;

for(i=0;i<2;i++) R_buffer[i]=0; mDelaymS( 100 ); /* 延時(shí)100毫秒 */ initram();

mInitSTDIO(); /* 為了讓計(jì)算機(jī)通過(guò)串口監(jiān)控演示過(guò)程 */ send_char( 0x00 );send_char( 0x00 );send_char(0x0A); #if DISK_BASE_BUF_LEN == 0 pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定義CH374的專用緩沖區(qū),而是用緩沖區(qū)指針指向其它應(yīng)用程序的緩沖區(qū)便于合用以節(jié)約RAM */ #endif i = CH374LibInit( ); /* 初始化CH374程序庫(kù)和CH374芯片,操作成功返回0 */ send_char(0x00); mStopIfError( i ); mDelaymS( 50 );

CH374Init( ); mDelaymS( 200 ); while ( 1 ) { while ( CH374DiskStatus < DISK_CONNECT ) { /* 查詢CH374中斷并更新中斷狀態(tài),等待U盤(pán)插入 */ i=CH374DiskConnect( ); /* 查詢U 盤(pán)是否連接,返回ERR_SUCCESS 則說(shuō)明當(dāng)前已連接 */ mDelaymS(100 ); /* 沒(méi)必要頻繁查詢 */ } send_char(0xAA);send_char(0xAA); for ( i = 0; i < 100; i ++ ) { /* 最長(zhǎng)等待時(shí)間,100*50mS */ mDelaymS(100 ); j=CH374DiskReady( ); send_char(0xBB); send_char(j); send_char(0xaa); if ( j == ERR_SUCCESS ) break; /* 查詢磁盤(pán)是否準(zhǔn)備好 */ if ( CH374DiskStatus < DISK_CONNECT ) break; /* 檢測(cè)到斷開(kāi),重新檢測(cè)并計(jì)時(shí) */ if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盤(pán)總是返回未準(zhǔn)備好,不過(guò)可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */ } send_char(0xaa); send_char(CH374DiskStatus); send_char(0xaa); #ifdef EN_DISK_WRITE /* 子程序庫(kù)支持寫(xiě)操作 */ /* 產(chǎn)生新文件 */ send_string( "Create\n" ); strcpy( mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ i = CH374FileCreate( ); /* 新建文件并打開(kāi),如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); send_string( "Write\n" ); mCmdParam.WriteX.mSectorCount = 1; /* 寫(xiě)入所有扇區(qū)的數(shù)據(jù) */ mCmdParam.WriteX.mDataBuffer = &my_buffer[0]; /* 指向文件數(shù)據(jù)緩沖區(qū)的起始地址 */ i = CH374FileWriteX( ); /* 向文件寫(xiě)入數(shù)據(jù) */ mStopIfError( i ); /* 默認(rèn)情況下,如果扇區(qū)數(shù)mCmdParam.WriteX.mSectorCount不為0那么CH374FileWriteX只負(fù)責(zé)寫(xiě)入數(shù)據(jù)而不修改文件長(zhǎng)度, 如果長(zhǎng)時(shí)間不寫(xiě)入數(shù)據(jù)則應(yīng)該更新文件長(zhǎng)度,防止突然斷電后前面寫(xiě)入的數(shù)據(jù)與文件長(zhǎng)度不相符, 如果需要寫(xiě)完數(shù)據(jù)后立即修改/更新文件長(zhǎng)度,那么可以置扇區(qū)數(shù)mCmdParam.WriteX.mSectorCount為0后調(diào)用CH374FileWriteX強(qiáng)行更新文件長(zhǎng)度, 如果確定不會(huì)突然斷電或者后面很快有數(shù)據(jù)不斷寫(xiě)入則不必更新文件長(zhǎng)度,可以提高速度并減少U盤(pán)損耗(U盤(pán)內(nèi)部的內(nèi)存壽命有限,不宜頻繁改寫(xiě)) */ send_string( "Close\n" ); mCmdParam.Close.mUpdateLen = 0; /* 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是CH374vSectorSize的倍數(shù) */ i = CH374FileClose( ); mStopIfError( i ); #endif

while(1) if(FLAG==1) { send_char(0x11); read_RE(); FLAG=0; break; }

} }


我是用查詢方式檢測(cè)U盤(pán)是否連接的


for(i=0;i<2;i++) R_buffer=0; 應(yīng)改為:for(i=0;i<2;i++) R_buffer=0; 軟件沒(méi)問(wèn)題,可以操作的,你查下你的硬件,索引端口,數(shù)據(jù)端口地址是否正確?U盤(pán)插上時(shí)UD+,UD-的電壓是多少?


應(yīng)改為:for(i=0;i<2;i++) R_buffer[i]=0;


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频