历史上的今天
返回首页

历史上的今天

今天是: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接口原理图: 
USB.jpg?imageView2/2/w/550
HID枚举成功: 
1.jpg?imageView2/2/w/550
程序效果图 
1.jpg?imageView2/2/w/550
图一 上位机程序运行图 
2.jpg?imageView2/2/w/550
图二  STM32串口打印输出 
3.jpg?imageView2/2/w/550
图三 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");


推荐阅读

史海拾趣

ET Enterprises Ltd公司的发展小趣事

随着技术的不断进步和市场需求的增长,ET Enterprises Ltd公司开始推出多种类型的光电倍增管产品,包括普通可见光型、紫外灵敏型、日盲型等。同时,公司也积极拓展国际市场,与全球各地的客户建立合作关系,进一步巩固了其在光电倍增管领域的领先地位。

迦美信芯(CanaanTek)公司的发展小趣事

迦美信芯一直致力于技术创新和产品升级。公司推出的面向手机终端和物联网的2G/3G/4G/5G全系列的射频开关、天线调谐器、低噪声放大器等产品,在行业内具有较高的知名度和美誉度。特别是在天线调谐器领域,迦美信芯已成为国内设计出天线调谐器芯片并大量量产的厂家之一。

DRS Technologies公司的发展小趣事

近年来,DRS在红外探测器技术领域取得了重要进展。公司在12μm像元尺寸非制冷红外探测器技术的基础上,成功研制出10μm像元尺寸的产品。这一技术的突破不仅展示了DRS在红外探测领域的实力,也为其在未来的市场竞争中提供了有力的技术支撑。

Accetek公司的发展小趣事

Accetek公司深知人才是企业发展的核心竞争力。因此,公司一直注重人才引进和团队建设工作。公司通过与高校合作、举办招聘会等方式吸引了一批批优秀的人才加入。同时,公司还建立了完善的培训机制和激励机制,为员工的成长和发展提供了良好的平台。这些优秀的人才为公司的技术创新和市场拓展提供了有力的支持。

ALLTHREAD公司的发展小趣事

随着产品质量的不断提升,ALLTHREAD开始积极拓展市场。他们与多家国际知名电子企业建立了合作关系,共同开发适用于不同应用场景的螺栓产品。通过国际合作,ALLTHREAD不仅提升了自身的技术水平,还进一步扩大了市场份额。

Einfochips公司的发展小趣事

为了满足不断增长的ASIC和嵌入式服务需求,Einfochips公司决定在印度孟买附近的Pune设立一家新的设计中心。该设计中心将为亚洲和北美客户提供服务,主要涉及存储网络、无线通信和消费多媒体等领域。这一举措不仅加强了Einfochips在亚洲和北美市场的地位,还为其未来的发展奠定了坚实基础。

问答坊 | AI 解惑

12864程序

12864串并口程序…

查看全部问答>

低成本、小尺寸的脉搏血氧仪方案

血红蛋白是血细胞的重要组成部分,它负责将氧气从肺部输送到身体的其它组织。血红蛋白在任一时刻所含的氧气量被称为血氧饱和度(即SpO2)。 血氧饱和度是反映人体呼吸功能及氧含量是否正常的重要生理参数,它是显示我们人体各组织是否健康的一个重要 ...…

查看全部问答>

新手问问题。。望各位大侠花一两分钟帮小弟解答一下。。

各位大侠好。。小弟是新手。。想问一下用1602还有一块51单片机做一个电子钟。。都要用到什么东西。。望能详细点解答。。最好能细到连电子元器件都说明。。而且最好能有个大概的制作步骤。。。小弟在此谢过了。。…

查看全部问答>

wince的flash保存的文件的内容被改变了,或者是丢失了

    系统在启动以后,通过同步工具拷贝一个配置文件给系统,然后重启。第一次重启后得到的数据是正确的,可以正常的读取文件的配置。第二次及其以后的重启就会发现配置文件数据已经读取不了了,或者是格式不对了。我拷贝出来一看,文件大 ...…

查看全部问答>

买ARM9,送单片机开发板!

飞凌嵌入式’全新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# 本地用的是模拟器,模拟器可以连接到网络(用模拟器可以访问外部 ...…

查看全部问答>

硬件维护工程师

   各位大虾硬件维护工程师主要是做什么的啊?        我在学校准备考,还不知道是做什么的?考这个有用没有啊 ???? …

查看全部问答>

ALTERA FPGA做ddr2控制器引脚定义的问题

现在做一个使用CYCLONE III系列的EP3C55做ddr2控制器,我这边使用的是一个8位的ddr2芯片,在FPGA里面用bank2的IO口专门做DDR2的pin接口输出,DDR2的引脚和bank2上面的专用DQ,DQS,DM连接,其余的引脚用来连接DDR的地址引脚和控制引脚,在FPGA里面 ...…

查看全部问答>

LM3S811中断

LM3S811中断函数注册有两种方法,一是类似例程的看门狗,在起始的汇编文件改变相应中断处理函数名,并EXTERN,中断处理函数名字一致。二是,使用相应库的中断注册函数,但需要改sct文件,把默认注释的那句话改为不注释。 看到下面有人问,就把国 ...…

查看全部问答>