STM32例程之USB HID双向数据传输(源码下载) 
1.将STM32的USB枚举为HID设备。
2.STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
3.端点长度为64,也就是单次最多可以传输64个字节数据。
4.STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
5.上位机程序通过调用windows的API实现对HID设备的读写控制。
USB接口原理图:
 
HID枚举成功:
 
程序效果图
 
图一 上位机程序运行图
 
图二  STM32串口打印输出
 
图三 Bus Hound抓取的数据
程序部分代码
STM32的报告描述符:
1.const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = 
2.{ 
3.        0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 
4.        0x09, 0x01, /* USAGE (Demo Kit) */ 
5.        0xa1, 0x01, /* COLLECTION (Application) */ 
6.       
7.        // The Input report 
8.        0x09,0x03, // USAGE ID - Vendor defined 
9.        0x15,0x00, // LOGICAL_MINIMUM (0) 
10.        0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 
11.        0x75,0x08, // REPORT_SIZE (8bit) 
12.        0x95,0x40, // REPORT_COUNT (64Byte) 
13.        0x81,0x02, // INPUT (Data,Var,Abs) 
14.
15.        // The Output report 
16.        0x09,0x04, // USAGE ID - Vendor defined 
17.        0x15,0x00, // LOGICAL_MINIMUM (0) 
18.        0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 
19.        0x75,0x08, // REPORT_SIZE (8bit) 
20.        0x95,0x40, // REPORT_COUNT (64Byte) 
21.        0x91,0x02, // OUTPUT (Data,Var,Abs) 
22.
23.        0xc0 /* END_COLLECTION */ 
24.}; /* CustomHID_ReportDescriptor */
复制代码
上位机测试程序
1./**
2.  * @brief  发送数据后读取数据 
3.  * @param  None
4.  * @retval None
5.  */
6.void HIDSampleFunc(void)   
7.{       
8.        HANDLE      hDev;       
9.        BYTE         recvDataBuf[1024],reportBuf[1024];;                   
10.        DWORD        bytes;       
11.        hDev = OpenMyHIDDevice(0); // 打开设备,不使用重叠(异步)方式 ;     
12.        if (hDev == INVALID_HANDLE_VALUE){           
13.                printf("INVALID_HANDLE_VALUE\n");
14.                return; 
15.        }
16.        reportBuf[0] = 0; // 输出报告的报告 ID 是 0     
17.        for(int i=0;i<REPORT_COUNT;i++){
18.                reportBuf[i+1]=i+1;//将数据存放在数据缓冲区
19.        }
20.        printf("开始写数据到设备...\n");
21.        // 写入数据到设备,注意,第三个参数值必须为REPORT_COUNT+1,否则会返回1784错误
22.        if (!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){           
23.                printf("write data error! %d\n",GetLastError());
24.                return;    
25.        }else{
26.                printf("成功向设备写出%d个数据... \n",bytes);
27.        }
28.        printf("开始从设备读取数据...\n");
29.        // 从设备读取数据,注意,第三个参数值必须大于等于REPORT_COUNT+1,否则会返回1784错误
30.        if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 读取设备发给主机的数据 
31.                printf("read data error! %d\n",GetLastError());
32.                return;    
33.        }else{
34.                printf("成功向设备读出%d个数据... \n",bytes);
35.        }
36.        printf("设备返回的数据为:\n");
37.        //显示读取回来的数据
38.        for(int i=0;i<REPORT_COUNT;i++){
39.                printf("0x%02X ",recvDataBuf[i+1]);
40.        }
41.        printf("\n\r");
42.
复制代码
源码下载
STM32程序下载:  stm32_usb_hid.zip (2.62 MB, 下载次数: 6366) 
STM32F105/107版本源码下载:  usb_hid.rar (2.16 MB, 下载次数: 5175) 
HID上位机程序下载(VS2010):  STM32_HID_PC_Driver.zip (259.02 KB, 下载次数: 2590) 
HID上位机程序下载(VS2008):stm32怎么使用printf  PC_HID.zip (133.6 KB, 下载次数: 1924) 
USB开发相关资料下载
 USB2.0技术规范(中文).pdf (2.59 MB, 下载次数: 2991) 
 Windows主机端与自定义USB_HID设备通信详解.pdf (259.12 KB, 下载次数: 1934) 
 STM32F10xxx USB-FS-Device firmware library.pdf (1.27 MB, 下载次数: 2412) 
 STM32F10xxx USB开发工具包.pdf (978.66 KB, 下载次数: 2588) 
 STM32_USB-FS-Device_Lib_V3.0.1.zip (822.59 KB, 下载次数: 2068) 
 STM32_usb固件库.pdf (978.66 KB, 下载次数: 2457) 
 基于STM32的USB程序开发笔记.pdf (2.42 MB, 下载次数: 3155) 
 深入解析STM32_USB-FS-Device_Lib库.pdf (697.35 KB, 下载次数: 1958) 
 描述符在文件usb_desc.c中。第一个要改的是设备描述符。设备描述符的结构都标准的,长度也是固定的。范例中的USB设备描述符如下:
/* USB Standard Device Descriptor */
const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC]=
{
 0x12,                      /*bLength */
 USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
 0x00,                      /*bcdUSB */
 0x02,
 0x00,                      /*bDeviceClass*/
 0x00,                      /*bDeviceSubClass*/
 0x00,                      /*bDeviceProtocol*/
 0x40,                      /*bMaxPacketSize40*/
 0x83,                      /*idVendor (0x0483)*/
 0x04,
 0x10,                      /*idProduct = 0x5710*/
 0x57,
 0x00,                      /*bcdDevice rel. 2.00*/
 0x02,
 1,  /*Index of string descriptor describing
                            manufacturer */
 2,  /*Index of string descriptor describing
                          product*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。