简介
- 这里使用STM32平台进行USB 协议的学习与USB 设备的调试开发
- USB HID设备,协议较固定,无法实现数据的自由接收与发送
- USB CUSTOM HID设备(自定义HID协议)可以实现简单的USB 数据双向收发
环境搭建
- 这里使用STM32L475开发板
- 使用:STM32CubeMX 生成一个STM32L475的工程,这部分的操作可以查看上一篇USB HID 设备的文章
- 这里分别选择:USB Device 与 Custom Human Interface Device Class
- 生成工程,这里使用Keil MDK5,编译下载,发现在没有更改代码的情况下,USB HID设备可以枚举,但是,无法【启动】
增加报告描述符
- 在Win10 64位的电脑上,枚举的 【USB 输入设备】,提示无法启动,这里需要手动配置USB HID的【报告描述符】
-
修改
usbd_custom_hid_if.c
,完善CUSTOM_HID_ReportDesc_FS
/** 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 */ };
- 修改
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 报告的测试程序
#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[i] = 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++;
}
}
- 编译下载,电脑端开启USB HID调试工具,进行通信的验证
通信验证
- 打开USB HID 调试工具
https://gitee.com/zhangsz0516/usb_hid_tool
- 配置好 USB HID设备的VID、PID
- 发现USB HID 工具可以收到:STM32 USB HID的报告了
- 点击 LED1_ON 按钮,发现:STM32 USB HID 设备端,可以接收到 USB主机发送的数据
- 如何接收与处理 USB 主机发送过来的数据,后面再详细讲解
小结
- 初步搭建了STM32 CUSTOM USB HID设备的调试环境
- 需要了解USB HID 相关的协议,如【报告描述符】的编写规则
- 简单的实现了 自定义 CUSTOM USB HID双向通信,处理好接收与发送,就可以进一步实现数据的采集与控制了