Trong bài này chúng ta sẽ tìm hiểu về STM32 USB HID Custom, đây là một phương thức giúp chúng ta truyền nhận dữ liệu thông qua chuẩn USB HID. Điều đặc biệt khi dùng HID đó là chúng ta không cần cài driver cho máy tính mà vẫn sử đụng được bình thường.
Bài 19 trong Serie Học STM32 từ A tới Z
USB HID Custom là gì?
USB HID Custom đơn giản là truyền dữ liệu thông qua giao thức USB HID nhưng có thể truyền tùy ý mà không tuân theo Report như những thiết bị đã được fix sẵn như chuột, bàn phím, game pad….
HID custom cho phép người dùng truyền dữ liệu giữa thiết bị và máy tính giống như USB CDC nhưng không cần cài driver cổng com ảo. Chính vì thế chúng ta có thể sử dụng để giao tiếp nhanh và hiệu quả hơn
Report Descriptor USB HID Custom và tool truyền nhận USB
Như đã học ở các bài trước, format khung truyền dữ liệu của thiết bị phụ thuộc vào Report Descriptor. Chi tiết như sau:
const uint8_t CUSTOM_HID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] = { 0x06, 0x00, 0xFF, // Usage Page = 0xFF00 (Vendor Defined Page 1) 0x09, 0x01, // Usage (Vendor Usage 1) 0xA1, 0x01, // Collection (Application) 0x19, 0x01, // Usage Minimum 0x29, 0x40, // Usage Maximum //64 input usages total (0x01 to 0x40) 0x15, 0x01, // Logical Minimum (data bytes in the report may have minimum value = 0x00) 0x25, 0x40, // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255) 0x75, 0x08, // Report Size: 8-bit field size 0x95, 0x40, // Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item) 0x81, 0x00, // Input (Data, Array, Abs): Instantiates input packet fields based on the above report size, count, logical min/max, and usage. 0x19, 0x01, // Usage Minimum 0x29, 0x40, // Usage Maximum //64 output usages total (0x01 to 0x40) 0x91, 0x00, // Output (Data, Array, Abs): Instantiates output packet fields. Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item. 0xC0 };
Tiếp tới chúng ta download tools HID Terminal để truyền nhận dữ liệu
Link download: HID Terminal
Lập trình STM32 HID Custom truyền nhận dữ liệu qua cổng USB
Cấu hình CubeMX
Cấu hình USB device
Trong middle ware chọn Class là USB hid custom. Thay đổi các thông số
- REPORT_DESCRIPTION_SIZE là kích cỡ của report
- OUTREPORT_SIZE là kích cỡ gói tin cần gửi
Thay đổi các thông số Device Description như VID, PID để phân biệt với các USB khác (phần này có thể tùy ý thay đổi)
Thiết lập clock sao cho 48mhz cho USB
Lập trình với KeilC
Do CubeMx gen lỗi nên chúng ta phải sửa lại các thiết lập trên trong file usbd_customhid.h
Tiếp theo, copy Report Desc đã chuẩn bị vào file usbd_custom_hid_if.c
Hiện tại Report Desc này truyền nhận với độ rộng là 64 byte, để truyền nhận với độ rộng khác, các bạn có thể sửa phần 0x95, 0x40 (0x40 = 64) thành các số khác.
VD: 32 byte sẽ là 0x95, 32. 128 byte là 0x95,128
Để gửi dữ liệu chúng ta dùng lệnh USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS,data,64);
Để nhận dữ liệu chúng ta tìm tới hàm USBD_CUSTOM_HID_DataOut trong file usbd_customhid.c
Tạo một buffer usb_buffer để nhận dữ liệu, sau đó copy dữ liệu từ report buf vào buffer đó. Các bạn có thể tạo cờ để báo việc đã nhận dữ liệu
Kết quả
Khi cắm USB, HID terminal sẽ nhận ra thiết bị với VID và PID đã thiết lập.
Dùng hàm Send report để gửi dữ liệu
Dùng HID terminal gửi dữ liệu sang và xem kết quả
Kết
Vậy là chúng ta đã có thể sử dụng STM32 USB HID custom để truyền nhận dữ liệu, chuẩn này rất phù hợp khi giao tiếp với máy tính, vì nó không cần phải cài driver, cách giao tiếp cũng đơn giản, tốc độ khá cao.
Nếu cảm thấy bài viết có ích hay đánh giá và chia sẻ cho bạn bè. Đừng quên tham gia nhóm Nghiện lập trình để cùng trao đổi và kết nối nhé!