⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch372dbg.c

📁 USB固件程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -