求助CH372芯片的程序設(shè)計

首先,對于一個不會上位機程序的來說,如何調(diào)試單片機的上傳數(shù)據(jù)程序, 目前我要實現(xiàn)的方案是: 單片機接收到一段數(shù)據(jù)后,將此數(shù)據(jù)上傳給PC機,請問如何實現(xiàn)? 我下載并查閱了貴公司提供的相關(guān)例程,還是沒有解決這個問題,主要問題有 1、采用CH372DBG里面的DEBUG372調(diào)試時,點擊上傳時只有一組最多64字節(jié)數(shù)據(jù)上傳,而我需要完成的是1000甚至更多的數(shù)據(jù)上傳,不知該如何實現(xiàn)? 2、運行CH372EVT里的TEST程序,里面的內(nèi)容不太明了,沒有達到TEST的功能,能否配合圖片解釋一下具體的應(yīng)用說明,謝謝。

不會上位機,你只能簡單調(diào)試。我們提供的程序不可能完全符合客戶的需求。只做參考。 仔細(xì)看看說明書,和程序,有什么不明白的地方可以提問,但是要做圖片解釋,這個工作量也太大。為提高效率,你可以先參考程序不明白的地方發(fā)帖或電話詢問


根據(jù)提供的程序 調(diào)試后 DEBUG372 能夠?qū)崿F(xiàn)上傳和下傳。 我自己修改了下程序 /* CH375中斷服務(wù)程序,使用寄存器組1 */ void __attribute__((interrupt, auto_psv)) _INT1Interrupt(void) { unsigned char InterruptStatus; unsigned char i, length; unsigned char buffer[ 64 ]={0}; xWriteCH376Cmd( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus = xReadCH376Data( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ xWriteCH376Cmd( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = xReadCH376Data( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = xReadCH376Data( ); /* 接收數(shù)據(jù)包 */ /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 */ xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Data( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ FLAG_SEND_WAIT = 1; xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Data( 60 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }

void main() { unsigned char i; CH376DeviceInit( ); /* 初始化USB設(shè)備模式 */

mDelaymS(100); while(1);

} 這個程序能夠 點上傳能夠收到數(shù)據(jù),每次都可以收到60個數(shù)據(jù)。 而我進行修改后,將發(fā)送數(shù)據(jù)程序放到主程序后上傳不能收到數(shù)據(jù) 這是為什么? /* CH375中斷服務(wù)程序,使用寄存器組1 */ void __attribute__((interrupt, auto_psv)) _INT1Interrupt(void) { unsigned char InterruptStatus; unsigned char i, length; unsigned char buffer[ 64 ]={0}; xWriteCH376Cmd( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus = xReadCH376Data( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ xWriteCH376Cmd( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = xReadCH376Data( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = xReadCH376Data( ); /* 接收數(shù)據(jù)包 */ /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 */ xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Data( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ FLAG_SEND_WAIT = 1; break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }

void main() { unsigned char i; CH376DeviceInit( ); /* 初始化USB設(shè)備模式 */

mDelaymS(100); // while(1); while(1) { // mDelaymS(10); while(!FLAG_SEND_WAIT); FLAG_SEND_WAIT = 0; xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Data( 60 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */

}

}


FLAG_SEND_WAIT變量默認(rèn)的值是多少?第一次需要你先寫數(shù)據(jù)給CH376之后才會產(chǎn)生批量端點上傳的中斷,否則第一次是不會產(chǎn)生批量端點上傳的中斷的。


你對CH372產(chǎn)生中斷的原因還不了解 當(dāng)PC下發(fā)數(shù)據(jù)完畢后,CH372會產(chǎn)生中斷,通知MCU讀取數(shù)據(jù) 當(dāng)一包數(shù)據(jù)成功上傳給PC后,CH372會產(chǎn)生中斷。 你的程序要先下傳數(shù)據(jù),然后點擊上傳才會產(chǎn)生上傳中斷。


下位機流程這樣設(shè)計是否有問題? 1、CH372設(shè)備模式初始化完成; 2、xWriteCH376Cmd( CMD_WR_USB_DATA7 ),發(fā)送數(shù)據(jù); 3、等待CH372產(chǎn)生的上傳中斷后,再發(fā)送下一組數(shù)據(jù)。

FLAG_SEND_WAIT 默認(rèn)值為1;


這個流程忽略了一個問題:CH372在被枚舉成功之前,寫入的上傳數(shù)據(jù)是無效的,你的程序就存在這個問題 可以先下傳一包數(shù)據(jù),通知下位機已經(jīng)枚舉完成,這時才能上傳


“CH372在被枚舉成功之前,寫入的上傳數(shù)據(jù)是無效的,你的程序就存在這個問題 可以先下傳一包數(shù)據(jù),通知下位機已經(jīng)枚舉完成”

下位機如何知道已經(jīng)枚舉成功;很困惑,上面兩程序唯一的區(qū)別就在于發(fā)送程序一放于中斷內(nèi),和采用查詢方式在發(fā)送程序?qū)懺谥鞒绦蛑小? 以下是我根據(jù)SCM提的意見 重新修改的程序。

/* CH375中斷服務(wù)程序,使用寄存器組1 */ void __attribute__((interrupt, auto_psv)) _INT1Interrupt(void) { unsigned char InterruptStatus; unsigned char i, length; unsigned char buffer[ 64 ]={0}; xWriteCH376Cmd( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus = xReadCH376Data( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ xWriteCH376Cmd( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = xReadCH376Data( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = xReadCH376Data( ); /* 接收數(shù)據(jù)包 */ FLAG_SEND_WAIT = 1; /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 */ // xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ // xWriteCH376Data( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ // for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ FLAG_SEND_WAIT = 1; // xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ // xWriteCH376Data( 60 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ // for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */

break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ xWriteCH376Cmd( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } } }

void main() { unsigned char i; CH376DeviceInit( ); /* 初始化USB設(shè)備模式 */ FLAG_SEND_WAIT = 0; mDelaymS(100); // while(1); while(1) { // mDelaymS(10); while(!FLAG_SEND_WAIT); FLAG_SEND_WAIT = 0; xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Data( 60 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */

}

} 程序修改成這樣,流程應(yīng)該是對了吧?? 怎么還是收不到上傳數(shù)據(jù)


你首先需要下傳數(shù)據(jù)之后才能計算機才能接收到你發(fā)送的數(shù)據(jù)。按照程序來講的話應(yīng)該沒什么問題了。


收不到上傳數(shù)據(jù), 現(xiàn)象是單片機沒有收到 批量數(shù)據(jù)發(fā)送成功 的中斷;


先前說修改我們的例程是能夠下傳數(shù)據(jù)的,現(xiàn)在對比一下程序上作了哪些改動,這個解決了就能上傳數(shù)據(jù)了


void main() { unsigned char i; mDelaymS(100); CH376DeviceInit( ); /* 初始化USB設(shè)備模式 */ FLAG_SEND_WAIT = 0; mDelaymS(100); mDelaymS(100); mDelaymS(100); mDelaymS(100); mDelaymS(100); mDelaymS(100); mDelaymS(100); mDelaymS(100); mDelaymS(100); // while(1); while(1) { //while(!FLAG_SEND_WAIT);//程序不就死在這里了嗎???,沒機會寫數(shù)據(jù)了!?。。?! //FLAG_SEND_WAIT = 0;

xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Data( 60 ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < 60; i ++ ) xWriteCH376Data( i ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ while(FLAG_SEND_WAIT == 0); FLAG_SEND_WAIT = 0; }

}


是這樣的 當(dāng)我使用下面的程序時是能夠收到上傳數(shù)據(jù)的。 case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ xWriteCH376Cmd( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = xReadCH376Data( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = xReadCH376Data( ); /* 接收數(shù)據(jù)包 */ FLAG_SEND_WAIT = 1; /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 */ xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ xWriteCH376Data( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ break; }

而將上面程序中下面幾句屏蔽后就收不到上傳數(shù)據(jù)了 // xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ // xWriteCH376Data( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ // for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */

實際上兩個程序唯一的區(qū)別就在于一個在中斷內(nèi),一個在主程序內(nèi)運行, 我一直沒找到到底是什么原因啊


那到底有沒有收到下傳的數(shù)據(jù)?


在CH372設(shè)置成模式2之后,加上這部分?jǐn)?shù)據(jù)之后在進行數(shù)據(jù)上傳你看下還有沒有問題: CH375_WR_CMD_PORT(0x15);//設(shè)置設(shè)備模式 CH375_WR_DAT_PORT(0x02);//設(shè)置內(nèi)置固件模式 while(1){ //下面的判斷可能很花時間,在計算機主動通信的時候可以不需要這個步驟,建議加上 mDelaymS(50); CH375_WR_CMD_PORT(0x0a); CH375_WR_DAT_PORT(0x20);//這邊判斷計算機是否準(zhǔn)備好,時間在500MS,所以應(yīng)該在500MS以上 _nop_( ); c=CH375_DAT_PORT; if((c&0x20)==0x20)break; }


可能我沒表述清楚, 根據(jù)你們提供的例程 修改過后,用DEBUG372進行測試時, 上傳和下傳數(shù)據(jù)都沒有問題; 而我將中斷里面的 // xWriteCH376Cmd( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ // xWriteCH376Data( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ // for ( i = 0; i < length; i ++ ) xWriteCH376Data( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應(yīng)用 此段程序屏蔽后,放到主程序中運行后,結(jié)果是單片機能夠收到DEBUG372的下傳數(shù)據(jù),但DEBUG372收不到單片機發(fā)送的上傳數(shù)據(jù)。

并且如果上傳或者下傳不成功的話,DEBUG372的按鈕也會處于灰色狀態(tài)。


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

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