[求助,急]關(guān)于CH372的下傳,麻煩各位大俠指點(diǎn)

中斷服務(wù)程序如下所示,使用外部中斷1,選用內(nèi)置固件模式。程序接收PC發(fā)來(lái)的數(shù)據(jù),然后將數(shù)據(jù)長(zhǎng)度返回給PC。其中usbLength和usbBuffer[]為全局變量,已定義。 中斷服務(wù)程序如下: void mCH375Interrupt( void ) interrupt 2 using 1 //INT1對(duì)應(yīng)中斷號(hào)2 { unsigned char i; unsigned char IntStatus; CH372_WR_CMD_PORT( CMD_GET_STATUS ); //獲取中斷狀態(tài)并取消中斷請(qǐng)求 IntStatus = CH372_RD_DAT_PORT( ); //獲取中斷狀態(tài) IE1 = 0; //清INT1中斷標(biāo)志 if ( IntStatus == USB_INT_EP2_OUT ) //批量端點(diǎn)下傳成功,接收到命令包 { CH372_WR_CMD_PORT( CMD_RD_USB_DATA ); //從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) usbLength = CH372_RD_DAT_PORT( ); //首先讀取后續(xù)數(shù)據(jù)流的長(zhǎng)度 for(i=0;i usbBuffer[i] = CH372_RD_DAT_PORT( ); //接收命令包的數(shù)據(jù) CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 ); //向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 CH372_WR_DAT_PORT( 1 ); CH372_WR_DAT_PORT(usbLength);//返回usbBuffer的數(shù)據(jù)長(zhǎng)度 } else if ( IntStatus == USB_INT_EP2_IN ) //批量數(shù)據(jù)發(fā)送成功,狀態(tài)包已發(fā)送 { CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); } else return; //內(nèi)置固件的USB方式下不應(yīng)該出現(xiàn)其它中斷狀態(tài) } 當(dāng)下傳的數(shù)據(jù)的長(zhǎng)度大于等于64時(shí),顯示的數(shù)據(jù)長(zhǎng)度正確;當(dāng)下傳的數(shù)據(jù)長(zhǎng)度大于64時(shí),返回的數(shù)據(jù)長(zhǎng)度不正確,比如長(zhǎng)度為65到73時(shí),返回長(zhǎng)度是1;再往上時(shí),是除以64所得到余數(shù)

這點(diǎn)令我很是奇怪,是固件程序除了問(wèn)題,,還是別的什么問(wèn)題 上位機(jī)程序是組內(nèi)另一個(gè)同事編寫(xiě)的,參照提供的例子程序,各位大俠麻煩幫忙看看是什么問(wèn)題引起的?

你可以這樣,先不要用你同事寫(xiě)的上位機(jī)程序,你直接用我們的CH375DUG的上位機(jī)調(diào)試工具來(lái)調(diào)試你的數(shù)據(jù)是不是正確,如果正確的話,那就說(shuō)明你的下位機(jī)程序沒(méi)問(wèn)題,如果有問(wèn)題的話那就是下位機(jī)程序有問(wèn)題,象你這種情況在出現(xiàn)長(zhǎng)度大于64的時(shí)候,應(yīng)該出現(xiàn)2次中斷,先傳64字節(jié),接著在傳剩下的字節(jié)數(shù),還有就是你程序里面的CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 ); 之后你寫(xiě)了個(gè)命令是CH372_WR_DAT_PORT( 1 );什么意思??


之后的CH372_WR_DAT_PORT( 1 );命令是寫(xiě)入數(shù)據(jù)長(zhǎng)度,因?yàn)橹环祷貜纳衔粰C(jī)接收的數(shù)據(jù)長(zhǎng)度,故為1


這樣的話,你用我們的CH372DUG來(lái)調(diào)試看下是不是你要得到的數(shù)據(jù),我剛才用CH372DEBUG試了我自己改的程序,是沒(méi)有錯(cuò)的,你拿這段程序試下看可以不可以: #pragma NOAREGS #include #include #include "CH375INC.H" /* 頭文件,在網(wǎng)上下載的CH372或者CH375評(píng)估板資料中有 */

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地址 */

/* 延時(shí)2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根據(jù)單片機(jī)的時(shí)鐘選擇初值 */ }

/* 基本操作 */

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫(xiě)入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) */ delay2us(); CH375_CMD_PORT=cmd; delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫(xiě)入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ CH375_DAT_PORT=dat;

}

unsigned char CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */

return( CH375_DAT_PORT ); }

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

/* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 測(cè)試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測(cè)試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫(xiě)入測(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 ) break; } /* if ( i==0 ) { CH372/CH375存在硬件錯(cuò)誤 }; */ /* 下述啟用中斷,假定CH375連接在INT0 */ IT0 = 0; /* 置外部信號(hào)為低電平觸發(fā) */ IE0 = 0; /* 清中斷標(biāo)志 */ EX0 = 1; /* 允許CH375中斷 */ }

/* CH375中斷服務(wù)程序,使用寄存器組1 */ void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ /* 測(cè)試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( 1 ); /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }

main( ) { Delay50ms( ); /* 延時(shí)等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號(hào)則不必延時(shí) */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允許中斷 */ while ( 1 ); /* 以下指令開(kāi)始工作循環(huán),等待PC機(jī)命令進(jìn)行操作 */ }


hcn,我看你程序中用的是CH375_WR_CMD_PORT( 1 ); 應(yīng)該是寫(xiě)數(shù)據(jù)CH372_WR_DAT_PORT( 1 );吧,還是兩者都可以? 我試了下兩者出現(xiàn)的現(xiàn)象是一樣的,很奇怪


應(yīng)該是CH372_WR_DAT_PORT( 1 );,不好意思錯(cuò)拉,你試了還是這種問(wèn)題嗎?? 還有就是有時(shí)候在A0為1的時(shí)候也是可以傳送數(shù)據(jù)的,也就是說(shuō)你將你的A0始終為1的話也是可以操作的,但是這種情況不是很保險(xiǎn),所以我們建議用戶用A0=1來(lái)表示命令,A0=0表示數(shù)據(jù)


哦,這樣啊 明白,多謝 我試了多次還是同樣的情況,用你們的提供的上位機(jī)調(diào)試程序DEBUG372也是這樣的,很奇怪


不會(huì)?。∥矣昧薈H375DEBUG的調(diào)試工具,用我自己的程序試了,沒(méi)有問(wèn)題?。。≥斎氲臄?shù)據(jù)應(yīng)該是16進(jìn)制數(shù)據(jù)


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

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