CH372上下位機數(shù)據(jù)傳輸?shù)膯栴}

我采用了上位機軟件用:CH372DBG.ZIP\DEBUG372\Release\DEBUG372.EXE, 下位機用:CH372EVT.ZIP\PUB\TEST\MCU\TEST.C,先進行簡單調試。 我采用了這樣一種方式來進行調試的,因為我的硬件有所不同,所以對test.c程序進行了一些改動,問題是:中斷程序進去不了,利用release的上位機界面下傳數(shù)據(jù)的時候,“數(shù)據(jù)端點2”下傳長度和數(shù)據(jù)我分別填寫了“1”“55”,點擊確定后,沒有反應,再次點擊就不能繼續(xù)了。

如何讓INT拉低電平而進入中斷函數(shù)里面?????

附上我的程序:請高手給予意見啊,謝謝

#pragma NOAREGS #include #include #include "CH375INC.H" /* 頭文件,在網(wǎng)上下載的CH372或者CH375評估板資料中有 */

sbit CH375_A0 = P3^7; /*地址線輸入A0,A0=1時寫命令,A0=0時讀寫數(shù)據(jù)*/ sbit CH375_RD = P3^5; /*讀選通輸入,低電平有效*/ sbit CH375_WR = P3^4; /*寫選通輸入,低電平有效*/ sbit CH375_INT_WIRE = P3^3; /*中斷請求輸出,低電平有效*/

#define CH375_D0_D7 P1 /*端口的IO地址*/ file://volatile unsigned char rd_dat;

void delay50ms(void); void delay2s(void);

void CH375_WR_CMD_PORT( unsigned char cmd ); void CH375_WR_DAT_PORT( unsigned char dat ); unsigned char CH375_RD_DAT_PORT(void);

void set_usb_mode( unsigned char mode ); void CH375_Init( void );

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

/* 延時2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); /* 根據(jù)單片機的時鐘選擇初值 */ } void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */ delay2us(); // CH375_CMD_PORT=cmd; // ******************** 注釋中是用普通I/O引腳模擬8位并口的時序,CH375_CS引腳是可選的,可以一直接GND強制片選 CH375_D0_D7 = cmd; CH375_A0 = 1; /*選擇CH375的命令口*/ // CH375_D0_D7_DIR = output; /*對于標準雙向I/O,請在此設置為輸出方向*/ CH375_RD = 1; /*如果I/O默認電平是高電平,那么這是可選操作*/ // CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; 對于高速單片機,該指令用于延時,以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; // CH375_CS = 1; CH375_A0 = 0; // CH375_D0_D7_DIR = input; /*對于標準雙向I/O,請在此設置為輸入方向*/ CH375_D0_D7 = 0xFF; /*對于準雙向I/O,請在此設置輸出全高電平*/ file://******************** delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ // CH375_DAT_PORT=dat; // ******************** 注釋中是用普通I/O引腳模擬8位并口的時序 CH375_D0_D7 = dat; // CH375_D0_D7_DIR = output; /*對于標準雙向I/O,請在此設置為輸出方向*/ // CH375_CS = 0; CH375_WR = 0; // CH375_CS = 0; 對于高速單片機,該指令用于延時,以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; // CH375_CS = 1; // CH375_D0_D7_DIR = input; /*對于標準雙向I/O,請在此設置為輸入方向*/ CH375_D0_D7 = 0xFF; /*對于準雙向I/O,請在此設置輸出全高電平*/ file://******************** // delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ }

unsigned char CH375_RD_DAT_PORT(void) { unsigned char rev_data; CH375_D0_D7 = 0xFF; CH375_A0 = 0; /* 數(shù)據(jù) */ CH375_WR = 1; CH375_RD = 0;

rev_data = CH375_D0_D7; CH375_RD = 1; return( rev_data ); }

void set_usb_mode( unsigned char mode ) { unsigned char i; unsigned char RD_Data1; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( mode ); for( i=100; i!=0; i-- ) /* 等待設置模式操作完成,不超過30uS */ { RD_Data1=CH375_RD_DAT_PORT(); if( RD_Data1 == CMD_RET_SUCCESS ) return; /* 成功 */ } }

/* CH375初始化子程序 */ void CH375_Init( void ) { unsigned char i,k; unsigned char RD_Data2; CH375_D0_D7 = 0xFF; CH375_INT_WIRE = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; /* 測試CH375是否正常工作 */ for( k=100; k!=0; k-- ) { CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ i = 0x55; CH375_WR_DAT_PORT( i ); /* 寫入測試數(shù)據(jù) */ i = ~i; /* 返回數(shù)據(jù)應該是測試數(shù)據(jù)取反 */ RD_Data2 = CH375_RD_DAT_PORT(); if ( RD_Data2 != i ) /* CH375不正常 */ { for ( i=5; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重復發(fā)命令,執(zhí)行硬件復位 */ } delay50ms(); /* 延時50ms */ } else break; } /* 設置USB工作模式, 必要操作 */

set_usb_mode( 2 ); file://內部固件模式

/* if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */ /* 下述啟用中斷,假定CH375連接在INT1*/ IT1 = 0; /* 置外部信號為低電平觸發(fā) */ IE1 = 0; /* 清中斷標志 */ EX1 = 1; /* 允許CH375中斷 */ }

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

main( ) { int i; Delay50ms( ); /* 延時等待CH375初始化完成,如果單片機由CH375提供復位信號則不必延時 */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允許中斷 */ while ( 1 ); }

如果計算機可以找到新的硬件的話,那么,你用我們的372DEBUG下傳數(shù)據(jù)的話,那么,372的中斷引腳會變低的。你可以按照上面的步驟,你觀測下中斷引腳有沒有變低


我按照完整的步驟來操作的,中斷引腳沒有變低。我的程序有問題嗎?

“數(shù)據(jù)端點2”下傳數(shù)據(jù)的格式怎么寫?長度為1 數(shù)據(jù)為55 這樣符合要求嗎?


計算機管理器中一直能看到USB CH372/375嗎? 會不會是其他引腳將它拉高了,你將中斷INT#引腳翹起來,在往下發(fā)數(shù)據(jù)時看一下CH372的INT#引腳有沒有拉低。


我的CH372能下傳數(shù)據(jù),但不能上傳數(shù)據(jù),這是怎么回事啊 ?


你可以這樣做下,在下傳數(shù)據(jù)成功之后,在上傳數(shù)據(jù)看下可以不可以。


計算機管理器中一直能看到USB CH372/375嗎? 會不會是其他引腳將它拉高了,你將中斷INT#引腳翹起來,在往下發(fā)數(shù)據(jù)時看一下CH372的INT#引腳有沒有拉低 --------------- 在設備管理器里面可以一直看到USB CH372的 我將INT#翹起來了的,用debug往下發(fā)送數(shù)據(jù),測得CH372的INT# 引腳仍舊是高的

我該懷疑這個芯片壞了嗎?


我感覺好像是芯片有問題, 那你的CH372能上傳數(shù)據(jù)嗎? 看看上傳數(shù)據(jù)時1腳有沒有中斷?


hcn 正如你所說的,先下傳數(shù)據(jù)成功后,再上傳數(shù)據(jù),按照這樣的順序能上傳數(shù)據(jù), 這是程序的問題嗎?

是不是在CH372上電后延時一段時間啊,再對CH372進行操作啊? 那延時多長時間?

請指點 謝謝了


372上電延時的時間在50-100MS之間,這個不是程序的問題,在USB協(xié)議里面,所有的數(shù)據(jù)傳輸都是由USB主機來發(fā)起的,對于372芯片來說,是做設備的,所以在設備首先想傳輸數(shù)據(jù)的時候,需要通知主機設備有沒有準備好,所以,在372想首先發(fā)起數(shù)據(jù)傳輸?shù)臅r候,需要發(fā)送一個命令來通知主機,如果你需要的話,可以發(fā)一個E-MAIL到:tech@wch.cn,我們給你發(fā)一個首先由372傳輸數(shù)據(jù)的例子程序給你.


是不是你用了INT1的問題?你留著INT0干什么用啊?


INT0腳懸空在,這個,和外界的哪一個INT沒有關系吧? 在程序里面體現(xiàn)一下就好了對吧? 關鍵是CH372的INT#老是不能拉低,甚是頭疼


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

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