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小时内删除。
发表评论