{ }
send_len_ep0 = w_length;
USB_ep0_send(); }
break;
case 2://配置描述符 { //USART_send_str(\配置描述符\\r\\n\
p_send_ep0 = (u8*)cfg_d;//设备描述符数组
send_len_ep0 = (cfg_d[3]<<8) | cfg_d[2];//发送长度等于配置集合长度
if(w_length > send_len_ep0)//如果请求的数据大于端点0,返回端点0最大长度 { if((send_len_ep0 % dev_d[7]) == 0) { need_0_pack_ep0 = 1;//是包长的整数倍,需要发送0长度数据包 } }
else//请求小于等于端点0,返回请求长度 { send_len_ep0 = w_length; }
USB_ep0_send(); }
break;
case 3://字符串描述符 { //USART_send_str(\字符串描述符\\r\\n\}
break;
case 0x22://报告描述符 { //USART_send_str(\报告描述符\\r\\n\
p_send_ep0 = (u8*)rpt_d; send_len_ep0 = sizeof(rpt_d);
if(w_length > send_len_ep0)//如果请求的长度大于实际长度 { if((send_len_ep0 % dev_d[7]) == 0) {
need_0_pack_ep0 = 1;//是包长的整数倍,需要发送0长度数据包 } } else { send_len_ep0 = w_length;//返回长度等于请求长度 }
USB_ep0_send();
// // //
}
break;
default://其他描述符 { USART_send_str(\其他描述符:\ USART_send_HEX((w_value>>8)&0xFF); USART_send_str(\ } break; } }
break;
case 8://获取配置 {
//USART_send_str(\获取配置\\r\\n\}
break;
case 10://获取接口 { //USART_send_str(\获取接口\\r\\n\}
break;
case 12://帧同步 {
//USART_send_str(\帧同步\\r\\n\}
break;
default: { //USART_send_str(\未定义输入请求\\r\\n\}
break;
} } break;
case 1://类请求 { //USART_send_str(\类输入请求\\r\\n\}
break;
case 2://厂商请求 {
//USART_send_str(\厂商输入请求\\r\\n\}
break;
case 3://保留 { //USART_send_str(\输入请求:保留\\r\\n\}
break; } }
else/*********************************输出请求*********************************/ { switch((req_type>>5) & 0x03)//请求的类型 { case 0://标准请求.省略了对“请求的接收者”的判断 { //USART_send_str(\标准输出请求:\
switch(req)//标准请求代码【GET】 { case 1://清除特性 { //USART_send_str(\清除特性\\r\\n\
send_len_ep0 = 0; need_0_pack_ep0 = 1;
USB_ep0_send();//发送数据 }
break;
case 5://设置地址 {
USART_send_str(\设置地址\\r\\n\//USART_send_HEX(w_value&0xFF); //USART_send_str(\
usb_status = 1;//表示主机设置了地址 usb_addr = w_value & 0xFF; send_len_ep0 = 0; need_0_pack_ep0 = 1;
USB_ep0_send();//发送数据 }
break;
case 9://设置配置 { USART_send_str(\设置配置\\r\\n\
//设置RX Valid .【端点1】可用于接收 { u16 t = EP1REG; t &= 0x8F8F;//1000 1111 1000 1111 把 t位都设置为0 t |= 0x8080;//1000 0000 1000 0000 把w0位都设置为1 t |= 0x3000;//0011 0000 0000 0000 把 SRAT_RX[1:0]设置为1 EP1REG = t; }
send_len_ep0 = 0; need_0_pack_ep0 = 1;
USB_ep0_send();//发送剩余数据 usb_status = 3;
}
break;
case 7://设置描述符 { //USART_send_str(\设置描述符\\r\\n\}
break;
case 3://设置特性 {
//USART_send_str(\设置特性\\r\\n\}
break;
case 11://设置接口 { //USART_send_str(\设置接口\\r\\n\}
break;
default://出错 { //USART_send_str(\标准输出请求代码出错\\r\\n\}
break;
} }
break;
case 1://类请求 { //USART_send_str(\类输出请求:\
switch(req) { case 0x0A: { USART_send_str(\设置空闲\\r\\n\
send_len_ep0 = 0; need_0_pack_ep0 = 1;
USB_ep0_send();//发送剩余数据 }
break;
default: { #ifdef HEEY_DEBUG //UART_send_str(\未知请求\\r\\n\ #endif }
break;
} }
break;
}
}
}
case 2://厂商请求 { //USART_send_str(\厂商输出请求\\r\\n\}
break;
case 3://保留 { //USART_send_str(\输出请求:保留\\r\\n\}
break;
//描述符的话用数组实现的这里就不给出来。
源程序的kile 4 - arm写的,可以向我要。奋斗STM32迷你板应该下载后可以直接使用。
上位机软件使用vb。
一下是枚举过程 USB断开 USB连接 【U】【S】【B】【复】【位】【中】【断】 【U】【S】【B】【复】【位】【中】【断】 端点0【SETUP】分组接收完成 端点0读取【8】字节数据:
-------------------------------------------------------------------------------- 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00
--------------------------------------------------------------------------------
USB标准输入请求:获取描述符——设备描述符 端点0发送【18】字节数据:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x40 0xAA 0xAA 0x02 0x00 0x00 0x01 0x00 0x00 0x00 0x01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0x62 0x60 tx=2 tx2=3 rx=2 rx2=3
****************端点0的IN分组发送完成**************** rx=0 rx2=0
端点0的【OUT】分组接收完成 端点0读取【0】字节数据:
--------------------------------------------------------------------------------
-------------------------------------------------------------------------------- rx=0