STM32例程之USB HID双向数据传输(转)

程序功能

  • 将STM32的USB枚举为HID设备。
  • STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
  • 端点长度为64,也就是单次最多可以传输64个字节数据。
  • STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
  • 上位机程序通过调用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.         // The Input report
  7.         0x09,0x03, // USAGE ID - Vendor defined
  8.         0x15,0x00, // LOGICAL_MINIMUM (0)
  9.         0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
  10.         0x75,0x08, // REPORT_SIZE (8bit)
  11.         0x95,0x40, // REPORT_COUNT (64Byte)
  12.         0x81,0x02, // INPUT (Data,Var,Abs)
  13.         // The Output report
  14.         0x09,0x04, // USAGE ID - Vendor defined
  15.         0x15,0x00, // LOGICAL_MINIMUM (0)
  16.         0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
  17.         0x75,0x08, // REPORT_SIZE (8bit)
  18.         0x95,0x40, // REPORT_COUNT (64Byte)
  19.         0x91,0x02, // OUTPUT (Data,Var,Abs)
  20.         0xc0 /* END_COLLECTION */
  21. }; /* 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");

复制代码

源码下载
STM32程序下载: stm32_usb_hid.zip (2.62 MB, 下载次数: 8170)
STM32F105/107版本源码下载: usb_hid.rar (2.16 MB, 下载次数: 6402)
HID上位机程序下载(VS2010): STM32_HID_PC_Driver.zip (259.02 KB, 下载次数: 3603)
HID上位机程序下载(VS2008): PC_HID.zip (133.6 KB, 下载次数: 3010)
USB开发相关资料下载
USB2.0技术规范(中文).pdf (2.59 MB, 下载次数: 3935)
Windows主机端与自定义USB_HID设备通信详解.pdf (259.12 KB, 下载次数: 2701)
STM32F10xxx USB-FS-Device firmware library.pdf (1.27 MB, 下载次数: 3290)
STM32F10xxx USB开发工具包.pdf (978.66 KB, 下载次数: 3281)
STM32_USB-FS-Device_Lib_V3.0.1.zip (822.59 KB, 下载次数: 2756)
STM32_usb固件库.pdf (978.66 KB, 下载次数: 3145)
基于STM32的USB程序开发笔记.pdf (2.42 MB, 下载次数: 4286)
深入解析STM32_USB-FS-Device_Lib库.pdf (697.35 KB, 下载次数: 2775)

你可能感兴趣的:(STM32例程之USB HID双向数据传输(转))