历史上的今天
今天是:2024年09月20日(星期五)
2018年09月20日 | STM32例程之USB HID双向数据传输
2018-09-20 来源:eefocus
程序功能
将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 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 printf("0x%02X ",recvDataBuf[i+1]); } printf("\n\r"); }
史海拾趣
|
血红蛋白是血细胞的重要组成部分,它负责将氧气从肺部输送到身体的其它组织。血红蛋白在任一时刻所含的氧气量被称为血氧饱和度(即SpO2)。 血氧饱和度是反映人体呼吸功能及氧含量是否正常的重要生理参数,它是显示我们人体各组织是否健康的一个重要 ...… 查看全部问答> |
|
各位大侠好。。小弟是新手。。想问一下用1602还有一块51单片机做一个电子钟。。都要用到什么东西。。望能详细点解答。。最好能细到连电子元器件都说明。。而且最好能有个大概的制作步骤。。。小弟在此谢过了。。… 查看全部问答> |
|
wince的flash保存的文件的内容被改变了,或者是丢失了 系统在启动以后,通过同步工具拷贝一个配置文件给系统,然后重启。第一次重启后得到的数据是正确的,可以正常的读取文件的配置。第二次及其以后的重启就会发现配置文件数据已经读取不了了,或者是格式不对了。我拷贝出来一看,文件大 ...… 查看全部问答> |
|
飞凌嵌入式’全新ARM9学习套件,功能强大的OK2440-IV开发板仅售598元!另加36元获赠一块单片机学习板,希望能帮助大家从零开始学习嵌入式高端技术! http://www.helloarm.com/Samsung/48.htm… 查看全部问答> |
|
Windows CE 中连接远程sql server 2005报错“PlatformNotSupportedException“请高手帮下~! 情况是这样的,我想用window ce 连接远程sql server 2005却出现了PlatformNotSupportedException异常,同样的代码在windows 程序下测试是可以的! 我的开发环境是 vs 2005 +c# 本地用的是模拟器,模拟器可以连接到网络(用模拟器可以访问外部 ...… 查看全部问答> |
|
现在做一个使用CYCLONE III系列的EP3C55做ddr2控制器,我这边使用的是一个8位的ddr2芯片,在FPGA里面用bank2的IO口专门做DDR2的pin接口输出,DDR2的引脚和bank2上面的专用DQ,DQS,DM连接,其余的引脚用来连接DDR的地址引脚和控制引脚,在FPGA里面 ...… 查看全部问答> |




