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

📄 usb2uart.c

📁 通过c语言实现将USB接口转换成串行接口
💻 C
📖 第 1 页 / 共 4 页
字号:
 if(CTS)
 {
  state|=0x04;
 }
 if(RING)
 {
  state|=0x08;
 }
 if(Overflow)
 {
  state|=0x40;
  Overflow=0;
 }
 
 state=SWAP16(state);

 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,2,(uint8 *)&state);
 usb_flags.flags.usb_endp0_in=0;
}
/*******************************************************************/

/****************************终端点0输入处理**************************************/
void endp0_in(void)
{
 read_last_status(1);
 //如果是输入请求包
 if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
  {
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
	   #ifdef debug
	   Prints("USB标准输入请求.\r\n");
	   #endif
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0: //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
		     case 0: get_status(0);break;
		     case 6: get_descriptor();break;
		     case 8: get_configuration();break;
			 default:break;
		    }
		 break;

		 case 1:  //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         case  0: get_status(1);break;
			  case 6: get_descriptor_interface();break;
		     case 10: get_interface();break;
	         default: break;
			}
		 break;

		 case 2:  //到端点
		  {
	       if(Control_Data.DeviceRequest.bRequest==0)get_status(2);  
		  }
		 default: break;
	    }
	   break;

	   case 0x20:  //类请求
	   #ifdef debug
       Prints("USB类输入请求.\r\n");
	   #endif
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:  //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
			 default:break;
		    }
		 break;

		 case 1:  //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {

	  		 case   GET_REPORT: get_report();   break; //获取报告
             case     GET_IDLE: get_idle();     break; //获取空闲状态
             case GET_PROTOCOL: get_protocol(); break; //获取协议
			 case GET_LINE_CODING: GetLineCoding(); break; //获取串口当前设置
			 case SERIAL_STATE: SerialState();break;//获取串口状态
	         default: break;
			}
		 break;

		 case 2:  //到端点
		  {
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}  
		  }
		 default: break;
	    }
	   break;

	   case 0x40:  //用户请求
	   #ifdef debug
       Prints("USB用户输入请求.\r\n");
	   #endif
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:  //到设备
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
			 default: break;
		    }
	     break;

		 case 1:   //到接口
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}
         break;

		 case 2:  //到端点
		  {
		   switch (Control_Data.DeviceRequest.bRequest)
		    {
	         default: break;
			}  
		  }
		 default: break;
	    }
	}
    return;
  }

  //如果是输出请求包
 if(usb_flags.flags.setup_packet_out) 
  {
    switch(Control_Data.DeviceRequest.bmRequestType&0x60)
	 {
	   case 0x00:  //标准请求
	   #ifdef debug
	   Prints("USB标准输出请求.\r\n");
	   #endif
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:   //到设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {
		   case     CLEAR_FEATURE: clear_feature(0);break;
		   case       SET_FEATURE: set_feature(0);break;
		   case       SET_ADDRESS: set_usb_address();break;          //set_address	           
		   case    SET_DESCRIPTOR: set_descriptor();break;           //set_descriptor
		   case SET_CONFIGURATION: set_configuration(); break;       //set_configurat               	          
	  	   default: break;
		  }
		 break;
		 
		 case 1:   //到接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE:  clear_feature(1);break;
		    case   SET_FEATURE:  set_feature(1); break;
	        case SET_INTERFACE: set_interface();break;
		    default: break;
	        }
		 break;
		 
		 case 2:   //到端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE: clear_feature(2);break;
		    case   SET_FEATURE: set_feature(2);break;
	        default: break;      
		   }
		 break;

		 default: break;
	    }
      break;

	  case 0x20:  //类请求
	  #ifdef debug
      Prints("USB类输出请求.\r\n");
	  #endif
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:    //接收者为设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {             	          
	  	   default: break;
		  }
		 break;

		 case 1:   //接收者为接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
            case   SET_REPORT: set_report();   break; //设置报告
            case     SET_IDLE: set_idle();     break; //设置空闲
            case SET_PROTOCOL: set_protocol(); break; //设置协议
			case SET_CONTROL_LINE_STATE: SetControlLineState();break;  //设置控制线状态
			case SET_LINE_CODING: SetLineCoding();break;  //设置串口
			case SEND_BREAK: SendBreak();break; //
		    default: break;
	        }
		 
		 break;

		 case 2:   //接收者为端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }
		 break;
		 
		 case 3: //其它接收者
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }break;
		   		  
		 default: break;
	    }      
	   break;

       case 0x40:  //用户请求
	   #ifdef debug
	   Prints("USB用户输出请求.\r\n");
	   #endif
	   switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
	    {
		 case 0:    //接收者为设备
	     switch (Control_Data.DeviceRequest.bRequest)
	      {             	          
	  	   default: break;
		  }
		 break;
		 
		 case 1:   //接收者为接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    default: break;
	        }
	     break;
		 
		 case 2:   //接收者为端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }
		 break;
		 
		 case 3: //其它接收者
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
	        default: break;      
		   }		   
		 break;
		   		  
		 default: break;
	    }
	}
  }
}
/******************************************************************************/

/**********************端点1输出***********************************************/
/*void endp1_out(void)
{
 Prints("端点1输出.\r\n");
}*/
/******************************************************************************/

/*************************端点1输入*****************************************/
void endp1_in(void)
{
 //Prints("端点1输入.\r\n");
 #ifdef debug
 if(P1!=0xFF)
 {
  write_endpoint_buff(3,2,InBuffer);
 }
 #endif
}
/******************************************************************************/

/***************************端点2输出****************************************/
void endp2_out(void)
{
 uint8 c,i;

 c=read_endpoint_buff(4,64,OutBuffer);  //读回接收到的数据
 for(i=0;i<c;i++)   //通过串口发送出去
 {
  UartPutChar(OutBuffer[i]);
 }
 
#ifdef debug
 Prints("端点2输出.\r\n");
 Prints("    端点2的数据是  ");
 for(i=0;i<c;i++)
  {
   PrintHex(OutBuffer[i]);
   if(i==16)Prints("\r\n");
  }
 Prints("\r\n");
#endif
}
/******************************************************************************/

/****************************主端点输入处理************************************/
void endp2_in(void)                                      
{
 uint8 p,c;
 
 if(InCount>0)  //如果接收到数据
 {
  ES=0;   //禁止串口中断
  p=pIn;  //获取位置
  if(p+InCount>64)  //如果超过缓冲区
  {
   c=64-p;  //只取前半段数据
   InCount-=c; //个数减少c个
  }
  else
  {
   c=InCount; //否则可以取全部数据
   InCount=0;  //个数清0
  }
  pIn=(pIn+c)&0x3F;  //将pIn移动到下一个位置
  ES=1;  //允许串口中断
  write_endpoint_buff(5,c,InBuffer+p); //将数据返回给USB
 }
}
/******************************************************************************/

#ifdef debug
code uint8 HeadTable[][74]={
"********************************************************************\r\n",
"******               EDN USB学习板USB转串口程序               ******\r\n",
"******                      AT89S52 CPU                       ******\r\n",
"******                  建立日期:",__DATE__,"                 ******\r\n",
"******                   建立时间:",__TIME__,"                   ******\r\n",
"******                    作者:电脑圈圈                      ******\r\n",
"******                    欢迎访问作者的                      ******\r\n",
"******           USB专区:http://group.ednchina.com/93/       ******\r\n",
"******      BLOG1:http://www.ednchina.com/blog/computer00    ******\r\n",
"******                BLOG2:http://computer00.21ic.org       ******\r\n",
"********************************************************************\r\n",
};
#endif


/***************************主函数**********************************************/
void main(void)
{
#ifdef debug
 uint8 i;
#endif
 InitUART();  //串口初始化
 LineCoding.dwDTERate=SWAP32(9600);  //波特率9600
 LineCoding.bCharFormat=0;           //1位停止位
 LineCoding.bParityType=0;           //无校验位
 LineCoding.bDataBits=8;             //8位数据格式
 
 pIn=0;
 InCount=0;

 Overflow=0;
 
 LineCoding.dwDTERate=SWAP32(SetUartBitRate(SWAP32(LineCoding.dwDTERate))); //设置波特率
 
#ifdef debug
 Printc(0x0c);  //清屏
 Printc(0x0c);
 Prints("系统启动.\r\n");
#endif

#ifdef debug
 for(i=0;i<15;i++)	  //显示信息
 {
  Prints(HeadTable[i]);
 }
#endif

 disconnect_usb(); 	   //断开USB连接
 delay(1000);	 //延迟
 init_usb();		   //初始化USB芯片
 connect_usb();		   //连接USB


 while(1)
  { 
   if(!USB_INT)		//中断产生
    {
  	 read_interrupt_register();
	 if(Interrupt_Register.Interrupt.bus_reset){usb_bus_reset();continue;}
	 if(Interrupt_Register.Interrupt.suspend_change){usb_bus_suspend();continue;}
     if(Interrupt_Register.Interrupt.control_out_port){endp0_out();continue;}
	 if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;}
//	 if(Interrupt_Register.Interrupt.port_out_1)endp1_out();
	 if(Interrupt_Register.Interrupt.port_in_1){endp1_in();}
	 if(Interrupt_Register.Interrupt.main_out_port){endp2_out();}
	 if(Interrupt_Register.Interrupt.main_in_port){endp2_in();}
    }
  }
}
/******************************************************************************/

⌨️ 快捷键说明

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