日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USB协议学习笔记 - CUSTOM HID 设备 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

  • 這里使用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 report0x05, 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 report0x05, 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雙向通信,處理好接收與發送,就可以進一步實現數據的采集與控制了

總結

以上是生活随笔為你收集整理的USB协议学习笔记 - CUSTOM HID 设备的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。