用的是你們的89c58RD+ch375.用的是你們自帶的測(cè)試程序,口地址定義為unsigned char volatile xdata CH375_CMD_PORT _at_ 0xa001; // CH375命令端口的I/O地址 unsigned char volatile xdata CH375_DAT_PORT _at_ 0xa000; // CH375數(shù)據(jù)端口的I/O地址 應(yīng)該是把我從PC發(fā)的數(shù)據(jù)回發(fā)給我,但是我用你們給的USB DEBUG.EXE,發(fā)送一個(gè)數(shù)據(jù)過(guò)去,沒(méi)有回發(fā),測(cè)試INT引腳一直為高,而且我在中斷服務(wù)程序里加了串口輸出,只要進(jìn)入終端,就會(huì)有串口輸出,但還串口沒(méi)有輸出,說(shuō)明沒(méi)有進(jìn)入中斷服務(wù),請(qǐng)問(wèn)可能是什么問(wèn)題,謝謝
這首先要確認(rèn)設(shè)備是否已經(jīng)正常工作,軟件能否成功打開(kāi)設(shè)備?
CMD_CHECK_EXIS 命令的返回值也是對(duì)的,計(jì)算機(jī)可以識(shí)別出USB設(shè)備
(1)CH375的中斷線與程序中的定義是否一致?中斷是否啟用? (2)串口是否配置好 (3)把下位機(jī)程序貼出來(lái)看看
(1)定義一致,為INT0; (2) 串口沒(méi)有問(wèn)題,在其他地方輸出都是對(duì)的 (3)#include #include #include #include"CH375INC.h"
/*******************************************************************************************************
********************************************************************************************************/ unsigned char volatile xdata CH375_CMD_PORT _at_ 0xa001; // CH375命令端口的I/O地址 unsigned char volatile xdata CH375_DAT_PORT _at_ 0xa000; // CH375數(shù)據(jù)端口的I/O地址
bit USBRcvFlag = 0; //USB數(shù)據(jù)包成功接收 unsigned char UsbBuf[64]; //--------------------------------------------------------------------------------------- void Delay1us( ) { unsigned char i; for ( i=2; i!=0; i-- ); }
void Delay2us( ) { unsigned char i; for ( i=4; i!=0; i-- ); } void putchar1(unsigned char ch) { SBUF=ch; while(TI==0); TI=0; }
// 向CH375的命令端口寫(xiě)入命令 void CH375_WR_CMD_PORT( unsigned char cmd ) { Delay2us(); CH375_CMD_PORT=cmd; Delay2us(); }
// 向CH375的數(shù)據(jù)端口寫(xiě)入數(shù)據(jù) void CH375_WR_DAT_PORT( unsigned char dat ) { CH375_DAT_PORT=dat; Delay1us(); }
// 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù) unsigned char CH375_RD_DAT_PORT( void ) { Delay1us(); return( CH375_DAT_PORT ); } void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); } //--------------------------------------------------------------------------------------- //USB中斷 void ex0_Val(void) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; putchar1(66); 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 ++ ) UsbBuf[ 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( length ); /* 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ UsbBuf[ i ] ); /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測(cè)試數(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; } } }
void USBInit( void ) { unsigned int i; unsigned int j; CH375_WR_CMD_PORT( 0x05 ); for ( i=10000; i!=0; i-- ); /* 測(cè)試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT( 0x06 ); /* 測(cè)試CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 寫(xiě)入測(cè)試數(shù)據(jù) */ j = CH375_RD_DAT_PORT( ); putchar1(j);
// 設(shè)置USB工作模式 CH375_WR_CMD_PORT( 0x15 ); CH375_WR_DAT_PORT( 2 ); //設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 for ( i=10000; i!=0; i-- ) ; if ( CH375_RD_DAT_PORT( ) == 0x51) putchar1(1); else if ( CH375_RD_DAT_PORT( ) == 0x5f) putchar1(2); else putchar1(3);
}
void UsbSendData(unsigned char *buf , unsigned char n) { unsigned char i; /* CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); //向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 CH375_WR_DAT_PORT( n ); // 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度/
for(i =0 ;i { CH375_WR_DAT_PORT( *buf++); } */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點(diǎn)1的發(fā)送緩沖區(qū)寫(xiě)入數(shù)據(jù)塊 / CH375_WR_DAT_PORT( 8 ); // 首先寫(xiě)入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 / for(i =0 ;i<8;i++) { CH375_WR_DAT_PORT( 0x02 ); }
}
/*******************************************************************************************************
********************************************************************************************************/
void McuInit(void) { SCON = 0x50; //串口工作方式1 TMOD = 0x21; //T1,初值自動(dòng)重裝 TH1 = 0xfa; //波特率9600bps 0xfa @ 22.1184M 0xfd @11.0592 TL1 = 0xfa;
IT0=0 ; EX0 = 1; //開(kāi)INT0 EA = 1; TR1 = 1;
} //-------------------------------------------------------------------------- //函數(shù)名稱(chēng): Uart_SendData() //函數(shù)功能: 串口發(fā)送一個(gè)字節(jié)的數(shù)據(jù) //其他說(shuō)明: 此程序供中斷調(diào)用 //--------------------------------------------------------------------------
/*void Uart_SendData(unsigned char dat) { SBUF=dat; //寫(xiě)SBUF,開(kāi)始發(fā)送 while(TI==0); //等待發(fā)送 TI=0; //清發(fā)送標(biāo)志位 } */
//-------------------------------------------------------------------------- //函數(shù)名稱(chēng): INT_UartRcv() //函數(shù)功能: 串口接收中斷函數(shù) //其他說(shuō)明: 無(wú) //--------------------------------------------------------------------------
/*void INT_UartRcv(void) interrupt 4 { unsigned char Rcv=0; if(RI) { RI=0; // Rcv=SBUF; Uart_SendData(Rcv); //返回接收數(shù)據(jù),可以改為其他函數(shù) }
} */
/*******************************************************************************************************
********************************************************************************************************/ void main() { char i=0; Delay50ms( ); McuInit();
USBInit(); while(1); }
現(xiàn)在又可以進(jìn)入中斷了,但是InterruptStatus = CH375_RD_DAT_PORT( );后InterruptStatus 的值是A4
可以進(jìn)入中斷的情況是我從USB DEBUG.EXE里發(fā)個(gè)數(shù)據(jù)給CH375。但是如果我調(diào)用UsbSendData,那應(yīng)該在PC取走數(shù)據(jù)后也應(yīng)該進(jìn)入中斷,但是我試了下,這種情況進(jìn)不了中斷
你應(yīng)該點(diǎn)擊一下上傳的按扭才可以正常上傳把數(shù)據(jù)上傳到PC上.
不就是把數(shù)據(jù)填到發(fā)送框然后點(diǎn)手動(dòng)發(fā)送嗎,難道我這個(gè)DEBUG.EXE有問(wèn)題?
回復(fù)8樓的,還是不行。。。
這個(gè)程序是實(shí)驗(yàn)過(guò)的 可以直接用的,上位機(jī)使用DEBUG372.exe 進(jìn)行調(diào)試, 點(diǎn)擊下傳按扭把數(shù)據(jù)下傳給單片機(jī),然后點(diǎn)擊上傳按紐,接收單片機(jī)上傳的數(shù)據(jù),
DEBUG372.exe 在哪兒下載?
下載地址:http://wch.cn/download/list.asp?id=9
找到了DEBUG.EXE,果然用這個(gè)可以,不知道用那個(gè)為什么不可以。謝謝你們~!