?? ch372dbg.c
字號(hào):
buf = (PUINT8)&udp.down; /* 指令命令包緩沖區(qū) */
do {
*buf = CH375_RD_DAT_PORT( ); /* 接收命令包的數(shù)據(jù) */
buf ++;
} while ( -- cnt );
if ( udp.down.mCommand != (UINT8)( ~ udp.down.mCommandNot ) ) return; /* 命令包反碼校驗(yàn)錯(cuò)誤,放棄該下傳包 */
if ( udp.down.mCommand & USB_CMD_MEM_ACCESS ) { /* 命令類型:存儲(chǔ)器和SFR讀寫 */
if ( ( udp.down.mCommand & USB_CMD_MEM_WIDTH ) != USB_CMD_MEM_W_BYTE ) { /* 本程序目前對(duì)MCS51只支持以字節(jié)為單位進(jìn)行讀寫 */
udp.up.mLength = 0;
udp.up.mStatus = ERR_UNSUPPORT; /* 命令不支持 */
}
else { /* 以字節(jié)為單位進(jìn)行讀寫 */
for ( cnt = 0; cnt != udp.down.mLength; cnt ++ ) { /* 讀寫操作計(jì)數(shù) */
dat = udp.down.mBuffer[ cnt ]; /* 準(zhǔn)備寫入的數(shù)據(jù) */
switch( udp.down.mCommand & USB_CMD_MEM_SPACE ) { /* 存儲(chǔ)器空間 */
case USB_CMD_MEM_S_SFR:
switch ( udp.down.u.mByte[0] ) { /* 分析SFR地址 */
case 0x80:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) P0 = dat;
else dat = P0;
break;
case 0x87:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) PCON = dat;
else dat = PCON;
break;
case 0x88:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) TCON = dat;
else dat = TCON;
break;
case 0x89:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) TMOD = dat;
else dat = TMOD;
break;
case 0x8A:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) TL0 = dat;
else dat = TL0;
break;
case 0x8B:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) TL1 = dat;
else dat = TL1;
break;
case 0x8C:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) TH1 = dat;
else dat = TH0;
break;
case 0x8D:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) TH1 = dat;
else dat = TH1;
break;
case 0x90:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) P1 = dat;
else dat = P1;
break;
case 0x98:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) SCON = dat;
else dat = SCON;
break;
case 0x99:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) SBUF = dat;
else {dat = SBUF;RI=0;}
break;
case 0xA0:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) P2 = dat;
else dat = P2;
break;
case 0xA8:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) IE = dat;
else dat = IE;
break;
case 0xB0:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) P3 = dat;
else dat = P3;
break;
case 0xB8:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) IP = dat;
else dat = IP;
break;
case 0xC8:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) T2CON = dat;
else dat = T2CON;
break;
default:
dat = 0;
break;
}
break;
case USB_CMD_MEM_S_IRAM:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) *(PUINT8)udp.down.u.mByte[0] = dat;
else dat = *(PUINT8)udp.down.u.mByte[0];
break;
case USB_CMD_MEM_S_XRAM:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) *(PUINT8X)( udp.down.u.mByte[0] | (UINT16)udp.down.u.mByte[1] << 8 )= dat;
else dat = *(PUINT8X)( udp.down.u.mByte[0] | (UINT16)udp.down.u.mByte[1] << 8 );
break;
case USB_CMD_MEM_S_ROM:
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) udp.up.mStatus = ERR_UNSUPPORT; /* 命令不支持 */
else dat = *(PUINT8C)( udp.down.u.mByte[0] | (UINT16)udp.down.u.mByte[1] << 8 );
break;
}
if ( ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) == 0 ) udp.up.mBuffer[ cnt ] = dat; /* 返回讀出的數(shù)據(jù) */
udp.down.u.mByte[0] ++;
if ( udp.down.u.mByte[0] == 0 ) udp.down.u.mByte[1] ++;
}
if ( udp.down.mCommand & USB_CMD_MEM_DIR_WR ) udp.up.mLength = 0; /* 寫操作不返回?cái)?shù)據(jù) */
udp.up.mStatus = ERR_SUCCESS;
}
}
else switch ( udp.down.mCommand ) { /* 命令類型:實(shí)現(xiàn)特定功能,分析命令碼 */
case USB_CMD_GET_FW_INFO: /* 獲取調(diào)試固件程序的版本,并取消未完成的上傳數(shù)據(jù)塊 */
udp.up.mBuffer[0] = THIS_FIRMWARE_VER;
udp.up.mLength = 1;
udp.up.mStatus = ERR_SUCCESS;
CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); /* 設(shè)置USB端點(diǎn)2的IN,也就是批量上傳端點(diǎn) */
CH375_WR_DAT_PORT( 0x0E ); /* 同步觸發(fā)位不變,設(shè)置USB端點(diǎn)2的IN正忙,返回NAK,實(shí)際是清除上傳緩沖區(qū)的已有內(nèi)容 */
break;
case USB_CMD_GET_APP_INFO: /* 獲取當(dāng)前應(yīng)用系統(tǒng)的版本和說明字符串 */
udp.up.mBuffer[0] = THIS_APP_SYS_VER;
cnt = 0;
str = THIS_APP_SYS_STR;
while ( udp.up.mBuffer[ cnt ] = *str ) { cnt ++; str ++; } /* 說明字符串 */
udp.up.mLength = 1 + sizeof( THIS_APP_SYS_STR );
udp.up.mStatus = ERR_SUCCESS;
break;
case USB_CMD_GET_RXD_DATA:
if(REN) {
if(FLAG_RXD) {
for(cnt=0;cnt!=mRxdLen;cnt++) udp.up.mBuffer[ cnt ] = RXDBUF[cnt];
udp.up.mLength = mRxdLen;
mRxdLen=0;
FLAG_RXD=0;
udp.up.mStatus = ERR_SUCCESS;
}
else {
udp.up.mStatus = ERR_SUCCESS;
udp.up.mLength = 0;
}
}
else {
udp.up.mStatus = ERR_NOPENSER; /*沒有打開串口*/
udp.up.mLength = 0;
}
break;
case USB_CMD_SEND_TXD: //寫串口
if(REN) {
mTxdLen=udp.down.mLength;
for(cnt=0;cnt!= udp.down.mLength;cnt++) TXDBUF[cnt] = udp.down.mBuffer[ cnt ];
TI=0;
pTxdbuf=TXDBUF;
if ( mTxdLen ) SBUF=*pTxdbuf;
udp.up.mLength = 0;
udp.up.mStatus = ERR_SUCCESS;
}
else {
udp.up.mStatus = ERR_NOPENSER; /*沒有打開串口*/
udp.up.mLength = 0;
}
break;
case USB_CMD_OPEN_S:
TI=0;
RI=0;
PCON=0X80;
SCON=0X50;
TL2 = RCAP2L = 0-0X4e; //默認(rèn)9600 @24MHz
TH2 = RCAP2H = 0xFF;
T2CON = 0x34; /* 定時(shí)器2用于串口的波特率發(fā)生器 */
ES=1; //允許串口中斷
mRxdLen=0;
udp.up.mLength = 0;
udp.up.mStatus = ERR_SUCCESS;
break;
case USB_CMD_SET_BO:
T2CON = 0x30;
TL2 = RCAP2L = 0-udp.down.mBuffer[0]; /* 波特率常數(shù) */
TH2 = RCAP2H = 0xFF;
T2CON = 0x34; /* 定時(shí)器2用于串口的波特率發(fā)生器 */
udp.up.mLength = 0;
udp.up.mStatus = ERR_SUCCESS;
break;
case USB_CMD_CLOSE_S:
REN=0;
TI=0;
RI=0;
T2CON = 0x00; /* 關(guān)閉定時(shí)器2用于串口的波特率發(fā)生器 */
ES=0; //不允許串口中斷
mRxdLen=0;
udp.up.mLength = 0;
udp.up.mStatus = ERR_SUCCESS;
break;
case(USB_CMD_EXCHANGE_DATA_OUT):
{ iic_addr_b=(udp.down.u.mByte[0]>>2)&0x03;
if(udp.down.u.mByte[0]&0x03==0x01)iic_speed=1;
else iic_speed=0;
if(write_str_sub(udp.down.u.mByte[1],udp.down.u.mByte[2],udp.down.u.mByte[3],(UINT8*)&udp.down.mBuffer,udp.down.mLength)){udp.up.mStatus = ERR_SUCCESS;}
}
break;
case(USB_CMD_EXCHANGE_DATA_IN):
{ iic_addr_b=(udp.down.u.mByte[0]>>2)&0x03;
if(udp.down.u.mByte[0]&0x03==0x01)iic_speed=1;
else iic_speed=0;
if(read_str_sub(udp.down.u.mByte[1],udp.down.u.mByte[2],udp.down.u.mByte[3],(UINT8*)&udp.up.mBuffer,udp.down.mLength)){udp.up.mStatus = ERR_SUCCESS;}
}
break;
default: /* 命令不支持 */
udp.up.mLength = 0;
udp.up.mStatus = ERR_UNSUPPORT;
break;
}
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
cnt = udp.up.mLength + (UINT8)( & ( (USB_UP_PKT *)0 ) -> mBuffer );
CH375_WR_DAT_PORT( cnt ); /* 首先寫入后續(xù)數(shù)據(jù)長度 */
buf = (PUINT8)&udp.up; /* 指向狀態(tài)包緩沖區(qū) */
do {
CH375_WR_DAT_PORT( *buf ); /* 寫入數(shù)據(jù)到CH375 */
buf ++;
} while ( -- cnt );
}
else if ( IntStatus == USB_INT_EP2_IN ) { /* 批量數(shù)據(jù)發(fā)送成功,狀態(tài)包已發(fā)送 */
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū),收到上傳成功中斷后,必須解鎖USB緩沖區(qū),以便繼續(xù)收發(fā) */
}
else if ( IntStatus == USB_INT_EP1_IN ) { /* 中斷數(shù)據(jù)發(fā)送成功,本程序未用到 */
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */
}
/* 內(nèi)置固件的USB方式下不應(yīng)該出現(xiàn)其它中斷狀態(tài) */
}
void mSportinterupt(void )interrupt 4 using 1{
if(RI){ /*接收數(shù)據(jù)*/
if(mRxdLen==0) pRxdbuf=RXDBUF;
if(mRxdLen!=16){
*pRxdbuf=SBUF;
pRxdbuf++;
mRxdLen++;
}
else *pRxdbuf=SBUF;
RI=0;
FLAG_RXD=1;
}
else{ /*發(fā)送數(shù)據(jù)*/
TI=0;
mTxdLen--;
if(mTxdLen){
pTxdbuf++;
SBUF=*pTxdbuf;
}
}
}
main( void )
{ CH375_Init( );
EA = 1;
while(1);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -