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

📄 ch375.c.bak

📁 使用ch375和stc 51写的usb鼠标的代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//-------------------------------
void mCh375Interrupt(void)
{
	unsigned char InterruptStatus;
	unsigned char length, len;

	CH375_WR_CMD_PORT(CMD_GET_STATUS);   	// 获取中断状态并取消中断请求 
	InterruptStatus = CH375_RD_DAT_PORT();  // 获取中断状态 
	RECV_LEN=0;
	switch( InterruptStatus )  				// 分析中断状态
	{
		case  USB_INT_EP2_OUT:   			// 批量端点/端点2收到数据, 下传成功
			if(0x00!=(rdData()))				// 收到数据非空
			{
				if(0x11==RECV_BUFFER[0])
				{
					led=!led;
				}
			}		
			if(debug) uartPutStr("EP2_OUT\n\r");
			break;
		case   USB_INT_EP2_IN: 				//批量端点/端点2数据上传成功, 未处理
			if(debug) uartPutStr("EP2_IN\n\r");
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);
			break;
		case   USB_INT_EP1_IN:   			//中断端点/端点1数据上传成功,未处理
			if(debug) uartPutStr("EP1_IN\n\r");
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);
			break;
		case   USB_INT_EP1_OUT:    			//中断端点/端点1数据下传成功
			if(debug) uartPutStr("EP1_OUT\n\r");
			if(0x00!=rdData())
			{
				break;
			}	
			break;
		case   USB_INT_EP0_SETUP:  			//控制端点建立成功, 端点0接受到数据, setup成功
			if(debug&DBG_SETUP)	uartPutStr("#SETUP\n\r");
		  	CH375_WR_CMD_PORT( CMD_RD_USB_DATA );
			length=CH375_RD_DAT_PORT();
			for( len=0; len<length; len++ )
			{
				request.buffer[len] = CH375_RD_DAT_PORT();   		// 取出数据
			}	
			if(debug&DBG_SETUP)	uartPrint("setup dat: %\n\r", request.buffer, length);
			if( 0x08==length )
			{
			    mVarSetupLength=(request.buffer[6]&0x7f); 			//控制传输数据长度最大设置为128
				if( !(request.r.bmReuestType&0x60) )           		//标准请求
				{
					mVarSetupRequest=request.r.bRequest; 			//暂存标准请求码, 标准请求码有12种, 其中有2种是为将来保留的
					switch( request.r.bRequest )  					//分析标准请求
					{
//标准请求, 1						
						case DEF_USB_CLR_FEATURE: 							//请求, 清除特性, 现在只支持端口
							if(debug) uartPutStr("clr feature\n\r");
							if((request.r.bmReuestType&0x1F)==0x02) 		//接受者, 0-设备, 1-接口, 2-端点, 3-其他
							{
								switch( request.buffer[4] )					//表明是哪一个接口或节点, bit7-表方向, 1-入; bit0-3端点号
								{
									case 0x82:			//端点2, 入
										CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); //设置端点2发送器, 清除端点2上传
										CH375_WR_DAT_PORT( 0x8E );          //发命令清除端点
										break;
									case 0x02:			//端点2, 出
										CH375_WR_CMD_PORT( CMD_SET_ENDP6 );
										CH375_WR_DAT_PORT( 0x80 ); 			//清除端点2下传
										break;
									case 0x81:			//
										CH375_WR_CMD_PORT( CMD_SET_ENDP5 ); //清除端点1上传
										CH375_WR_DAT_PORT( 0x8E );
										break;
									case 0x01:
										CH375_WR_CMD_PORT( CMD_SET_ENDP4 ); //清除端点1下传
										CH375_WR_DAT_PORT( 0x80 );
										break;
									default:
										break;
								}
							}
							else
							{
								CH375FLAGERR=1; //不支持的清除特性,置错误标志
							}
							break;
//标准请求, 2									
						case DEF_USB_GET_STATUS: 		//标准请求, 获得状态
							if(debug) uartPutStr("G_STATUS\n\r");
							request.buffer[0]=0;
							request.buffer[1]=0; 		//上传状态
							break;
//标准请求, 3							
						case DEF_USB_SET_ADDRESS: 		//标准请求, 设置地址
							VarUsbAddress=request.buffer[2]; //暂存USB主机发来的地址
							break;
//标准请求, 4							
						case DEF_USB_GET_DESCR:  		//标准请求, 获得描述符
						/*	if(request.buffer[3]==1)							//设备描述符上传
								VarSetupDescr=DevDes;
							else if(request.buffer[3]==2)		 					//配置描述符上传
								VarSetupDescr=ConDes;
							else if(request.buffer[3]==3) {
								if ( request.buffer[2]== 0 ) VarSetupDescr=LangDes;
								else VarSetupDescr=SerDes; 						//做字符串处理
							}
							mCh375DesUp();*/
						
							switch(request.buffer[3])
							{
								case USB_DEVICE:			//设备描述苻
									if(debug) uartPutStr("DEVICE\n\r");
									VarSetupDescr=DevDes;
									break;
								case USB_CONFIGURATION:   	//配置描述符
									if(debug) uartPutStr("CONFIG\n\r");
									VarSetupDescr=ConDes;
									break;
								case USB_STRING:			//字符串描述符
									if(debug) uartPutStr("STRING\n\r");
									if(0==request.buffer[2])			
										VarSetupDescr=LangDes; 
									else
										VarSetupDescr=SerDes;	
									break;
								case USB_HID:				//HID描述符
									if(debug) uartPutStr("HID\n\r");
									VarSetupDescr=Class_Descriptor;
									break;
								case USB_REPORT:			//
									if(debug) uartPutStr("REPORT\n\r");
									VarSetupDescr=hid_report_desc_table;
									break; 
								default:
									if(debug) uartPutStr("NO_DES\n\r");
									break;
							}			
							mCh375DesUp(); 											//其余描述符不支持
							break;
						case DEF_USB_SET_FEATURE:
							CH375_WR_CMD_PORT( CMD_SET_ENDP4 ); //清除端点1下传
							CH375_WR_DAT_PORT( 0x80 );
							break;	
//标准请求, 5							
						case DEF_USB_GET_CONFIG: 				//获得配置
							if(debug) uartPutStr("GET_CONFIG\n\r");
							request.buffer[0]=0; 				//没有配置则传0
							if( CH375CONFLAG )
								request.buffer[0]=1; 			//已经配置则传1, 这是在描述符里规定的
							break;
//标准请求, 6							
						case DEF_USB_SET_CONFIG:      			//设置配置
							if(debug) uartPutStr("SET_CONFIG\n\r");
							CH375CONFLAG=0;
							if( request.buffer[2] != 0 )
							{
								CH375CONFLAG=1; 					//设置配置标志
							}
							break;
//标准请求, 7							
						case DEF_USB_GET_INTERF: 			//获得接口
							if(debug) uartPutStr("GET_INTERF\n");
							request.buffer[0]=1; 				//上传接口数,本事例只支持一个接口
							break;
						default :
							if(debug) uartPutStr("NAK_REQUEST\n");
							CH375FLAGERR=1; 						//不支持的标准请求
							break;
					}//分析标准请求结束
				}//标准请求处理结束
				//类请求
				else if(0x20==(request.r.bmReuestType&0x60))
				{
					if(debug) uartPutStr("Request class\n\r");
				}
				//非标准请求, 保留
				else
				{
					;
				}		
			}//长度是8的数据处理结束
			else   //不支持的控制传输,不是8字节的控制传输
			{
				CH375FLAGERR=1;
			}

			if( !CH375FLAGERR )
				mCh375Ep0Up(); //没有错误/调用数据上传,长度为0上传为状态
			else
			{
				CH375_WR_CMD_PORT( CMD_SET_ENDP3 ); //设置端点0发送器的工作方式, 为STALL,指示一个错误
				CH375_WR_DAT_PORT( 0x0F );
				if(debug&DBG_SETUP)	uartPutStr("error!\n\r");
				//flash_led();
			}
			break;
		case   USB_INT_EP0_IN: 											//控制端点上传成功
			if(1)	uartPutStr("0_IN\n\r");
			if( mVarSetupRequest==DEF_USB_GET_DESCR ) //描述符上传
			{
				mCh375DesUp();
				mCh375Ep0Up();
			}
			else
			if( mVarSetupRequest==DEF_USB_SET_ADDRESS ) //设置地址
			{
				CH375_WR_CMD_PORT( CMD_SET_USB_ADDR );
				CH375_WR_DAT_PORT( VarUsbAddress ); 			//设置USB地址,设置下次事务的USB地址
				if(debug) uartPrint("SET_ADDRESS: %\n\r", &VarUsbAddress, 1);
			}
			CH375_WR_CMD_PORT(CMD_UNLOCK_USB); 			//释放缓冲区
			break;
		case   USB_INT_EP0_OUT: 								//控制端点下传成功
			if(debug&DBG_SETUP)	uartPutStr("EP0_OUT!\n\r");
			/*
			CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); //发出读数据命令
			length=CH375_RD_DAT_PORT();
			if( length>0 ) //长度为0跳出
			{
				for( len=0;len!=length;len++ )
					CH375_RD_DAT_PORT(); //取出下传数据
			}*/
			len=rdData();
			if(0==len)
			{
				if(debug&DBG_SETUP)	uartPutStr("length 0x00!\n\r");
			}
			else
			{	
				if(debug&DBG_SETUP)	uartPrint("EP0_OUT %\n\r", RECV_BUFFER, len);
			}	
			break;
		default:
			if(debug&DBG_SETUP) uartPrint("status defaut %!\n\r", &InterruptStatus, 1);
			if( 0x03==(InterruptStatus&0x03) ) //总线复位
			{
				CH375FLAGERR=0; //错误清0
				CH375CONFLAG=0; //配置清0
				mVarSetupLength=0;
			}
			else
			{ //命令不支持
				flash_led();
			}
			CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //释放缓冲区
			break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -