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

📄 usb2uart.c

📁 通过c语言实现将USB接口转换成串行接口
💻 C
📖 第 1 页 / 共 4 页
字号:
{
 write_usb_command(0x80+endp);
 return read_a_usb_data();
}
/******************************************************************************/

/************************清缓冲,在读取缓冲数据后调用**************************/
void clear_buffer(void)
{
 write_usb_command(Clear_Buffer);
#ifdef debug
 Prints("Clear buffer.\r\n");
#endif
}
/******************************************************************************/

/***********************缓冲区数据有效,在写缓冲后调用**************************/
void validate_buffer(void)
{
 write_usb_command(Validate_Buffer);
#ifdef debug
 Prints("Validate buffer.\r\n");
#endif
}
/******************************************************************************/

/***************************应答建立包************************************/
void ack_setup(uint8 endp)
{
 select_endpoint(endp);
 write_usb_command(Ack_Setup);
#ifdef debug
 Prints("Ack setup ");
 PrintLongInt(endp);
 Prints(".\r\n");
#endif
}
/******************************************************************************/

//#define debug2
/***********************出错处理******************************************/
void error(uint8 number)
{
#ifdef debug2
 Prints("有错误发生!!!\r\n错误号: ");
 PrintHex(number);
#endif
 number=0;
}
/******************************************************************************/

/*************************读终端点缓冲****************************************/
uint8 read_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
 uint8 i,j;
 
 if(!(select_endpoint(endp)&0x01)){error(0); return 0;}
 if((read_endpoint_status(endp)&0x60)!=0x60)  //两个缓冲没有都满,才能清中断
 {
  read_last_status(endp);  //清中断
 }
 write_usb_command(Read_Buffer);
 read_a_usb_data();
 j=read_a_usb_data();
 if(j>len)
  j=len;  
#ifdef debug
 Prints("Read endpoint");
 PrintLongInt(endp);
 Prints("\'s buffer ");
 PrintLongInt(j);
 Prints(" bytes.\r\n");
#endif  
 for(i=0;i<j;i++)
  {
   USB_RD=0;
   *(buff+i)=USB_DATA;
   USB_RD=1;
#ifdef debug
   PrintHex(*(buff+i));
#endif
  }
#ifdef debug
 Prints("\r\n");
#endif
 if(endp)
 {
  select_endpoint(endp);
  clear_buffer();
 }
 return j;
}
/******************************************************************************/

/*************************写终端点缓冲*****************************************/
uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
 uint8 i;
 read_last_status(endp);
 select_endpoint(endp);
 write_usb_command(Write_Buffer);
 write_a_usb_data(0);
 write_a_usb_data(len);
#ifdef debug
 Prints("Write endpoint");
 PrintLongInt(endp);
 Prints("\'s buffer ");
 PrintLongInt(len);
 Prints(" bytes.\r\n");
#endif
 for(i=0;i<len;i++)
  {
   USB_DATA=*(buff+i);
   USB_WR=0;
   USB_WR=1;
#ifdef debug
   PrintHex(*(buff+i));
#endif
  }
#ifdef debug
 Prints("\r\n");
#endif  
 USB_DATA=0xFF;
 validate_buffer();
 return len;
}
/******************************************************************************/

/***************************断开USB连接****************************************/
void disconnect_usb(void)
{
#ifdef debug
 Prints("断开USB连接.\r\n");
#endif
 write_usb_command(0xf3);
 write_a_usb_data(0x0e);
 write_a_usb_data(0x47);
 delay(100);
}
/******************************************************************************/

/*******************************连接USB**************************************/
void connect_usb(void)
{
#ifdef debug
 Prints("连接USB.\r\n");
#endif
 write_usb_command(0xf3);                         //初始化USBD12
 write_a_usb_data(0x1e);                          //连接USB
 write_a_usb_data(0x47);                          //设置频率
}
/******************************************************************************/

/***************************初始化USB***************************************************/
void init_usb(void)               
{
#ifdef debug
 Prints("USBD12芯片初始化\r\n");
#endif
 set_usb_addr(0);
 set_endpoint_enable();
}
/******************************************************************************/

/****************************USB总线复位处理***********************************/
void usb_bus_reset(void)
{
#ifdef debug
 Prints("USB总线复位.\r\n");
#endif
 usb_flags.Register=0;
 set_endpoint_enable();
}
/******************************************************************************/

/*****************************USB总线挂起处理**********************************/
void usb_bus_suspend(void)
{
#ifdef debug
 Prints("USB总线挂起.\r\n");
#endif
}
/******************************************************************************/

/***************************设置地址***************************************/
void set_usb_address(void)
{
 usb_flags.flags.set_addr=1;
 set_usb_addr(Control_Data.DeviceRequest.wValue);
 while(select_endpoint(1)&0x01);
 write_endpoint_buff(1,0,0);
 while(select_endpoint(1)&0x01);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/**************************获取状态响应*****************************************/
void get_status(uint8 receiver)
{
 uint8 status[2];
 switch (receiver)
  {
   case 0:                        //获取设备状态
    status[0]=0x00;
    status[1]=0x00;
    break;
   case 1:                        //获取接口状态
    status[0]=0x00;
    status[0]=0x00;
    break;
   case 2:                        //获取端点状态
    status[0]=0x00;
    status[1]=0x00;
    break;
   }
  write_endpoint_buff(1,2,status);
  usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/*********************清除特性*******************************************/
void clear_feature(uint8 receiver)    
{
#ifdef debug
 Prints("    清除特性.\r\n");
#endif
 receiver=0;
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/*******************设置特性**************************************************/
void set_feature(uint8 receiver)
{
#ifdef debug
 Prints("    设置特性.\r\n");
#endif
 receiver=0;
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/*****************************设置描述*****************************************/
void set_descriptor(void)
{
#ifdef debug
 Prints("    设置描述符.\r\n");
#endif
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/***************************设置配置*******************************************/
void set_configuration(void)
{
#ifdef debug
 Prints("    设置配置.\r\n");
#endif
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/************************获取配置状态******************************************/
void get_configuration(void)
{ 
 uint8 value=0x01;
#ifdef debug
 Prints("    获取配置.\r\n");
#endif
 write_endpoint_buff(1,1,&value);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/****************************设置接口************************************/
void set_interface(void)
{
#ifdef debug
 Prints("    设置接口.\r\n");
#endif
 write_endpoint_buff(1,0,0);
 usb_flags.flags.usb_endp0_in=0;
 usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

/***************************获取接口状态***************************************/
void get_interface(void)
{
 uint8 value=0x01;
#ifdef debug
 Prints("    获取接口.\r\n");
#endif
 write_endpoint_buff(1,1,&value);
 usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/

/***********************获取描述符*********************************************/
void get_descriptor(void)
{
#ifdef debug
 Prints("    获取描述符.\r\n");
#endif
  if(!usb_flags.flags.not_end)
     {
      switch(MSB(Control_Data.DeviceRequest.wValue))
	   {
        case DEVICE_DESCRIPTOR:
		    #ifdef debug
		     Prints("        获取设备描述符.\r\n");
			#endif
	         Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
 	         Control_Data.pData=(uint8 *)(&device_descriptor);
             break;
        case CONFIGURATION_DESCRIPTOR:
		    #ifdef debug
			 Prints("        获取配置描述符.\r\n");
			#endif
             Control_Data.wCount=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
			 Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
             if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
             break;
		case STRING_DESCRIPTOR:
		    #ifdef debug
		     Prints("        获取字符串描述符.\r\n");
			#endif
			 switch(LSB(Control_Data.DeviceRequest.wValue))
			  {
			   case 0:
			   #ifdef debug
			    Prints("            获取语言ID.\r\n");
			   #endif
			    Control_Data.wCount=LANGUAGE_ID[0];
                Control_Data.pData=LANGUAGE_ID;
   			    break;

			   case 1:
			   #ifdef debug
			    Prints("            获取厂商字符串.\r\n");
			   #endif
			    Control_Data.wCount=ManufacturerString[0];
                Control_Data.pData=ManufacturerString;
			    break;

			   case 2:
			   #ifdef debug
			    Prints("            获取产品字符串.\r\n");
			   #endif
			    Control_Data.wCount=ProducterString[0];
                Control_Data.pData=ProducterString;
			    break;

			   case 3:
			   #ifdef debug
                 Prints("            获取设备序列号.\r\n");
			   #endif
			     Control_Data.wCount=device_serial_number[0];
			     Control_Data.pData=device_serial_number;
			   break;

			   default:
                 Prints("            其它描述符(未知),描述符编码:");
				 PrintHex(MSB(Control_Data.DeviceRequest.wValue));
				 Prints("\r\n");
                 DispLineInf();
               break;
			  }
			 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;
	 }      
}
/******************************************************************************/

/*********************发到接口的获取描述符**************************************/
void get_descriptor_interface(void)
{
#ifdef debug
 Prints("    获取描述符(从接口).\r\n");
#endif

⌨️ 快捷键说明

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