zoukankan      html  css  js  c++  java
  • STM32例程之USB HID双向数据传输(源码下载)【转】

    程序功能


    • 将STM32的USB枚举为HID设备。
    • STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
    • 端点长度为64,也就是单次最多可以传输64个字节数据。
    • STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
    • 上位机程序通过调用windows的API实现对HID设备的读写控制。

    USB接口原理图:
    <ignore_js_op>USB.jpg 
    HID枚举成功:
    <ignore_js_op>1.jpg 
    程序效果图

    <ignore_js_op>1.jpg 
    图一 上位机程序运行图
    <ignore_js_op>2.jpg 
    图二  STM32串口打印输出
    <ignore_js_op>3.jpg 
    图三 Bus Hound抓取的数据
    程序部分代码
    STM32的报告描述符:

    1. const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = 
    2.         0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 
    3.         0x09, 0x01, /* USAGE (Demo Kit) */ 
    4.         0xa1, 0x01, /* COLLECTION (Application) */ 
    5.         
    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 ");
    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("开始写数据到设备... ");
    21.         // 写入数据到设备,注意,第三个参数值必须为REPORT_COUNT+1,否则会返回1784错误
    22.         if (!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){           
    23.                 printf("write data error! %d ",GetLastError());
    24.                 return;    
    25.         }else{
    26.                 printf("成功向设备写出%d个数据... ",bytes);
    27.         }
    28.         printf("开始从设备读取数据... ");
    29.         // 从设备读取数据,注意,第三个参数值必须大于等于REPORT_COUNT+1,否则会返回1784错误
    30.         if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 读取设备发给主机的数据  
    31.                 printf("read data error! %d ",GetLastError());
    32.                 return;    
    33.         }else{
    34.                 printf("成功向设备读出%d个数据... ",bytes);
    35.         }
    36.         printf("设备返回的数据为: ");
    37.         //显示读取回来的数据
    38.         for(int i=0;i<REPORT_COUNT;i++){
    39.                 printf("0x%02X ",recvDataBuf[i+1]);
    40.         }
    41.         printf(" ");
    42. }  
    复制代码

    源码下载
    STM32程序下载: <ignore_js_op> stm32_usb_hid.zip 
    STM32F105/107版本源码下载: <ignore_js_op> usb_hid.rar 
    HID上位机程序下载(VS2010): <ignore_js_op> STM32_HID_PC_Driver.zip
    HID上位机程序下载(VS2008): <ignore_js_op> PC_HID.zip ) 

    USB开发相关资料下载
    <ignore_js_op> USB2.0技术规范(中文).pdf
    <ignore_js_op> Windows主机端与自定义USB_HID设备通信详解.pdf 
    <ignore_js_op> STM32F10xxx USB-FS-Device firmware library.pdf 
    <ignore_js_op> STM32F10xxx USB开发工具包.pdf 
    <ignore_js_op> STM32_USB-FS-Device_Lib_V3.0.1.zip 
    <ignore_js_op> STM32_usb固件库.pdf 
    <ignore_js_op> 基于STM32的USB程序开发笔记.pdf 
    <ignore_js_op> 深入解析STM32_USB-FS-Device_Lib库.pdf 

    出处:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=199&extra=&page=1

  • 相关阅读:
    Java 实现 蓝桥杯 生兔子问题
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    深入探究VC —— 资源编译器rc.exe(3)
    深入探究VC —— 编译器cl.exe(2)
    深入探究VC —— 编译器cl.exe(1)
  • 原文地址:https://www.cnblogs.com/flyheart33/p/3610866.html
Copyright © 2011-2022 走看看