關(guān)于CH375A接收數(shù)據(jù)問題

各位高手大家好:

本人剛剛接觸CH375A,按網(wǎng)上的程序,現(xiàn)在枚舉是好使的,并且用USB測(cè)試工具往單片機(jī)送數(shù)據(jù)時(shí),單片機(jī)也能接收到正確的中斷,但是,此后接收數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)時(shí)就總是:數(shù)據(jù)為兩個(gè)2,長(zhǎng)度也為2了,不知道為什么,請(qǐng)指教,還有就是如果只是測(cè)試簡(jiǎn)單的USB通訊,你們都用什么測(cè)試軟件呢?謝謝!!

用CH372DBG.EXE來調(diào)試,到我們網(wǎng)站在線下載里去下載.然后在測(cè)試一下看看結(jié)果.


應(yīng)該還是你程序上的問題 上位機(jī)軟件:CH372DBG.ZIP 下位機(jī)軟件:CH372EVTZ.IP,參考\CH372EVT\PUB\XFIRM 另,\CH372EVT\PUB\這個(gè)目錄下其他例程的上下位機(jī)是配對(duì)的


我用從貴公司網(wǎng)站上下載的C程序和調(diào)試程序試驗(yàn)了一下,結(jié)果和我的程序是一樣的,進(jìn)入中斷后,從USB口讀出的仍然都是2,我的程序是用模擬并口的方式做的,電路中RD腳接單片機(jī)的RD腳,WR腳接單片機(jī)的WR腳,CS腳接P27,A0腳接P26,INT腳接P32,D+,D-直接接USB接口的D+,D-,板上的電源用USB口過來的+5V電源,V3用了濾波電容后接地,TXD,RXD直接接地了,請(qǐng)問這么接可以嗎?謝謝??!


把下位機(jī)程序貼出來看看.


這個(gè)程序是我在USBEX.C的基礎(chǔ)上改的,請(qǐng)只看管腳定義和發(fā)送命令,讀寫命令就可以,太感謝了!

#pragma NOAREGS #include #include "CH375INC.H"

sbit CH375_A0=P2^6; sbit CH375_CS=P2^7; sbit CH375_WR=P3^6; sbit CH375_RD=P3^7;

typedef union _REQUEST_PACK{ unsigned char buffer[8]; struct{ unsigned char bmReuestType; //標(biāo)準(zhǔn)請(qǐng)求字 unsigned char bRequest; //請(qǐng)求代碼 unsigned int wValue; //特性選擇高 unsigned int wIndx; //索引 unsigned int wLength; //數(shù)據(jù)長(zhǎng)度 }r; } mREQUEST_PACKET, *mpREQUEST_PACKET;

//設(shè)備描述符 unsigned char code DevDes[]={ 0x12 //描述符大小 , 0x01 //常數(shù)DEVICE , 0x10 //USB規(guī)范版本信息 , 0x01 , 0xFF //類別碼, , 0x80 //子類別碼 , 0x37 //協(xié)議碼 , 0x08 //端點(diǎn)0的最大信息包大小 , 0x48 //廠商ID , 0x43 , 0x37 //產(chǎn)品ID , 0x55 , 0x00 //設(shè)備版本信息 , 0x01 , 0x00 //索引值 , 0x00 , 0x00 , 0x01 //可能配置的數(shù)目 , 00 //無意義 , 00 , 00 , 00 , 00 , 00 }; //配置描述符 unsigned char code ConDes[]={ //配置描述符 0x09 //描述符大小 , 0x02 //常數(shù)CONFIG , 0x27 //此配置傳回所有數(shù)據(jù)大小 , 0x00 // , 0x01 //接口數(shù) , 0x01 //配置值 , 0x00 //索引 , 0x80 //電源設(shè)置 , 0x40 //需要總線電源 //接口描述符 , 0x09 //描述符大小 , 0x04 //常數(shù)INTERFACE , 0x00 //識(shí)別碼 , 0x00 //代替數(shù)值 , 0x03 //支持的端點(diǎn)數(shù) , 0xFF //類別碼 , 0x80 //子類別碼 , 0x37 //協(xié)議碼 , 0x00 //索引 //端點(diǎn)描述符 , 0x07 //述符大小 , 0x05 //常數(shù)ENDPOINT , 0x82 //端點(diǎn)數(shù)目及方向 , 0x02 //支持的傳輸類型 , 0x40 //支持的最大信息包大小 , 0x00 , 0x00 // , 0x07 , 0x05 , 0x02 , 0x02 , 0x40 , 0x00 , 0x00 , 0x07 , 0x05 , 0x81 , 0x03 , 0x08 , 0x00 , 0x01

, 0x07 , 0x05 , 0x01 , 0x02 , 0x08 , 0x00 , 0x00 }; //配置描述符 unsigned char code LangDes[]={0x04,0x03,0x09,0x04}; //語言描述符 unsigned char code SerDes[]={0x12,0x03,'C',0,'H',0,'3',0,'7',0,'5',0,'U',0,'S',0,'B',0}; //字符串描述符

unsigned char mVarSetupRequest; // ;USB請(qǐng)求碼 unsigned char mVarSetupLength; // ;后續(xù)數(shù)據(jù)長(zhǎng)度 unsigned char code * VarSetupDescr; // ;描述符偏移地址

unsigned char VarUsbAddress ; //

bit CH375FLAGERR; //錯(cuò)誤清0 bit CH375CONFLAG; //配置標(biāo)志

unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */

mREQUEST_PACKET request; sbit CH375ACT = P1^4;

/* 延時(shí)2微秒,不精確 */ void Delay1us(){ ; }

void Delay2us( ) { unsigned char i; #define DELAY_START_VALUE 1 /* 根據(jù)單片機(jī)的時(shí)鐘選擇初值,20MHz以下為0,30MHz以上為2 */ for ( i=DELAY_START_VALUE; i!=0; i-- ); }

/* 延時(shí)50毫秒,不精確 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }

/* 將PC機(jī)的低字節(jié)在前的16位字?jǐn)?shù)據(jù)轉(zhuǎn)換為C51的高字節(jié)在前的數(shù)據(jù) */ //unsigned int BIG_ENDIAN( unsigned int value ) //{ // unsigned int in, out; // in = value; // ((unsigned char *)&out)[1] = ((unsigned char *)&in)[0]; // ((unsigned char *)&out)[0] = ((unsigned char *)&in)[1]; // return( out ); //}

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) */ delay2us(); ////CH375_CMD_PORT=cmd; /******************** 注釋中是用普通I/O引腳模擬8位并口的時(shí)序,CH375_CS引腳是可選的,可以一直接GND強(qiáng)制片選*/ /// CH375_D0_D7 = cmd; P0=cmd; CH375_A0 = 1; /// 選擇CH375的命令口 // CH375_D0_D7_DIR = output; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸出方向 CH375_RD = 1; //如果I/O默認(rèn)電平是高電平,那么這是可選操作 CH375_CS = 0; CH375_WR = 0; CH375_CS = 0; // 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; CH375_CS = 1; CH375_A0 = 0; P0=0xff;

// 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 ///******************** delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ /*CH375_DAT_PORT=dat; ******************** 注釋中是用普通I/O引腳模擬8位并口的時(shí)序*/ // CH375_D0_D7 = dat; ///// delay2us( ); P0=dat; // CH375_D0_D7_DIR = output; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸出方向 CH375_CS = 0; CH375_WR = 0; CH375_CS = 0; // 對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; CH375_CS = 1; // CH375_D0_D7_DIR = input; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 // CH375_D0_D7 = 0xFF; // 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 P0=0xff;

//******************** */ delay2us(); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ }

unsigned char CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ // delay1us(); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ /* ******************** 注釋中是用普通I/O引腳模擬8位并口的時(shí)序 // CH375_D0_D7_DIR = input; 對(duì)于標(biāo)準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置為輸入方向 */ unsigned char dat=0; //CH375_D0_D7 = 0xFF; // 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平,便于輸入 delay2us( ); P0=0xff; CH375_A0 = 0;//////////// CH375_CS = 0; //// P0=0xff;///////// CH375_RD = 0; CH375_CS = 0; //對(duì)于高速單片機(jī),該指令用于延時(shí),以便向CH375_RD產(chǎn)生寬度至少為80nS的低電平脈沖 ///unsigned char dat = CH375_D0_D7; /// delay2us( );///// dat=P0; CH375_RD = 1; CH375_CS = 1; //CH375_D0_D7 = 0xFF; // 對(duì)于準(zhǔn)雙向I/O,請(qǐng)?jiān)诖嗽O(shè)置輸出全高電平 //dat=CH375_D0_D7;

/// P0=0xff; return( dat );

}

void CH375_Init( ) { unsigned char i; /* 測(cè)試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測(cè)試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫入測(cè)試數(shù)據(jù) */ i = ~ 0x55; /* 返回?cái)?shù)據(jù)應(yīng)該是測(cè)試數(shù)據(jù)取反 */ if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); /* 延時(shí)50ms */ } /* 設(shè)置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) { //// IT0 = 0; break; } } /* if ( i==0 ) { CH372/CH375存在硬件錯(cuò)誤 }; */ /* 下述啟用中斷,假定CH375連接在INT0 */ IT0 = 0; /* 置外部信號(hào)為低電平觸發(fā) */ IE0 = 0; /* 清中斷標(biāo)志 */ EX0 = 1; /* 允許CH375中斷 */ }

//********************************************************* //端點(diǎn)0數(shù)據(jù)上傳 void mCh375Ep0Up(){ unsigned char i,len; if(mVarSetupLength){ //長(zhǎng)度不為0傳輸具體長(zhǎng)度的數(shù)據(jù) if(mVarSetupLength<=8){ len=mVarSetupLength; mVarSetupLength=0; } //長(zhǎng)度小于8則長(zhǎng)輸要求的長(zhǎng)度 else{ len=8; mVarSetupLength-=8; } //長(zhǎng)度大于8則傳輸8個(gè),切總長(zhǎng)度減8 CH375_WR_CMD_PORT(CMD_WR_USB_DATA3); //發(fā)出寫端點(diǎn)0的命令 CH375_WR_DAT_PORT(len); //寫入長(zhǎng)度 for(i=0;i!=len;i++) CH375_WR_DAT_PORT(request.buffer[i]); //循環(huán)寫入數(shù)據(jù) } else{ CH375_WR_CMD_PORT(CMD_WR_USB_DATA3); //發(fā)出寫端點(diǎn)0的命令 CH375_WR_DAT_PORT(0); //上傳0長(zhǎng)度數(shù)據(jù),這是一個(gè)狀態(tài)階段 } }

//*********************************************************

//復(fù)制描述符以便上傳 void mCh375DesUp(){ unsigned c


還有個(gè)問題,調(diào)試程序時(shí)還用加.lib文件嘛,我只是加了CH375INC.H


還有一個(gè)情況我忘說了,就是初始化USB時(shí),發(fā)送CHECK_EXIST命令,并不會(huì)返回取反的數(shù)據(jù),但是好象因?yàn)樗土斯ぷ髂J阶郑?)是對(duì)的,所以枚舉是成功的,并且此后讀出返回的狀態(tài)也是對(duì)的0x51。

不知道有沒有影響,是不是說明有什么問題,謝謝?。?/p>


程序?qū)戇@么復(fù)雜,你參考TEST.C就可以了,只需要修改兩個(gè)參數(shù) unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ 改為: unsigned char volatile xdata CH375_CMD_PORT _at_ 0x7BF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0x3CF0; /* CH375數(shù)據(jù)端口的I/O地址 */ 其他不要做任何修改就可以了. 用CH372DBG調(diào)試的時(shí)候,下發(fā)數(shù)據(jù)(長(zhǎng)度小于64個(gè))不要加空格,比如下發(fā)數(shù)據(jù)AA55,然后點(diǎn)擊上傳,將會(huì)收到55AA 另外你把測(cè)試結(jié)果詳細(xì)的說明以下


那你取到的數(shù)據(jù)是什么?要保證測(cè)試命令一定要正常通過,而且盡量測(cè)試兩次把每個(gè)IO都要測(cè)試,比如,發(fā)送CHECK_EXIST命令,發(fā)送0X55數(shù)據(jù),得到0XAA,發(fā)送CHECK_EXIST命令,在發(fā)0XAA數(shù)據(jù),得到0X55,這樣才說明你的讀寫子函數(shù)是正確的.


謝謝您的回復(fù),我想問一下:

1、我的硬件連接可以嗎?

2、您說的讓我把命令口與數(shù)據(jù)口改為那兩個(gè)地址是怎么得到的呢?其實(shí)例子中的地址我也不知道怎么得到的,我覺得命令口與數(shù)據(jù)口的地址就只差一個(gè)A0位,而不是差兩位呀?

非常感謝!


硬件連接沒有問題,ch375中斷引腳怎么接的? 設(shè)置模式的時(shí)候,如果設(shè)置模式成內(nèi)置固件模式(模式2),則不需要上面的描述符. 上面的兩個(gè)地址是采用總線方式操作ch375,只要區(qū)分A0位就可以了.


我的電路連接:(沒用什么74HC373)電路中RD腳接單片機(jī)的RD腳,WR腳接單片機(jī)的WR腳,CS腳接P27,A0腳接P26,INT腳接P32,D+,D-直接接USB接口的D+,D-,板上的電源用USB口過來的+5V電源,V3用了濾波電容后接地,TXD,RXD直接接地了,

CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測(cè)試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫入測(cè)試數(shù)據(jù) */ i = ~ 0x55; /* 返回?cái)?shù)據(jù)應(yīng)該是測(cè)試數(shù)據(jù)取反 */ if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT( 0 ); Delay50ms( ); /* 延時(shí)50ms */ } 上面語句結(jié)束后,讀出的數(shù)據(jù)為0XFF,

CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } 這里讀出的數(shù)據(jù)就是對(duì)的:CMD_RET_SUCCESS ,同樣的子程序, 我感覺還是硬件有問吧,請(qǐng)指教!!謝謝


補(bǔ)充一下: 因?yàn)槭诸^沒有0.47uf的電容,所以CH375的復(fù)位腳用的680P電容替代的,不知道行不行?我也試著把RST腳直接接到I/O口,用程序控制復(fù)位,但是還是不行!

我發(fā)現(xiàn)發(fā)送完EXIT命令后,數(shù)據(jù)為0x55有時(shí)會(huì)返回0x1F,我把RD,WR腳換成P2^5,P2^6腳時(shí),返回的數(shù)據(jù)與前面又有所不同,不知道為什么?請(qǐng)指教,謝謝了!


我上面所說的地址是按照你的硬件連接確定的: sbit CH375_A0=P2^6; sbit CH375_CS=P2^7; sbit CH375_WR=P3^6; sbit CH375_RD=P3^7;

如果你不把WR,RD接在總線上的WR,RD,那么肯定要用模擬IO方式.這樣做個(gè)測(cè)試,你循環(huán)的發(fā)送數(shù)據(jù),看一下各IO波形是否正常,比如循環(huán)發(fā)送數(shù)據(jù)0X55,WR,CS都為0的時(shí)候CH375采樣.


我用你定義的地址,其它都不改的話,枚舉是不成功的,但是我改成模擬并口后,枚舉是成功的,但始終EXIST命令的返回不對(duì),還有就是按我的程序,后續(xù)接收到的數(shù)據(jù)長(zhǎng)度和內(nèi)容都是2(不管我發(fā)送什么),并且發(fā)送一回后,不停進(jìn)入中斷。

請(qǐng)指教,謝謝


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

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