php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 680|回复: 0

USB协议学习笔记 - CUSTOM HID 设备

[复制链接]

2871

主题

2881

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7283
贡献
0
注册时间
2021-4-14
最后登录
2024-9-19
在线时间
715 小时
QQ
发表于 2022-2-6 16:19:09 | 显示全部楼层 |阅读模式
简介
这里使用STM32平台进行USB 协议的学习与USB 设备的调试开发
USB HID设备,协议较固定,无法实现数据的自由接收与发送
USB CUSTOM HID设备(自定义HID协议)可以实现简单的USB 数据双向收发
环境搭建
这里使用STM32L475开发板
使用:STM32CubeMX 生成一个STM32L475的工程,这部分的操作可以查看上一篇USB HID 设备的文章
这里分别选择:USB Device 与 Custom Human Interface Device Class

image.png
image.png
生成工程,这里使用Keil MDK5,编译下载,发现在没有更改代码的情况下,USB HID设备可以枚举,但是,无法【启动】
增加报告描述符
在Win10 64位的电脑上,枚举的 【USB 输入设备】,提示无法启动,这里需要手动配置USB HID的【报告描述符】
修改usbd_custom_hid_if.c,完善CUSTOM_HID_ReportDesc_FS
[mw_shl_code=applescript,true]/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
    0x05, 0xFF, // USAGE_PAGE(User define)
    0x09, 0xFF, // USAGE(User define)
    0xa1, 0x01, // COLLECTION (Application)
    /* 6 Bytes*/

    // The Input report
    0x05, 0x01, // USAGE_PAGE(1)
    0x19, 0x00, // USAGE_MINIMUM(0)
    0x29, 0xFF, // USAGE_MAXIMUM(255)
    0x15, 0x00, // LOGICAL_MINIMUM (0)
    0x25, 0xFF, // LOGICAL_MAXIMUM (255)
    0x75, 0x08, // REPORT_SIZE (8)
    0x95, 0x40, // REPORT_COUNT (64)
    0x81, 0x02, // INPUT (Data,Var,Abs)

    /* 22 Bytes */

    // The Output report
    0x05, 0x02, // USAGE_PAGE(2)
    0x19, 0x00, // USAGE_MINIMUM (0)
    0x29, 0xFF, // USAGE_MAXIMUM (255)
    0x15, 0x00, // LOGICAL_MINIMUM (0)
    0x25, 0xFF, // LOGICAL_MAXIMUM (255)
    0x75, 0x08, // REPORT_SIZE (8)
    0x95, 0x20, // REPORT_COUNT (32)
    0x91, 0x02, // OUTPUT (Data,Var,Abs)
    /* 38 Bytes */

    0xc0 // END_COLLECTION
    /* 39 Bytes */
};
[/mw_shl_code]
修改 usbd_conf.h 里几个宏的值
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE     32U
/*---------- -----------*/
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE     39U

编译下载,发现USB HID 输入设备,正常的枚举并启动成功了
修改usbd_custom_hid_if.c,开启USB HID 报告发送接口USBD_CUSTOM_HID_SendReport_FS
/**
  * @brief  Send the report to the Host
  * @param  report: The report to be sent
  * @param  len: The report length
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t USBD_CUSTOM_HID_SendReport_FS(uint8_t *report, uint16_t len)
{
  return USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, len);
}

main.c中增加发送USB HID 报告的测试程序
[mw_shl_code=applescript,true]#include "main.h"
#include "usb_device.h"
#include "usbd_custom_hid_if.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

void usb_hid_send_response(uint8_t dat)
{
    uint8_t SendBuffer[64] = { 0 };

    for (uint8_t i = 0; i < sizeof(SendBuffer); i++)
    {
        SendBuffer = 0x41;
    }

    SendBuffer[1] = dat;
    USBD_CUSTOM_HID_SendReport_FS(SendBuffer, sizeof(SendBuffer));
}

int main(void)
{
    uint8_t cnt = 0;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USB_DEVICE_Init();
    while (1)
    {
        HAL_Delay(5000);
        usb_hid_send_response(cnt);
        cnt++;
    }
}
[/mw_shl_code]
编译下载,电脑端开启USB HID调试工具,进行通信的验证
通信验证
打开USB HID 调试工具
https://gitee.com/zhangsz0516/usb_hid_tool
1
配置好 USB HID设备的VID、PID
image.png
image.png
image.png

发现USB HID 工具可以收到:STM32 USB HID的报告了
点击 LED1_ON 按钮,发现:STM32 USB HID 设备端,可以接收到 USB主机发送的数据
如何接收与处理 USB 主机发送过来的数据,后面再详细讲解
image.png
小结
初步搭建了STM32 CUSTOM USB HID设备的调试环境
需要了解USB HID 相关的协议,如【报告描述符】的编写规则
简单的实现了 自定义 CUSTOM USB HID双向通信,处理好接收与发送,就可以进一步实现数据的采集与控制了

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-9-20 05:59 , Processed in 0.188055 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表