📄 ch372dbg.c
字号:
buf = (PUINT8)&udp.down; /* 指令命令包缓冲区 */
do {
*buf = CH375_RD_DAT_PORT( ); /* 接收命令包的数据 */
buf ++;
} while ( -- cnt );
if ( udp.down.mCommand != (UINT8)( ~ udp.down.mCommandNot ) ) return; /* 命令包反码校验错误,放弃该下传包 */
if ( udp.down.mCommand & USB_CMD_MEM_ACCESS ) { /* 命令类型:存储器和SFR读写 */
if ( ( udp.down.mCommand & USB_CMD_MEM_WIDTH ) != USB_CMD_MEM_W_BYTE ) { /* 本程序目前对MCS51只支持以字节为单位进行读写 */
udp.up.mLength = 0;
udp.up.mStatus = ERR_UNSUPPORT; /* 命令不支持 */
}
else { /* 以字节为单位进行读写 */
for ( cnt = 0; cnt != udp.down.mLength; cnt ++ ) { /* 读写操作计数 */
dat = udp.down.mBuffer[ cnt ]; /* 准备写入的数据 */
switch( udp.down.mCommand & USB_CMD_MEM_SPACE ) { /* 存储器空间 */
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; /* 返回读出的数据 */
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; /* 写操作不返回数据 */
udp.up.mStatus = ERR_SUCCESS;
}
}
else switch ( udp.down.mCommand ) { /* 命令类型:实现特定功能,分析命令码 */
case USB_CMD_GET_FW_INFO: /* 获取调试固件程序的版本,并取消未完成的上传数据块 */
udp.up.mBuffer[0] = THIS_FIRMWARE_VER;
udp.up.mLength = 1;
udp.up.mStatus = ERR_SUCCESS;
CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); /* 设置USB端点2的IN,也就是批量上传端点 */
CH375_WR_DAT_PORT( 0x0E ); /* 同步触发位不变,设置USB端点2的IN正忙,返回NAK,实际是清除上传缓冲区的已有内容 */
break;
case USB_CMD_GET_APP_INFO: /* 获取当前应用系统的版本和说明字符串 */
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; //默认9600 @24MHz
TH2 = RCAP2H = 0xFF;
T2CON = 0x34; /* 定时器2用于串口的波特率发生器 */
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]; /* 波特率常数 */
TH2 = RCAP2H = 0xFF;
T2CON = 0x34; /* 定时器2用于串口的波特率发生器 */
udp.up.mLength = 0;
udp.up.mStatus = ERR_SUCCESS;
break;
case USB_CMD_CLOSE_S:
REN=0;
TI=0;
RI=0;
T2CON = 0x00; /* 关闭定时器2用于串口的波特率发生器 */
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端点2的发送缓冲区写入数据块 */
cnt = udp.up.mLength + (UINT8)( & ( (USB_UP_PKT *)0 ) -> mBuffer );
CH375_WR_DAT_PORT( cnt ); /* 首先写入后续数据长度 */
buf = (PUINT8)&udp.up; /* 指向状态包缓冲区 */
do {
CH375_WR_DAT_PORT( *buf ); /* 写入数据到CH375 */
buf ++;
} while ( -- cnt );
}
else if ( IntStatus == USB_INT_EP2_IN ) { /* 批量数据发送成功,状态包已发送 */
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */
}
else if ( IntStatus == USB_INT_EP1_IN ) { /* 中断数据发送成功,本程序未用到 */
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */
}
/* 内置固件的USB方式下不应该出现其它中断状态 */
}
void mSportinterupt(void )interrupt 4 using 1{
if(RI){ /*接收数据*/
if(mRxdLen==0) pRxdbuf=RXDBUF;
if(mRxdLen!=16){
*pRxdbuf=SBUF;
pRxdbuf++;
mRxdLen++;
}
else *pRxdbuf=SBUF;
RI=0;
FLAG_RXD=1;
}
else{ /*发送数据*/
TI=0;
mTxdLen--;
if(mTxdLen){
pTxdbuf++;
SBUF=*pTxdbuf;
}
}
}
main( void )
{ CH375_Init( );
EA = 1;
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -