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

📄 usb2uart.c

📁 通过c语言实现将USB接口转换成串行接口
💻 C
📖 第 1 页 / 共 4 页
字号:
  if(!usb_flags.flags.not_end)
     {
      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case HID_DESCRIPTOR:
		    #ifdef debug
		     Prints("        获取HID描述符.\r\n");
			#endif
	         Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
 	         //Control_Data.pData=(uint8 *)(&hid_descriptor);
             break;
        case REPORT_DESCRIPTOR:
		    #ifdef debug
			 Prints("        获取报告描述符.\r\n");
			#endif
             break;
		case PHYSICAL_DESCRIPTOR:
		    #ifdef debug
		     Prints("        获取物理描述符.\r\n");
			#endif
			 break;
		 default:
		     Prints("       获取其它描述符..................描述符索引为:");
			 PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
			 Prints("\r\n");
			 DispLineInf();
		  break;
	   	}
      if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
	 }
	//写数据到D12输入端点
    if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
     {
	  write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
	  Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
      Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
	  if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
	   else usb_flags.flags.usb_endp0_in=0;
	  return;
	 }
    else
     {
	  write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
      usb_flags.flags.setup_packet_in=0;
	  usb_flags.flags.usb_endp0_in=0;
	  return;
	 }      
}
/******************************************************************************/

//#define debug3
/***************设置串口的数据阶段*********************************/
void SetLineCodingD(void)
{
#ifdef debug3
 Prints("设置串口属性数据阶段");
#endif
 read_endpoint_buff(0,7,(uint8*)&LineCoding);  //读出7字节的控制值
 LineCoding.dwDTERate=SWAP32(SetUartBitRate(SWAP32(LineCoding.dwDTERate)));  //设置波特率
 LineCoding.bCharFormat=0;           //1位停止位
 LineCoding.bParityType=0;           //无校验位
 LineCoding.bDataBits=8;             //8位数据格式
}
/*******************************************************************/

//#define debug1
/************************终端点0输出中断处理************************************/
void endp0_out(void)
{
#ifdef debug1
 Prints("ep0 out status,last-status,status: ");
 PrintHex(read_endpoint_status(0));
#endif
 Last_Status.Register=read_last_status(0);
#ifdef debug1
 PrintHex(Last_Status.Register);
 PrintHex(read_endpoint_status(0));
 Prints("\r\n");
#endif

 if(Last_Status.Status.setup_packet) //setup包 
 {
  Control_Data.wLength=0;
  Control_Data.wCount=0;
  if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
  {
   set_endpoint_status(0,0);
   set_endpoint_status(1,0);
   return;
  }
  Control_Data.DeviceRequest.wValue=SWAP16(Control_Data.DeviceRequest.wValue);
  Control_Data.DeviceRequest.wIndex=SWAP16(Control_Data.DeviceRequest.wIndex);
  Control_Data.DeviceRequest.wLength=SWAP16(Control_Data.DeviceRequest.wLength);

  ack_setup(0);
  ack_setup(1);
  select_endpoint(0);
  clear_buffer();
  
  Control_Data.wLength=Control_Data.DeviceRequest.wLength;
  usb_flags.flags.not_end=0;
  usb_flags.flags.usb_endp0_in=1;
  if(Control_Data.DeviceRequest.bmRequestType&0x80)
  {
   usb_flags.flags.setup_packet_in=1;
   usb_flags.flags.setup_packet_out=0;
   return;
  }
  else 
  {
   usb_flags.flags.setup_packet_in=0;
   usb_flags.flags.setup_packet_out=1;
   if(Control_Data.wLength!=0)
   {
    usb_flags.flags.usb_endp0_in=0;
   }
   return;
  }
 }
 else
 {
  if(usb_flags.flags.setup_packet_out) 
  {
   usb_flags.flags.usb_endp0_in=1;
    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: /*ClearFeatureD(0);*/break;
		   case       SET_FEATURE: /*SetFeatureD(0);*/break;
		   case       SET_ADDRESS: /*SetUsbAddressD();*/break;          //set_address	           
		   case    SET_DESCRIPTOR: /*SetDescriptorD();*/break;           //set_descriptor
		   case SET_CONFIGURATION: /*SetConfigurationD();*/ break;       //set_configurat               	          
	  	   default: break;
		  }
		 break;
		 
		 case 1:   //到接口
	      switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE:  /*ClearFeatureD(1);*/break;
		    case   SET_FEATURE:  /*SetFeatureD(1);*/break;
	        case SET_INTERFACE: /*SetInterfaceD();*/break;
		    default: break;
	        }
		 break;
		 
		 case 2:   //到端点
		  switch (Control_Data.DeviceRequest.bRequest)
		   {
		    case CLEAR_FEATURE: /*ClearFeature(2);*/break;
		    case   SET_FEATURE: /*SetFeature(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: /*SetReportD();*/   break; //设置报告
            case     SET_IDLE: /*SetIdleD();*/     break; //设置空闲
            case SET_PROTOCOL: /*SetProtocol();*/ break; //设置协议
			case SET_CONTROL_LINE_STATE: /*SetControlLineStateD();*/ break; //设置控制线状态
			case SET_LINE_CODING: SetLineCodingD(); 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;
	    }
	 }
   }
   else
   {
    select_endpoint(0);
    clear_buffer();
    // Prints("端点0输出数据:");
    //read_endpoint_buff(0,16,buffer);	  
   }
 }
}
/******************************************************************************/

/***********************获取报告*********************************************/
void get_report(void)
{
#ifdef debug
 Prints("        获取报告.\r\n");
#endif
}
/******************************************************************************/

/**********************获取空闲状态*********************************************/
void get_idle(void)
{
#ifdef debug
 Prints("    获取空闲.\r\n");
#endif
 write_endpoint_buff(1,1,&idle);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/*************************获取协议**********************************************/
void get_protocol(void)
{
#ifdef debug
 Prints("    获取协议.\r\n");
#endif
 write_endpoint_buff(1,1,&protocol);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/***********************设置报告***********************************************/
void set_report(void)
{
#ifdef debug
 Prints("    设置报告.\r\n");
#endif
}
/******************************************************************************/

/***********************设置空闲***********************************************/
void set_idle(void)
{
#ifdef debug
 Prints("    设置空闲.\r\n");
#endif
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 idle=Control_Data.DeviceRequest.wValue;
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/**********************设置协议**************************************************/
void set_protocol(void)
{
#ifdef debug
 Prints("    设置协议.\r\n");
#endif
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 protocol=Control_Data.DeviceRequest.wValue;
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/**********************获取当前串口设置*****************************/
void GetLineCoding(void)
{
#ifdef debug
 Prints("    获取串口设置.\r\n");
#endif
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,7,(uint8 *)&LineCoding);
 usb_flags.flags.usb_endp0_in=0;
}
/*******************************************************************/

/**********************设置控制线状态******************************/
void SetControlLineState(void)
{
#ifdef debug
 Prints("    设置控制线状态.\r\n");
#endif
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 RTS=!((Control_Data.DeviceRequest.wValue)&0x2);
 DTR=!((Control_Data.DeviceRequest.wValue)&0x1);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0; 
}
/*******************************************************************/

/*******************************************************************/
void SetLineCoding(void)
{
#ifdef debug
 Prints("    设置串口属性.\r\n");
#endif
 while(select_endpoint(1)&0x01);   //等待端点1发送完毕
 write_endpoint_buff(1,0,0);       //返回0长度的状态包
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/*******************************************************************/

/*******************************************************************/
void SendBreak(void)
{
#ifdef debug
 Prints("     设置break time\r\n");
#endif
 
 if(Control_Data.DeviceRequest.wValue==0)
 {
  TXD=1;
 }
 if(Control_Data.DeviceRequest.wValue==0xFFFF)
 {
  TXD=0;
 }
 while(select_endpoint(1)&0x01);   //等待端点1发送完毕
 write_endpoint_buff(1,0,0);       //返回0长度的状态包
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0; 
}
/*******************************************************************/


#define DCD     P1_0
#define DSR     P1_1
#define CTS     P1_2
#define RING    P1_3
/*******************************************************************/
void SerialState(void)
{
 uint16 state;
 
#ifdef debug
 Prints("    获取串口状态.\r\n");
#endif

 state=0;
 if(DCD)
 {
  state|=0x01; 
 }
 if(DSR)
 {
  state|=0x02;
 }

⌨️ 快捷键说明

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