您的位置:首页 > 其它

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

2014-12-15 20:26 393 查看
http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=199

程序功能

将STM32的USB枚举为HID设备。

STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。

端点长度为64,也就是单次最多可以传输64个字节数据。

STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。

上位机程序通过调用windows的API实现对HID设备的读写控制。

USB接口原理图:


 

HID枚举成功:


 

程序效果图


 
图一 上位机程序运行图


 
图二  STM32串口打印输出


 
图三 Bus Hound抓取的数据
程序部分代码
STM32的报告描述符:

const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = 



        0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 

        0x09, 0x01, /* USAGE (Demo Kit) */ 

        0xa1, 0x01, /* COLLECTION (Application) */ 

        

        // The Input report 

        0x09,0x03, // USAGE ID - Vendor defined 

        0x15,0x00, // LOGICAL_MINIMUM (0) 

        0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 

        0x75,0x08, // REPORT_SIZE (8bit) 

        0x95,0x40, // REPORT_COUNT (64Byte) 

        0x81,0x02, // INPUT (Data,Var,Abs) 

        // The Output report 

        0x09,0x04, // USAGE ID - Vendor defined 

        0x15,0x00, // LOGICAL_MINIMUM (0) 

        0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 

        0x75,0x08, // REPORT_SIZE (8bit) 

        0x95,0x40, // REPORT_COUNT (64Byte) 

        0x91,0x02, // OUTPUT (Data,Var,Abs) 

        0xc0 /* END_COLLECTION */ 

}; /* CustomHID_ReportDescriptor */

复制代码
上位机测试程序

/**

  * @brief  发送数据后读取数据 

  * @param  None

  * @retval None

  */

void HIDSampleFunc(void)   

{       

        HANDLE       hDev;       

        BYTE         recvDataBuf[1024],reportBuf[1024];;                   

        DWORD        bytes;       

        hDev = OpenMyHIDDevice(0); // 打开设备,不使用重叠(异步)方式 ;      

        if (hDev == INVALID_HANDLE_VALUE){           

                printf("INVALID_HANDLE_VALUE\n");

                return;  

        }

        reportBuf[0] = 0; // 输出报告的报告 ID 是 0      

        for(int i=0;i<REPORT_COUNT;i++){

                reportBuf[i+1]=i+1;//将数据存放在数据缓冲区

        }

        printf("开始写数据到设备...\n");

        // 写入数据到设备,注意,第三个参数值必须为REPORT_COUNT+1,否则会返回1784错误

        if (!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){           

                printf("write data error! %d\n",GetLastError());

                return;    

        }else{

                printf("成功向设备写出%d个数据... \n",bytes);

        }

        printf("开始从设备读取数据...\n");

        // 从设备读取数据,注意,第三个参数值必须大于等于REPORT_COUNT+1,否则会返回1784错误

        if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 读取设备发给主机的数据  

                printf("read data error! %d\n",GetLastError());

                return;    

        }else{

                printf("成功向设备读出%d个数据... \n",bytes);

        }

        printf("设备返回的数据为:\n");

        //显示读取回来的数据

        for(int i=0;i<REPORT_COUNT;i++){

                printf("0x%02X ",recvDataBuf[i+1]);

        }

        printf("\n\r");

}  

复制代码
源码下载
STM32程序下载: 

 stm32_usb_hid.zip (2.62
MB, 下载次数: 7570) 
STM32F105/107版本源码下载: 

 usb_hid.rar (2.16
MB, 下载次数: 6020) 
HID上位机程序下载(VS2010): 

 STM32_HID_PC_Driver.zip (259.02
KB, 下载次数: 3306) 
HID上位机程序下载(VS2008): 

 PC_HID.zip (133.6
KB, 下载次数: 2739) 

USB开发相关资料下载


 USB2.0技术规范(中文).pdf (2.59
MB, 下载次数: 3678) 


 Windows主机端与自定义USB_HID设备通信详解.pdf (259.12
KB, 下载次数: 2467) 


 STM32F10xxx
USB-FS-Device firmware library.pdf (1.27 MB, 下载次数: 3044) 


 STM32F10xxx
USB开发工具包.pdf (978.66 KB, 下载次数: 3047) 


 STM32_USB-FS-Device_Lib_V3.0.1.zip (822.59
KB, 下载次数: 2557) 


 STM32_usb固件库.pdf (978.66
KB, 下载次数: 2908) 


 基于STM32的USB程序开发笔记.pdf (2.42
MB, 下载次数: 3881) 


 深入解析STM32_USB-FS-Device_Lib库.pdf (697.35
KB, 下载次数: 2515) 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: