程序功能
- 将STM32的USB枚举为HID设备。
- STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
- 端点长度为64,也就是单次最多可以传输64个字节数据。
- STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
- 上位机程序通过调用windows的API实现对HID设备的读写控制。
USB接口原理图:
<ignore_js_op>
HID枚举成功:
<ignore_js_op>
程序效果图
<ignore_js_op>
图一
上位机程序运行图
<ignore_js_op>
图二 STM32串口打印输出
<ignore_js_op>
图三
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程序下载: <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
STM32例程之USB HID双向数据传输(源码下载)【转】,布布扣,bubuko.com
STM32例程之USB HID双向数据传输(源码下载)【转】
原文:http://www.cnblogs.com/flyheart33/p/3610866.html