📄 usb.c
字号:
unsigned char i;
read_last_status(endp);
select_endpoint(endp);
write_usb_command(Write_Buffer);
write_a_usb_data(0);
write_a_usb_data(len);
for(i=0;i<len;i++)
{
Write_D12_DATA(*(buff+i));
D12_WR=0;
usb_delay();
D12_WR=1;
}
Write_D12_DATA(0XFF);
validate_buffer();
return len;
}
void disconnect_usb(void)
{
write_usb_command(0xf3);
write_a_usb_data(0x0e);
write_a_usb_data(0x47);
delay(100);
}
void connect_usb(void) //连接USB
{
write_usb_command(0xf3); //初始化USBD12
write_a_usb_data(0x1e); //连接USB
write_a_usb_data(0x47); //设置频率
}
void init_usb(void) //初始化USB
{
set_usb_addr(0);
set_endpoint_enable();
}
void usb_bus_reset(void) //USB总线复位处理
{
// code unsigned char Usb_Bus_Reset[]={"USB BUS RESET"};
// prints(Usb_Bus_Reset);
//usb_flags_Register=0;
set_endpoint_enable();
}
void usb_bus_suspend(void) //USB总线挂起处理
{
// code unsigned char Usb_Bus_Suspend[]={"USB BUS SUSPEND"};
// prints(Usb_Bus_Suspend);
// send_to_comport(10);
}
void set_usb_address(void) //设置地址
{
USB_set_addr=1;
while(select_endpoint(1)&0x01);
set_usb_addr(Control_Data.DeviceRequest.wValue);
write_endpoint_buff(1,0,0);
USB_usb_endp0_in=0;
USB_setup_packet_out=0;
}
void get_status(unsigned char receiver) //获取状态响应
{
unsigned char 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_usb_endp0_in=0;
}
void clear_feature(unsigned char receiver)
{
receiver=0;
write_endpoint_buff(1,0,0);
USB_usb_endp0_in=0;
USB_setup_packet_out=0;
}
void set_feature(unsigned char receiver)
{
receiver=0;
write_endpoint_buff(1,0,0);
USB_usb_endp0_in=0;
USB_setup_packet_out=0;
}
void set_descriptor(void)
{
USB_usb_endp0_in=0;
USB_setup_packet_out=0;
}
void set_configuration(void)
{
write_endpoint_buff(1,0,0);
USB_usb_endp0_in=0;
USB_setup_packet_out=0;
}
void get_configuration(void) //获取配置状态
{
unsigned char value=0x01;
write_endpoint_buff(1,1,&value);
USB_usb_endp0_in=0;
}
void set_interface(void) //设置接口
{
write_endpoint_buff(1,0,0);
USB_usb_endp0_in=0;
USB_setup_packet_out=0;
}
void get_interface(void) //获取接口状态
{
unsigned char value=0x01;
write_endpoint_buff(1,1,&value);
USB_usb_endp0_in=0;
}
void get_descriptor(void) //获取描述符
{
if(!USB_not_end)
{
switch(MSB(Control_Data.DeviceRequest.wValue))//yyyyy
{
case DEVICE_DESCRIPTOR:
Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
Control_Data.pData=(unsigned char *)(&device_descriptor);
break;
case CONFIGURATION_DESCRIPTOR:
Control_Data.wCount=con_int_endp_descriptor.wTotalLength;
Control_Data.pData=(unsigned char *)(&con_int_endp_descriptor);
break;
case STRING_DESCRIPTOR:
if(LSB(Control_Data.DeviceRequest.wValue)==0)//yyyyy
{
Control_Data.wCount=LANGUAGE_ID[0];
Control_Data.pData=(unsigned char *)LANGUAGE_ID;
}
if(LSB(Control_Data.DeviceRequest.wValue)==2)
{
Control_Data.wCount=device_serial_number[0];
Control_Data.pData=(unsigned char *)device_serial_number;
}
break;
case REPORT_DESCRIPTOR:
Control_Data.wCount=0x0022;
Control_Data.pData=(unsigned char *)(&report_descriptor);
break;
}
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
}
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_set_addr)USB_not_end=1;
else USB_usb_endp0_in=0;
return;
}
else
{
write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
USB_setup_packet_in=0;
USB_usb_endp0_in=0;
return;
}
}
void endp0_out(void) //终端点0输出中断处理
{
Flag1.Last_Status_Register=read_last_status(0);
if(Last_Status_setup_packet)
{
Control_Data.wLength=0;
Control_Data.wCount=0;
if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
{
set_endpoint_status(0,0);
set_endpoint_status(1,0);
return;
}
ack_setup(0);
ack_setup(1);
Control_Data.wLength=Control_Data.DeviceRequest.wLength;
USB_not_end=0;
USB_usb_endp0_in=1;
USB_setup_packet_in=0;
USB_setup_packet_out=0;
if(Control_Data.DeviceRequest.bmRequestType&0x80){USB_setup_packet_in=1;return;}
else {USB_setup_packet_out=1;return;}
}
else
{
select_endpoint(0);
clear_buffer();
}
}
void endp0_in(void) //终端点0输入处理
{
read_last_status(1);
if(USB_usb_endp0_in)
{
if(USB_setup_packet_in||USB_not_end)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x7B)
{
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;
}
case 1:
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(1);break;
case 6: get_descriptor();break;
case 10: get_interface();break;
default: break;
}
case 2:
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(2);break;
default: break;
}
default: break;
}
return;
}
if(USB_setup_packet_out)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x03)
{
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;
}
}
}
}
void endp2_out(void) //主端点输出处理
{
unsigned char EP2Status;
read_last_status(4);
EP2Status = read_endpoint_status(4);
if(EP2Status & 0x60)
read_endpoint_buff(4,64,buffer);
else
clear_buffer();
}
void endp2_in(void) //主端点输入处理
{
}
/******************************************************************************
**
** FunctionName: Main.c
**
** Description:
******************************************************************************/
main(void)
{
CLKDIV = 0;
PLLFBD = 30;
TRISB = 0xFFF8;
TRISC = 0xFFF9;
TRISG = 0xFDFF;
AD1PCFGL = 0xFFFF;
AD1PCFGH = 0x0003;
BUZZER = 1;
delay(100);
D12_CS = 0;
D12_SUSP = 0;
D12_WR = 1;
D12_RD = 1;
libuart2Init();
disconnect_usb();
init_usb();
connect_usb();
read_interrupt_register();
/*
write_usb_command(Read_VID); // 读芯片ID
U2_TX_B(read_a_usb_data()); // 12
U2_TX_B(read_a_usb_data()); // 10
*/
while(1)
{
if(!D12_INT)
{
read_interrupt_register();
if(Interrupt_control_out_port){endp0_out();continue;}
if(Interrupt_control_in_port){endp0_in();continue;}
if(Interrupt_main_out_port){endp2_out();continue;}
if(Interrupt_main_in_port&&USB_usb_endp2_in){endp2_in();continue;}
if(Interrupt_bus_reset){usb_bus_reset();continue;}
if(Interrupt_suspend_change){usb_bus_suspend();continue;}
}
}
}
/*-----------------------------------------------------------------------------
END OF FILE: Usb.c
-----------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -