debug372

大家好, 我目前用debug372 對375B進行調(diào)試. 經(jīng)常在端點2下傳后,收不到數(shù)據(jù). 有時候能收到數(shù)據(jù),不過收到數(shù)據(jù)后返回的值有時候卻是錯誤的. 比方說,我下傳4個字節(jié)的長度11111111,有時能正確收到eeeeeeee 但如果說下傳4個字節(jié)長度12345678,上傳收到的數(shù)據(jù)只有前幾個是正確的. 不解中,希望大家能幫幫我.順附上下位機的代碼,希望有心人幫我分析一下,小弟在這里謝過了先. /* ; CH375/CH372 Bulk Data Test ; U2(AT89C51) Program ; 本程序測試數(shù)據(jù)傳輸?shù)恼_性,可以用于長時間連續(xù)測試,對應(yīng)的計算機端的測試程序為TEST.EXE ; 方法: 下傳隨機長度的隨機數(shù)據(jù)包,被單片機接收并將數(shù)據(jù)按位取反后返回,最終由計算機程序接收后比較數(shù)據(jù)是否正確 ; ; Website: http://winchiphead.com ; Email: 個人信息保護,已隱藏 ; Author: W.ch 2003.09 */

/* MCS-51單片機C語言的示例程序,用于其它單片機時一般只要修改前面幾個接口子程序及硬件定義 */

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

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

/*======================================================================== 本例中的硬件連接方式如下,本例使用51總線方式進行數(shù)據(jù)操作.不可更改接口

CH375芯片的引腳 51單片機的引腳

RD----接P3.7 WR----接P3.6 CS----接P2.6 A0----接P2.0 INT---接P3.2 D0----接P0.0 . . . D7----接P0.7 =========================================================================*/ sbit buz=P3^4;

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

/* 延時1微秒,不精確,因為MCS51單片機較慢所以實際上無需延時 */ void delay1us( ) { unsigned char i; for ( i = 1; i != 0; i -- ); }

/* 基本操作 */

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; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸出方向 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; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向 CH375_D0_D7 = 0xFF; 對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平 ******************** */ delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ delay1us(); CH375_DAT_PORT=dat; /* ******************** 注釋中是用普通I/O引腳模擬8位并口的時序 CH375_D0_D7 = dat; // CH375_D0_D7_DIR = output; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸出方向 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; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向 CH375_D0_D7 = 0xFF; 對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平 ******************** */ // delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ }

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

/* 延時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; /* 測試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫入測試數(shù)據(jù) */ i = ~ 0x55; /* 返回數(shù)據(jù)應(yīng)該是測試數(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( ); /* 延時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存在硬件錯誤 }; */ /* 下述啟用中斷,假定CH375連接在INT0 */ IT0 = 0; /* 置外部信號為低電平觸發(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)并取消中斷請求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT; /* 首先讀取后續(xù)數(shù)據(jù)長度 */ //if (length==2) buz=0; 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ù)取反后返回,由計算機應(yīng)用程序測試數(shù)據(jù)是否正確 */ 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( ); /* 延時等待CH375初始化完成,如果單片機由CH375提供復(fù)位信號則不必延時 */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允許中斷 */ while ( 1 ); /* 以下指令開始工作循環(huán),等待PC機命令進行操作 */ }

首先你看下測試命令通過了沒有?這個問題你可以先這樣去測試下: CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫入測試數(shù)據(jù) */ i=CH375_RD_DAT_PORT( ); i應(yīng)該為0XAA CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫入測試數(shù)據(jù) */ i=CH375_RD_DAT_PORT( ); i應(yīng)該為0X55 如果你確認上面的操作是OK的,那么這個時候去看下你的USB口的外殼有沒有接地,USB口線是否為屏蔽線?


初始化是OK的,CMD_CHECK_EXIST 是正常的.USB外殼是接地的,數(shù)據(jù)線是雙銅環(huán)屏蔽線的. 一直找不到是什么原因,不解中.您幫我看看還有沒有其它的什么原因


問下 unsigned char volatile xdata CH375_CMD_PORT _at_ 0x81ff; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0x80ff; /* CH375數(shù)據(jù)端口的I/O地址 */ 這個地址是怎么設(shè)的 還有我測試的返回值都是FF 就一定是硬件問題嗎?


TO:孤星 在單片機和CH375之間多連幾根地線,降低并口干擾,硬件上面除了CH375還有沒有其它的元器件? TO:小鄭 該地址是采用51單片機外部總線方式操作CH375的,與硬件連接相關(guān),如果想深入了解,請查看51單片機的總線接口


TO:小鄭,關(guān)于地址設(shè)置,參看:http://wch.cn/bbs/View.asp?S=101&I=44693 另,以后有技術(shù)問題,請另行發(fā)帖提問,以免影響他人交流


好的,不好意思。我下回注意


我是用排線進行單片機與375B連接的.單片機P0口和P2口都另加了上拉電阻.至于其它的硬件也還是有的.就是一個峰鳴器,四個數(shù)碼管,和8個LED,一個點陣,還有就是一個MAX232芯片.


1、這樣測試一下,只發(fā)送一個字節(jié)數(shù)據(jù) 2、“4個字節(jié)的長度11111111,有時能正確收到eeeeeeee”,是指單片機收還是PC收,后者的話,就正確了,單片機收到數(shù)據(jù),會取反再回傳


是PC能收到的.但是只能是偶爾都正常讀取,有時候就會提示端點2上次失敗. 請問這種情況是什么原因?


這個問題分為2步驗證:PC發(fā)數(shù)據(jù)給單片機和數(shù)據(jù)給單片機發(fā)PC,修改一下程序,收到數(shù)據(jù)不再回傳,驗證一下前者是否正常


建議先把其他電路關(guān)閉,比如蜂鳴器,先只測試CH372芯片,這樣就能保證不受其他影響。


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

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