我上位機(jī)用DEBUG372.EXE,端點(diǎn)1我上傳了幾個(gè)數(shù),端點(diǎn)2我也上傳了幾個(gè)具體的數(shù)是正常的。下傳端點(diǎn)2是DEBUG372.EXE顯示的發(fā)出的“數(shù)據(jù)個(gè)數(shù)”也是正常的。但是我想讓端點(diǎn)2下傳的數(shù)取反再上傳,DEBUG372.EXE顯示的個(gè)數(shù)和數(shù)據(jù)很多時(shí)候是不對(duì)的。您說(shuō)這是不是端點(diǎn)2下傳時(shí)出現(xiàn)問(wèn)題?該怎么解決呢?
如果延時(shí)不對(duì),會(huì)造成這種情況嗎?
上位機(jī)調(diào)試軟件是用的我們提供的DEBUG372.exe嗎? 下位機(jī)程序參考我們的TEST.C程序,順便把你的CH372的讀寫(xiě)子函數(shù)貼出來(lái)看看
是參考的TEST。C。中斷部分是這樣的,用的是11.0592的晶振。
/* CH375中斷服務(wù)程序INT3,使用寄存器組1 */ void mCh375Interrupt( ) interrupt 3using 1
{
unsigned char i; unsigned char InterruptStatus; unsigned char length; unsigned char xdata buffer[ 64 ]; Delay2us( ); CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ Delay2us( ); /* 如果時(shí)鐘頻率低于16MHz則無(wú)需該指令延時(shí) */ InterruptStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */
switch ( InterruptStatus ){ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ Delay2us( ); CH375_CMD_PORT = CMD_RD_USB_DATA; /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ Delay2us( ); /* 如果時(shí)鐘頻率低于16MHz則無(wú)需該指令延時(shí) */ length = CH375_DAT_PORT; /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ Delay2us( ); // Delay2us( ); for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_DAT_PORT; EX3 = 0; /* 測(cè)試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */ CH375_CMD_PORT= CMD_WR_USB_DATA7 ; /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ Delay2us( ); CH375_DAT_PORT =length; /* 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */ // Delay2us( ); for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] ;} /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測(cè)試數(shù)據(jù)是否正確 */ //CH375_DAT_PORT = 3; /* 發(fā)送中斷數(shù)據(jù)1 */ // CH375_DAT_PORT = 1; /* 發(fā)送中斷數(shù)據(jù)2 */ EX3 = 1; /* 允許中斷*/
EX3 = 0; CH375_CMD_PORT = CMD_WR_USB_DATA5; /* 向USB端點(diǎn)1的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ Delay2us( ); CH375_DAT_PORT =3 ; /* 后續(xù)數(shù)據(jù)長(zhǎng)度 */
CH375_DAT_PORT = 3; CH375_DAT_PORT = 3; /* 發(fā)送中斷數(shù)據(jù)1 */ CH375_DAT_PORT = 1; /* 發(fā)送中斷數(shù)據(jù)2 */ EX3 = 1; /* 允許中斷*/
break; }
case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB ; /* 釋放當(dāng)前USB緩沖區(qū) */ break; } case USB_INT_EP1_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB ; /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_CMD_PORT= CMD_UNLOCK_USB ; /* 釋放當(dāng)前USB緩沖區(qū) */ break; }
} } 我想想讓端點(diǎn)2下傳的數(shù)取反再上傳,結(jié)果數(shù)據(jù)個(gè)數(shù)一下子老多,數(shù)也好多時(shí)候不對(duì)。
發(fā)數(shù)據(jù)的時(shí)候不要加空格。比如發(fā)送0XAA,0X55數(shù)據(jù)的時(shí)候,直接寫(xiě)AA55,另外你怎么判斷你下傳的數(shù)據(jù)沒(méi)有問(wèn)題的?建議你先監(jiān)視一下下傳的數(shù)據(jù),然后在看看上傳的是什么數(shù)據(jù)。
沒(méi)有加空格,端點(diǎn)1和2如果用這個(gè)程序上傳具體數(shù)的時(shí)候應(yīng)用程序受到是正確的。但是我把端點(diǎn)2下傳的數(shù)據(jù)取反 CH375_DAT_PORT =length; /* 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */ // Delay2us( ); for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] } /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測(cè)試數(shù)據(jù)是否正確 */ 取反上傳到端點(diǎn)2,端點(diǎn)2上傳是錯(cuò)誤的。比如我端點(diǎn)2下傳1個(gè)數(shù)據(jù)11,端點(diǎn)2出來(lái)十幾個(gè)EE,有時(shí)是1個(gè)。有時(shí)數(shù)也不對(duì)。因?yàn)檫@個(gè)板子下傳時(shí)還不能通過(guò)顯示看數(shù)據(jù),只能先用調(diào)試工具了。
所以我覺(jué)得是不是端點(diǎn)2下傳時(shí)就有問(wèn)題?
您說(shuō)的監(jiān)視是用專(zhuān)門(mén)的監(jiān)視工具攔截?cái)?shù)據(jù)嗎?
用BUSHOUND軟件可以看到上下位機(jī)的通訊數(shù)據(jù),上位機(jī)軟件是你自己寫(xiě)的還是在網(wǎng)站上下載的。 /* CH375中斷服務(wù)程序INT3,使用寄存器組1 */ void mCh375Interrupt( ) interrupt 3 using 1
{
unsigned char i; unsigned char InterruptStatus; unsigned char length; unsigned char xdata buffer[ 64 ]; CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ Delay2us( ); /* 如果時(shí)鐘頻率低于16MHz則無(wú)需該指令延時(shí) */ InterruptStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */
switch ( InterruptStatus ){ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ Delay2us( ); CH375_CMD_PORT = CMD_RD_USB_DATA; /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ Delay2us( ); /* 如果時(shí)鐘頻率低于16MHz則無(wú)需該指令延時(shí) */ length = CH375_DAT_PORT; /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_DAT_PORT; CH375_CMD_PORT= CMD_WR_USB_DATA7 /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ Delay2us( ); CH375_DAT_PORT =length; /* 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */
for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] } /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測(cè)試數(shù)據(jù)是否正確 */
CH375_CMD_PORT = CMD_WR_USB_DATA5; /* 向USB端點(diǎn)1的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ Delay2us( ); CH375_DAT_PORT =3 /* 后續(xù)數(shù)據(jù)長(zhǎng)度 */ CH375_DAT_PORT = 3; CH375_DAT_PORT = 3; /* 發(fā)送中斷數(shù)據(jù)1 */ CH375_DAT_PORT = 1; /* 發(fā)送中斷數(shù)據(jù)2 */ break; }
case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 釋放當(dāng)前USB緩沖區(qū) */ break; } case USB_INT_EP1_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 釋放當(dāng)前USB緩沖區(qū) */ break; }
} }
是我參考TEST。C然后修改的。我加了個(gè)端點(diǎn)1上傳。然后延時(shí)什么的也沒(méi)有細(xì)考慮。BUSHOUND軟件從網(wǎng)站就能下是嗎?
我們網(wǎng)站沒(méi)有,到百度,GOOGLE....
剛理解錯(cuò)了,你說(shuō)的上位機(jī)程序,我理解成下位機(jī)了。上位機(jī)用的就是咱們的DEBUG372.EXE,從咱們網(wǎng)站上下載的。CH272DEBUG。Zip里的那個(gè)可以進(jìn)行端點(diǎn)2上下傳,端點(diǎn)1上傳的那個(gè)調(diào)試軟件。
下傳的數(shù)據(jù)可以通過(guò)串口發(fā)送出來(lái),接收倒數(shù)據(jù)后,從串口發(fā)送,這樣就可以監(jiān)視你接收的數(shù)據(jù)是否正確了。 如果接收的數(shù)據(jù)正確則不存在上傳的數(shù)據(jù)錯(cuò)誤的現(xiàn)象,另外程序簡(jiǎn)單寫(xiě),不要寫(xiě)這么復(fù)雜。 void mCh375Interrupt( ) interrupt 3 using 1
{
unsigned char i; unsigned char InterruptStatus; unsigned char length; unsigned char xdata buffer[ 64 ]; CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ Delay2us( ); /* 如果時(shí)鐘頻率低于16MHz則無(wú)需該指令延時(shí) */ InterruptStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */
switch ( InterruptStatus ){ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ Delay2us( ); CH375_CMD_PORT = CMD_RD_USB_DATA; /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ Delay2us( ); /* 如果時(shí)鐘頻率低于16MHz則無(wú)需該指令延時(shí) */ length = CH375_DAT_PORT; /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_DAT_PORT; CH375_CMD_PORT= CMD_WR_USB_DATA7 /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ Delay2us( ); CH375_DAT_PORT =length; /* 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */
for ( i = 0; i < length; i ++ ) { CH375_DAT_PORT= ~ buffer[ i ] } /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測(cè)試數(shù)據(jù)是否正確 */ break; }
case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 釋放當(dāng)前USB緩沖區(qū) */ break; } case USB_INT_EP1_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_CMD_PORT= CMD_UNLOCK_USB /* 釋放當(dāng)前USB緩沖區(qū) */ break; }
} } 另外你用的MCU的型號(hào)是什么?有多少XRAM?
串口發(fā)出去的話,串口給顯示程序嗎?可是顯示這部分這個(gè)板子用的比較復(fù)雜還沒(méi)法用呢。 MCU的型號(hào)是W77EL58,1KB片上外部數(shù)據(jù)存儲(chǔ)器。 剛用BUSHOUND軟件可以看到下發(fā)的數(shù)據(jù)比如發(fā)送11,就顯示11
是W77LE58,剛才寫(xiě)錯(cuò)了。
可是用調(diào)試工具感覺(jué)和DEBUG372.EXE效果一樣的。發(fā)的數(shù)據(jù)和收的數(shù)據(jù)顯示出來(lái)了。