u16 rcv_num; u8 read_cnt; u8 i;
u16 temp; u8 j = 0;
//接收到的数据
rcv_num = USB_CNT0_RX & 0x03FF; //{
// unsigned char s[32] = {0};
// sprintf((char*)s, \端点0读取【%d】字节数据:\ // USART_send_str(s); //} //USART_send_str(\ //读取次数 read_cnt = (rcv_num+1)>>1; for(i=0;i //读取端点1收到的数据 u8 USB_read_EP1_buf(u8 *buf, u32 *USB_buf) { u16 rcv_num; u8 read_cnt; u8 i; u16 temp; u8 j = 0; //接收到的数据 rcv_num = USB_CNT1_RX & 0x03FF; { } unsigned char s[32] = {0}; sprintf((char*)s, \【端点1】读取【%d】字节数据:\USART_send_str(s); USART_send_str(\ //读取次数 read_cnt = (rcv_num+1)>>1; for(i=0;i //通过端点0发送数据 void USB_write_EP0_buf(u8 *buf, u32 *USB_buf, u8 len) { u8 send_cnt; u8 i; u8 j = 0; u16 h,l; // { // unsigned char s[32] = {0}; // sprintf((char*)s, \端点0发送【%d】字节数据:\// USART_send_str(s); // } // // USART_send_str(\+++++++\\r\\n\ // for(i=0;i //发送次数 send_cnt = (len+1) >> 1; for(i=0;i //要发送数据的长度 USB_CNT0_TX = len; //使能发送:设置VALID { u16 t = EP0REG; t &= 0x8F8F;//1000 1111 1000 1111 把 t位都设置为0 t |= 0x8080;//1000 0000 1000 0000 把w0位都设置为1 switch(EP0REG & 0x0030) { case 0x0000: t |= 0x0030;break; case 0x0010: t |= 0x0020;break; case 0x0020: t |= 0x0010;break; case 0x0030: t |= 0x0000;break; } EP0REG = t; } } //通过端点1发送数据 void USB_write_EP1_buf(u8 *buf, u32 *USB_buf, u8 len) { u8 send_cnt; u8 i; u8 j = 0; u16 h,l; { unsigned char s[32] = {0}; sprintf((char*)s, \端点1发送【%d】字节数据:\ USART_send_str(s); } USART_send_str(\+++++++\\r\\n\ for(i=0;i } USART_send_str(\+++++++\\r\\n\\r\\n\ //发送次数 send_cnt = (len+1) >> 1; for(i=0;i //发送数据给主机,提供端点0 void USB_ep0_send(void) { if(send_len_ep0 > dev_d[7])//如果需要发送数据长度大于端点0的最大长度:分包发送 { USB_write_EP0_buf(p_send_ep0, ((u32*)(PMAAddr+32*2)), dev_d[7]); send_len_ep0 -= dev_d[7]; p_send_ep0 += dev_d[7]; } else//需要发送的数据长度小于等于端点0的最大包长 { if(send_len_ep0 != 0)//一次能够发送完成 { USB_write_EP0_buf(p_send_ep0, ((u32*)(PMAAddr+32*2)), send_len_ep0); send_len_ep0 = 0; } else//等于0 { if(need_0_pack_ep0 == 1) { need_0_pack_ep0 =0; USB_write_EP0_buf(p_send_ep0, ((u32*)(PMAAddr+32*2)), 0); } } } } //端点0枚举过程处理 void ep0_setup_Process(void) { //读取接收到的数据 USB_read_EP0_buf(USB_rcv_buffer, (u32*)(PMAAddr+96*2)); req_type = USB_rcv_buffer[0]; req = USB_rcv_buffer[1]; w_value = (USB_rcv_buffer[3]<<8) | USB_rcv_buffer[2]; w_index = (USB_rcv_buffer[5]<<8) | USB_rcv_buffer[4]; w_length = (USB_rcv_buffer[7]<<8) | USB_rcv_buffer[6]; if(req_type & 0x80)//输入请求 { switch((req_type>>5) & 0x03)//请求的类型 { case 0://标准请求.省略了对“请求的接收者”的判断 { //USART_send_str(\标准输入请求:\switch(req)//标准请求代码 { case 0://获取状态 { //USART_send_str(\获取状态\\r\\n\} break; case 6://获取描述符 { //USART_send_str(\获取描述符——\ switch((w_value>>8) & 0xFF)//描述符类型 { case 1://设备描述符 { //USART_send_str(\设备描述符\\r\\n\p_send_ep0 = (u8*)dev_d;//设备描述符数组 if(w_length > dev_d[0])//如果请求的数据大于描述符长度,返回描述符长度最大长度 { send_len_ep0 = dev_d[0];//18 if((send_len_ep0 % dev_d[7]) == 0) { need_0_pack_ep0 = 1;//是包长的整数倍,需要发送0长度数据包 } } else//请求长度小于等于描述符长度,则返回请求长度 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库STM32-USB使用方法(2)在线全文阅读。
相关推荐: