Tối Sáng
Hình 1. Universal Serial Bus (USB) là gì?

Tìm hiểu về Universal Serial Bus (USB) Để lại bình luận

Hình 1. Universal Serial Bus (USB) là gì?
Hình 1. Universal Serial Bus (USB) là gì?

USB (Universal Serial Bus) là một tiêu chuẩn kết nối phổ biến trong ngành công nghiệp, dùng để kết nối nhiều thiết bị ngoại vi với Host (thường là máy tính). So với các chuẩn giao tiếp nối tiếp (serial) hoặc song song (parallel) khác, USB có nhiều ưu điểm như:
🔹 Dễ sử dụng: Hỗ trợ cắm và chạy (plug and play), thay thế nóng (hot swapping) mà không cần khởi động lại máy.
🔹 Không cần cấp nguồn riêng: Nhiều thiết bị có thể lấy nguồn trực tiếp từ cổng USB.
🔹 Chi phí thấp, tiết kiệm điện.
🔹 Tốc độ truyền dữ liệu nhanh.

Xem thêm: Tìm hiểu về Digital-to-Analog Converter (DAC)

Các phiên bản USB

Các phiên bản: USB 1.0 (1996), USB 2.0 (2000), USB 3.0 (2008).
Các phiên bản này đều tương thích ngược (tức là thiết bị USB mới vẫn có thể hoạt động với cổng USB cũ).
USB 2.0 có thêm tính năng USB OTG (On-The-Go), cho phép một thiết bị USB có thể đóng cả vai trò chủ (host) và tớ (slave). Ví dụ:
🔹 Máy in khi kết nối với PC đóng vai trò Slave.
🔹 Nhưng nếu cắm USB flash vào máy in, máy in lại trở thành Master để đọc dữ liệu từ USB.

Tổng quan về các lớp của USB

Hình 2. Các lớp của USB
Hình 2. Các lớp của USB

Giao thức USB được tổ chức theo ba lớp chính:

1. Lớp Bus (Bus Layer)

Lớp này chịu trách nhiệm:
🔹 Kết nối vật lý giữa các thiết bị thông qua dây cáp USB.
🔹 Cung cấp nguồn điện cho các thiết bị ngoại vi.
🔹 Điều chỉnh tốc độ truyền dữ liệu (USB 1.0, 2.0, 3.0 có tốc độ khác nhau).
🔹 Mã hóa và giải mã tín hiệu dữ liệu để đảm bảo truyền thông chính xác.

2. Lớp Thiết Bị (Device Layer)

Lớp này xử lý các tác vụ liên quan đến điều khiển và giao tiếp giữa thiết bị USB và máy chủ:
🔹 Thiết lập kênh điều khiển logic (endpoint 0) để máy chủ quản lý thiết bị.
🔹 Phát hiện và xử lý lỗi trong các gói tin dữ liệu.
🔹 Chia nhỏ yêu cầu lớn thành nhiều gói tin nhỏ để truyền tải hiệu quả hơn.

3. Lớp Chức Năng Logic (Logic Function Layer)

Lớp này tạo ra nhiều kênh chức năng logic giữa máy chủ và thiết bị USB:
🔹 Một thiết bị USB có thể có nhiều chức năng khác nhau.
🔹 Ví dụ, một máy in đa năng có thể có bốn chức năng: In (print), Photocopy, Quét tài liệu (scan), Fax.
🔹 Mỗi chức năng sẽ có một kênh logic riêng, giúp máy chủ có thể gửi hoặc nhận dữ liệu từ từng chức năng cụ thể.

Xem thêm: Analog-to-Digital Converter (ADC): Nguyên lý và Ứng dụng

Lớp Bus (Bus Layer)

1. Tốc độ truyền dữ liệu của USB

USB hỗ trợ 4 mức tốc độ truyền dữ liệu:
🔹 Low Speed (Tốc độ thấp): 1.5 Mbit/s (187 KB/s) – Thường dùng cho thiết bị như chuột, bàn phím.
🔹 Full Speed (Tốc độ đầy đủ): 12 Mbit/s (1.5 MB/s) – Dùng cho nhiều thiết bị USB 1.1 như máy in, loa USB.
🔹 High Speed (Tốc độ cao): 480 Mbit/s (60 MB/s) – Thường có trên USB 2.0, dùng cho ổ cứng, webcam.
🔹 Super Speed (Siêu tốc độ): 4.8 Gbit/s (600 MB/s) – Có trên USB 3.0, giúp truyền dữ liệu cực nhanh.

2. Cấu tạo dây cáp USB

Hình 3. Cấu tạo của USB
Hình 3. Cấu tạo của USB

Một cáp USB tiêu chuẩn có 4 dây được bọc chống nhiễu:
🔹 Ground (GND): Dây nối đất.
🔹 Vbus (5V): Cung cấp nguồn điện cho thiết bị USB.
🔹 D+ và D-: Dây truyền dữ liệu, được xoắn vào nhau để giảm nhiễu điện từ.

Điện áp trên D+ hoặc D- được quy ước như sau:
🔹 Dưới 0.3V → mức logic thấp (LOW).
🔹 Trên 2.8V → mức logic cao (HIGH).

3. Tốc độ và độ chính xác của USB tốc độ cao

Mọi thiết bị USB tốc độ cao (High-Speed USB) phải hỗ trợ tốc độ 480Mb/s. Đồng hồ (clock) của thiết bị phải có độ chính xác ±500 PPM (phần triệu).

a. PPM là gì?

1 PPM = 0.0001% sai số.
Nếu Clock có sai số 12 PPM, sau 1 ngày nó có thể lệch khoảng 1 giây.
Nếu Clock có sai số 500 PPM, sau 1 ngày nó có thể lệch tới 43 giây.

b. Vấn đề của Clock nội của vi điều khiển

Đồng hồ nội (internal clock) của vi điều khiển thường không đủ chính xác để chạy USB tốc độ cao.
Ví dụ, STM32L có độ chính xác ±600 PPM, có thể lệch:
🔹 52 giây mỗi ngày.
🔹 26 phút mỗi tháng.

Giải pháp:
🔹 Sử dụng thạch anh ngoài (external crystal oscillator), thường có sai số ±20 PPM → độ chính xác cao hơn nhiều.
🔹 Có thể dùng xung nhịp ngoài tốc độ thấp để hiệu chỉnh (calibrate) xung nhịp nội.

Xem thêm: Controller Area Network (CAN) bus – Hệ Thần Kinh Của Ô Tô Hiện Đại

4. Cách truyền dữ liệu qua D+ và D-

Dữ liệu được truyền theo phương pháp tín hiệu vi sai (differential signaling):
🔹 J state: D+ = HIGH, D- = LOW
🔹 K state: D+ = LOW, D- = HIGH

Khi không truyền dữ liệu (Idle), USB giữ trạng thái J.
Khi bắt đầu truyền dữ liệu, USB sẽ thay đổi giữa J ↔ K để biểu diễn các bit dữ liệu.

Dữ liệu số (0/1) không được truyền trực tiếp mà dùng phương pháp NRZI (Non-Return-to-Zero Inverted):
🔹 1 (giữ nguyên trạng thái hiện tại).
🔹 0 (đổi trạng thái từ J → K hoặc K → J).

Hình 4. Ví dụ về mã hoá dữ liệu sử dụng NRZI
Hình 4. Ví dụ về mã hoá dữ liệu sử dụng NRZI

5. Trạng thái đặc biệt của USB

SE0 (Single-Ended 0): Cả D+ và D- đều thấp (0V) → Dùng khi kết thúc truyền, thiết bị bị ngắt kết nối hoặc reset.
SE1 (Single-Ended 1): Cả D+ và D- đều cao (5V) → Trạng thái không hợp lệ, ngoại trừ chế độ sạc pin.

6. Bit Stuffing (Chèn Bit)

Nếu có quá nhiều bit 1 liên tiếp, tín hiệu sẽ không thay đổi trạng thái, khiến bộ thu khó đồng bộ hóa dữ liệu với bộ phát.
Để đảm bảo đủ số lần chuyển trạng thái, nếu có 6 bit 1 liên tiếp, USB sẽ tự động chèn thêm 1 bit 0 vào luồng dữ liệu. Bit này không phải là dữ liệu thật, nó chỉ giúp bộ thu biết khi nào đồng hồ xung nhịp cần đồng bộ lại. Khi nhận dữ liệu, thiết bị sẽ tự động loại bỏ bit 0 được chèn để khôi phục dữ liệu gốc.

7. Cách nhận diện tốc độ USB

Hình 5. Chế độ full-speed sử dụng điện trở kéo lên ở D+ và low-speed sử dụng điện trở kéo lên ở D-
Hình 5. Chế độ full-speed sử dụng điện trở kéo lên ở D+ và low-speed sử dụng điện trở kéo lên ở D-

Khi bạn cắm một thiết bị USB vào máy tính, làm sao máy tính biết đó là USB tốc độ thấp (Low-Speed), tốc độ đầy đủ (Full-Speed) hay tốc độ cao (High-Speed)?
USB giải quyết vấn đề này bằng cách sử dụng điện trở pull-up trên dây D+ hoặc D- để báo hiệu tốc độ của thiết bị.

a. Nguyên tắc hoạt động

Tốc độ USB được xác định bằng cách kéo lên (pull-up) dây D+ hoặc D-:
🔹 Không kéo lên → Máy chủ hiểu rằng chưa có thiết bị nào được kết nối.
🔹 D+ kéo lên (1.5kΩ tới 3.3V) → Thiết bị Full-Speed (12 Mbps).
🔹 D- kéo lên (1.5kΩ tới 3.3V) → Thiết bị Low-Speed (1.5 Mbps).

b. Đối với USB High-speed thì sao?

Thiết bị USB High-Speed (480 Mbps)ban đầu kéo lên D+, giống như Full-Speed.
Máy chủ sẽ thử giao tiếp ở tốc độ cao:
🔹 Nếu thành công, thiết bị sẽ bỏ pull-up và chuyển sang tốc độ cao.
🔹 Nếu thất bại, thiết bị quay lại Full-Speed (12 Mbps).

Lớp Thiết Bị (Device Layer)

1. USB sử dụng mô hình giao tiếp dựa trên Token (Token-based Protocol)

a. Token là gì trong USB?

Token là một gói tin đặc biệt, được gửi từ host (máy tính) đến thiết bị USB để điều khiển việc truyền dữ liệu.
Trong hệ thống USB, chỉ có host mới được phép khởi tạo việc truyền dữ liệu. Thiết bị USB không thể tự gửi dữ liệu trừ khi host yêu cầu.

b. Token hoạt động như thế nào?

🔹 Bước 1: Host gửi một Token Packet để thông báo với thiết bị USB rằng nó muốn gửi hoặc nhận dữ liệu.
🔹 Bước 2: Token Packet sẽ chứa địa chỉ thiết bị và endpoint (bộ nhớ đệm trong thiết bị USB).
🔹 Bước 3: Thiết bị USB phản hồi lại nếu địa chỉ trùng khớp.

c. Các loại Token trong USB

USB có 2 hướng truyền dữ liệu:
🔹 IN Token: Host muốn đọc dữ liệu từ thiết bị USB.
🔹 OUT Token: Host muốn ghi dữ liệu vào thiết bị USB

2. Các loại truyền dữ liệu trong USB

USB có 4 kiểu truyền dữ liệu, mỗi kiểu có ưu/nhược điểm khác nhau:

Loại truyềnĐặc điểmỨng dụng
Control TransferDùng để đọc/thay đổi trạng thái của thiết bị. Mọi thiết bị USB đều phải hỗ trợ.Nhận diện thiết bị, cấp địa chỉ USB
Bulk TransferTruyền dữ liệu lớn với độ trễ cao nếu bus bận. Đảm bảo dữ liệu không bị lỗi.Ổ cứng ngoài, máy in, máy quét
Interrupt TransferHost truy vấn thiết bị theo chu kỳ. Độ trễ thấp hơn Bulk nhưng băng thông thấp.Chuột, bàn phím
Isochronous TransferĐảm bảo thời gian truyền nhưng không thể tự kiểm tra lỗi.Webcam, micro USB

3. Cấu trúc gói tin trong USB

Hình 6. Các gói tin (packet) USB
Hình 6. Các gói tin (packet) USB

Mỗi lần truyền dữ liệu qua USB không chỉ đơn giản là gửi một đoạn dữ liệu mà nó phải chia thành nhiều gói tin (packets) nhỏ:
🔹 Start of Frame (SOF) Packet: Được host gửi đi định kỳ để đồng bộ thời gian giữa các thiết bị USB.
🔹 Token Packet: Xác định thiết bị USB nào sẽ nhận dữ liệu và hướng truyền (IN/OUT).
🔹 Data Packet: Chứa dữ liệu cần truyền.
🔹 Acknowledge Packet: Xác nhận xem dữ liệu có được nhận thành công hay không.

Một gói tin USB bao gồm nhiều trường (fields), mỗi trường có một nhiệm vụ riêng:

a. Synchronization field (SYNC – Trường đồng bộ)

🔹 Là byte đầu tiên của gói tin, giúp đồng bộ hóa nhịp xung giữa thiết bị gửi và nhận.
🔹 Giá trị của SYNC byte: 0b00000001.
🔹 Ở chế độ full speed, khi truyền SYNC byte, tín hiệu trên dây D+ và D- có dạng: “KJKJKJKK”.

b. Packet identification field (PID – Trường nhận diện gói tin)

🔹 Giúp xác định loại gói tin đang được gửi.
🔹 PID có 8 bit, trong đó 4 bit dưới là nghịch đảo của 4 bit trên (dùng để kiểm tra lỗi).
🔹 Ví dụ: Nếu PID có giá trị 0b10000111, nếu muốn lấy giá trị thực của PID, chỉ cần lấy 4 bit đầu tiên: 0001.

c. Address field (ADDR – Trường địa chỉ)

🔹 Có 7 bit, cho phép tối đa 127 thiết bị USB kết nối vào cùng một host.
🔹 Khi mới cắm vào, thiết bị có địa chỉ 0 (chưa định danh), sau đó host sẽ cấp một địa chỉ mới.

d. Endpoint field (ENDP – Trường điểm cuối)

Mỗi thiết bị USB có tối đa 16 endpoint cho mỗi hướng truyền (tổng cộng 32 nếu tính cả IN & OUT). Mỗi endpoint đóng vai trò như một ống dẫn dữ liệu giữa thiết bị USB và host.
🔹 IN Endpoint: Gửi dữ liệu từ thiết bị USB lên host (VD: bàn phím gửi phím bấm lên PC).
🔹 OUT Endpoint: Nhận dữ liệu từ host xuống thiết bị USB (VD: PC gửi file vào USB flash drive).

e. Data field (Trường dữ liệu)

🔹 Chứa dữ liệu thực tế được gửi đi.
🔹 Dung lượng tối đa: Low Speed: 8 byte, Full Speed: 8, 16, 32, hoặc 64 byte, High Speed: 1024 byte.

f. Cyclic redundancy check field (CRC – Trường kiểm tra lỗi)

Dùng để phát hiện lỗi trong quá trình truyền dữ liệu.
Có 2 loại:
🔹 CRC 5-bit cho gói Token.
🔹 CRC 16-bit cho gói Data.
Nguyên tắc kiểm tra lỗi CRC:
🔹 Chuyển dữ liệu thành số nhị phân.
🔹 Chia số nhị phân này cho một số nhị phân cố định.
🔹 Lấy phần dư làm mã CRC.

Nếu CRC của thiết bị nhận không khớp với CRC của thiết bị gửi, thì dữ liệu được xem là lỗi.

Burst Error là lỗi xảy ra khi nhiều bit liên tiếp trong dữ liệu bị thay đổi do nhiễu hoặc sự cố trong quá trình truyền.
Ví dụ:
🔹 Dữ liệu nhận: 1011111101 (các bit ở giữa bị lỗi).
🔹 Dữ liệu gốc: 1011001101.

CRC có khả năng phát hiện:
🔹 Tất cả lỗi 1-bit và 2-bit (lỗi đơn lẻ hoặc lỗi đôi).
🔹 Mọi lỗi liên tiếp có chiều dài ≤ n bit (nếu CRC có n bit).
🔹 Hầu hết lỗi dài hơn n bit nhưng không đảm bảo chính xác 100%.

Xem thêm: Hiểu về Direct Memory Access (DMA)

g. End of packet field (EOP – Trường kết thúc gói tin)

Được đánh dấu bằng tín hiệu SE0 (Single-Ended 0) kéo dài 2 bit, sau đó là trạng thái J trong 1 bit. Giúp nhận biết rằng gói tin đã kết thúc.

4. Quá trình truyền dữ liệu trong USB

Quá trình truyền dữ liệu (transaction) trong USB diễn ra qua 3 bước chính:

Hình 7. Ví dụ về quá trình truyền dữ liệu của USB
Hình 7. Ví dụ về quá trình truyền dữ liệu của USB
a. Host gửi gói tin điều khiển (Token Packet)

Host (máy tính) sẽ gửi một gói tin đặc biệt gọi là token packet.
Gói tin này chứa thông tin:
🔹 Địa chỉ thiết bị (ADDR field): Cho biết thiết bị USB nào sẽ nhận dữ liệu.
🔹 Endpoint (ENDP field): Chỉ định nơi nhận dữ liệu bên trong thiết bị USB.
🔹 Hướng truyền dữ liệu (packet ID – PID): Xác định là gửi dữ liệu (OUT) hay nhận dữ liệu (IN).

b. Nếu là OUT hoặc SETUP, Host gửi dữ liệu đến thiết bị USB

Nếu token packet có PID là OUT hoặc SETUP, điều này có nghĩa là:
🔹 Host sẽ gửi dữ liệu đến thiết bị USB.
🔹 Thiết bị USB phải gửi lại một gói xác nhận (ACK – Acknowledge Packet) để báo rằng nó đã nhận dữ liệu thành công.

c. Nếu là IN, thiết bị USB gửi dữ liệu cho Host

Nếu token packet có PID là IN:
🔹 Host yêu cầu thiết bị USB gửi dữ liệu.
🔹 Thiết bị USB sẽ gửi một gói dữ liệu (Data Packet) cho Host.
🔹 Sau khi nhận được dữ liệu, Host gửi lại một gói ACK để xác nhận rằng dữ liệu đã nhận thành công.

5. Start-of-Frame (SOF)

Khi truyền dữ liệu qua USB, Host (máy tính) sẽ gửi một gói tin SOF (Start-of-Frame) liên tục để đồng bộ hóa thời gian giữa các thiết bị USB.

a. Tần suất gửi SOF

USB Full-Speed (12 Mbps): Host gửi một gói SOF mỗi 1 ms.
USB High-Speed (480 Mbps): Host gửi một gói SOF mỗi 125 µs (tức là 8000 lần mỗi giây!).

b. SOF hoạt động như thế nào?

Gói SOF này chỉ có nhiệm vụ đánh dấu thời điểm và không yêu cầu thiết bị USB phản hồi.
Các thiết bị USB dựa vào SOF để căn thời gian chính xác khi gửi hoặc nhận dữ liệu.

c. Tại sao SOF quan trọng?

SOF rất quan trọng cho các thiết bị truyền dữ liệu theo thời gian thực, như:
🔹 Webcam – Giúp truyền video mượt, không bị giật.
🔹 Microphone USB – Giúp âm thanh không bị méo hoặc ngắt quãng.
🔹 Loa USB – Đảm bảo âm thanh phát liên tục, không bị trễ.

Nếu không có SOF, các thiết bị có thể gửi dữ liệu không đúng thời điểm, gây ra mất dữ liệu hoặc trễ tín hiệu.

Xem thêm: Giao thức truyền thông Local Interconnect Network (LIN)

6. Cách phần cứng USB xử lý gói tin

Khi một thiết bị USB nhận dữ liệu, phần cứng của nó tự động thực hiện nhiều công việc mà không cần phần mềm can thiệp.

a. Phần cứng USB làm gì khi nhận gói tin?

Nhận và đồng bộ dữ liệu: Khi một gói tin đến, phần cứng tự động nhận diện byte đầu tiên (SYNC field) để đồng bộ xung nhịp giữa máy tính (host) và thiết bị USB.
Xác định gói tin thuộc về ai:
🔹 Kiểm tra địa chỉ thiết bị USB (USB Address) và endpoint trong gói tin.
🔹 Nếu đúng địa chỉ của nó, nó mới tiếp tục xử lý.
Kiểm tra lỗi (CRC – Cyclic Redundancy Check):
🔹 Kiểm tra xem dữ liệu có bị lỗi trong quá trình truyền không.
🔹 Nếu có lỗi, gói tin bị bỏ qua và yêu cầu gửi lại.
Nhận diện kết thúc gói tin: Khi hết gói tin, phần cứng nhận diện End of Packet (EOP) để biết rằng dữ liệu đã hoàn tất.

b. Xử lý lỗi & thông báo cho phần mềm

Nếu có lỗi CRC (dữ liệu bị hỏng), hoặc không nhận được phản hồi từ máy tính, thì phần cứng USB sẽ:
🔹 Tự động tạo ngắt (interrupt) để báo cho phần mềm biết có lỗi.
🔹 Đặt bit lỗi trong thanh ghi báo lỗi để hệ thống biết cần xử lý lỗi này.

Lớp Chức Năng (USB Function Layer)

Một thiết bị USB có thể có nhiều chức năng khác nhau, chẳng hạn như camera USB có thể vừa quay video, thu âm, vừa lưu trữ dữ liệu. Mỗi chức năng này được kết nối với máy tính thông qua các endpoint (điểm cuối dữ liệu). Mọi thiết bị USB đều phải có endpoint 0, đây là endpoint đặc biệt dùng để máy tính điều khiển và quản lý thiết bị.

Dữ liệu giữa máy tính và thiết bị USB được truyền qua các kênh dữ liệu (pipe), kết nối logic giữa máy tính và một endpoint cụ thể. Mỗi endpoint có số thứ tự, loại truyền dữ liệu (control, isochronous, bulk, interrupt), hướng truyền (IN hoặc OUT), kích thước gói tin tối đa và chu kỳ trao đổi dữ liệu.

Hình 8. Các lớp trên USB. Lớp chức năng (Function layer) ở trên cùng
Hình 8. Các lớp trên USB. Lớp chức năng (Function layer) ở trên cùng

1. USB Descriptors

Khi một thiết bị USB được kết nối với máy tính, máy tính cần biết thông tin chi tiết về thiết bị để có thể giao tiếp đúng cách. Thông tin này được lưu trữ trong các bộ mô tả (descriptors).

a. USB Descriptors là gì?

Descriptors là những cấu trúc dữ liệu chứa thông tin về thiết bị USB.
Thông tin này được tổ chức theo hệ thống phân cấp: Thiết bị (Device) → Cấu hình (Configuration) → Giao diện (Interface) → Điểm cuối (Endpoint).

Hình 9. Hệ thống phân cấp của bộ mô tả
Hình 9. Hệ thống phân cấp của bộ mô tả
b. Các loại Descriptors quan trọng

Device Descriptor (Bộ mô tả thiết bị): Mỗi thiết bị USB chỉ có một Device Descriptor. Chứa thông tin quan trọng như: Vendor ID (VID): ID của nhà sản xuất (được cấp bởi USB.org), product ID (PID): ID của sản phẩm (do nhà sản xuất đặt), phiên bản USB hỗ trợ (USB 1.1, 2.0, 3.0…), số lượng cấu hình mà thiết bị hỗ trợ, kích thước tối đa của Endpoint 0 (để trao đổi lệnh điều khiển).

Configuration Descriptor (Bộ mô tả cấu hình): Một thiết bị có thể có nhiều cấu hình (nhưng điều này hiếm). Ví dụ: Một thiết bị có thể có cấu hình chạy bằng USB hoặc cấu hình chạy bằng pin. Máy tính sẽ chọn một cấu hình phù hợp để sử dụng.

Interface Descriptor (Bộ mô tả giao diện): Mỗi giao diện tương ứng với một chức năng của thiết bị. Ví dụ: Camera USB có 1 giao diện cho camera và 1 giao diện cho microphone. Chứa thông tin về: Số lượng endpoints của giao diện, Loại giao diện (USB Audio, HID, Storage…).

Endpoint Descriptor (Bộ mô tả điểm cuối): Mỗi endpoint là một kênh giao tiếp dữ liệu giữa máy tính và thiết bị. Ví dụ: Endpoint IN gửi dữ liệu từ thiết bị về máy tính, Endpoint OUT nhận dữ liệu từ máy tính xuống thiết bị.

c. Các trường quan trọng trong Descriptor
Hình 10. Các trường trong bộ mô tả
Hình 10. Các trường trong bộ mô tả

Mọi descriptor đều có 3 trường chung:
🔹 Độ dài (length) – Số byte của descriptor.
🔹 Loại descriptor (bDescriptorType) – Mã xác định loại descriptor: 0x01 = Device Descriptor, 0x02 = Configuration Descriptor, 0x04 = Interface Descriptor, 0x05 = Endpoint Descriptor.
🔹 Phiên bản USB hỗ trợ (bcdUSB): 0x0110 = USB 1.1, 0x0200 = USB 2.0, 0x0300 = USB 3.0.

Một số mã quan trọng do USB.org quy định:
🔹 bDeviceClass (Loại thiết bị): 0x09 → USB Hub, 0xDC → Thiết bị chẩn đoán, 0xFF → Thiết bị do nhà sản xuất tự định nghĩa, 0x00 → Loại thiết bị được xác định bởi giao diện.
🔹 bInterfaceClass (Loại giao diện USB): 0xE0 → Wireless Controller (thiết bị không dây), 0x01 → Audio (âm thanh), 0x03 → HID (bàn phím, chuột), 0x07 → Printer (máy in), 0x08 → Mass Storage (ổ cứng, USB flash), 0x0E → Video (camera USB).

String Descriptor: Chứa các chuỗi ký tự để hiển thị thông tin thiết bị. iManufacturer → Tên nhà sản xuất, iProduct → Tên sản phẩm, iSerialNumber → Số serial của thiết bị, iConfiguration → Tên cấu hình, iInterface → Tên giao diện.

Xem thêm: Tổng quan về giao thức Improved inter-integrated circuit (I3C)

2. Giao tiếp theo Endpoint trong USB (Endpoint-Oriented Communication)

Khi truyền dữ liệu qua USB, mỗi lần truyền được xác định bởi ba yếu tố chính: Địa chỉ thiết bị (Device Address), Điểm cuối (Endpoint), Hướng truyền dữ liệu (IN/OUT).
Mọi thiết bị USB đều phải có Endpoint 0, đây là endpoint đặc biệt giúp máy tính điều khiển và thiết lập thiết bị.

Hình 11. Giao tiếp theo Endpoint trong USB
Hình 11. Giao tiếp theo Endpoint trong USB

Ví dụ về endpoint trên một Web Camera:
🔹 Web Camera có bốn endpoint trong cấu hình đầu tiên. Endpoint 0 dùng để điều khiển thiết bị. Endpoint 1 truyền dữ liệu từ microphone, Endpoint 2 truyền dữ liệu từ camera, và Endpoint 3 dùng để lưu trữ dữ liệu.
🔹 Để đảm bảo dữ liệu truyền theo đúng thời gian thực, Endpoint 1 và 2 sử dụng phương thức truyền Isochronous. Endpoint 3 sử dụng phương thức truyền Bulk để lưu trữ và truy xuất dữ liệu đáng tin cậy.
🔹 Một thiết bị USB (ví dụ: Web Camera) có thể có nhiều cấu hình khác nhau, mỗi cấu hình có thể bao gồm các chức năng hoặc cách thức hoạt động khác nhau. Khi thiết bị kết nối với máy tính (USB host), máy tính sẽ quyết định sử dụng cấu hình nào để giao tiếp với thiết bị đó.

3. USB Enumeration – Quá trình nhận diện thiết bị USB

USB Enumeration là quá trình máy tính phát hiện và nhận diện thiết bị USB khi cắm vào cổng USB.

a. Các bước của quá trình Enumeration

Khi bạn cắm một thiết bị USB vào máy tính, host (máy tính) sẽ thực hiện các bước sau:
🔹 Bước 1: Phát hiện thiết bị USB: Khi thiết bị được cắm vào, đường D+ hoặc D- bị kéo lên mức cao do một điện trở pull-up bên trong thiết bị.
🔹 Bước 2: Xác định tốc độ của USB: Nếu D- bị kéo lên 3V ➝ Thiết bị hoạt động ở Low-Speed (1.5 Mbps). Nếu D+ bị kéo lên 3V ➝ Thiết bị hoạt động ở Full-Speed (12 Mbps) hoặc High-Speed (480 Mbps).
🔹 Bước 3: Lấy Device Descriptor để nhận diện thiết bị: Host gửi lệnh GET_DESCRIPTOR để lấy Device Descriptor.
🔹 Bước 4: Lấy tất cả các cấu hình (Configuration Descriptor): Nếu thiết bị hỗ trợ nhiều cấu hình, host sẽ đọc tất cả và chọn một cấu hình phù hợp.
🔹 Bước 5: Lấy tất cả các giao diện (Interface Descriptor): Ví dụ: Web Camera có thể có 2 interface (1 cho micro, 1 cho camera). Host sẽ đọc thông tin này để hiểu cách giao tiếp với thiết bị.
🔹 Bước 6: Nạp driver tương ứng: Host kiểm tra idVendor và idProduct để tìm driver phù hợp. Nếu driver có sẵn, hệ điều hành sẽ tự động cài đặt.

Hình 12. Ví dụ về việc gửi get_device_descriptor qua ba lần truyền. Giả sử kích thước dữ liệu tối đa là 16 byte.
Hình 12. Ví dụ về việc gửi get_device_descriptor qua ba lần truyền. Giả sử kích thước dữ liệu tối đa là 16 byte.
b. Cấp địa chỉ cho thiết bị USB
Hình 13. Ví dụ về set_address
Hình 13. Ví dụ về set_address

🔹 Ban đầu, mọi thiết bị USB đều có địa chỉ mặc định là 0.
🔹 Host có trách nhiệm gán địa chỉ duy nhất cho từng thiết bị bằng lệnh SET_ADDRESS.
🔹 Sau khi nhận được địa chỉ mới, thiết bị sẽ bắt đầu sử dụng địa chỉ này cho tất cả các giao tiếp tiếp theo.

Xem thêm: Tổng quan về Universal Asynchronous Receiver and Transmitter (UART)

c. Quá trình nhận diện USB trong Windows

Windows có một quy trình riêng để nhận diện thiết bị:
1. Chờ thiết bị ổn định (Debouncing)
2. Gửi lệnh Reset để thiết bị về trạng thái mặc định
3. Gửi lệnh GET_DESCRIPTOR hai lần
🔹 Lần đầu để kiểm tra kích thước packet hỗ trợ.
🔹 Lần hai để lấy thông tin đầy đủ.
4. Gửi lệnh Reset lần nữa để tránh lỗi thiết bị
5. Tự động cài đặt driver nếu cần

Hệ điều hành Windows cũng hỗ trợ các descriptor đặc biệt (OS Descriptor) giúp cài đặt thiết bị tự động và nhanh chóng.

Hình 14. Quá trình nhận diện USB của hệ điều hành Windows
Hình 14. Quá trình nhận diện USB của hệ điều hành Windows

Windows có một cơ chế riêng để nhận diện và cài đặt driver cho các thiết bị USB mà không cần người dùng can thiệp.
🔹 Descriptor (mô tả thiết bị) là một tập hợp các thông tin giúp hệ điều hành hiểu thiết bị USB là gì, thuộc loại nào, cần driver gì để hoạt động.
🔹 OS Descriptor là một dạng mô tả đặc biệt chỉ có trên Windows, chứa thông tin giúp hệ điều hành tự động nhận diện và cấu hình thiết bị.
🔹 Điều này giúp thiết bị USB plug and play (cắm vào là dùng được) mà không cần cài đặt thủ công.
Ví dụ: Khi bạn cắm một chuột USB mới, Windows có thể tự tìm driver phù hợp và cài đặt ngay lập tức nhờ OS Descriptor của thiết bị đó.

Hình 15. Định dạng để yêu cầu nhận OS descriptor
Hình 15. Định dạng để yêu cầu nhận OS descriptor

Lớp USB Class

Như đã giới thiệu trước đó, một thiết bị USB có thể thực hiện nhiều chức năng logic khác nhau. Lớp thiết bị cho phép host gửi yêu cầu USB đến một chức năng cụ thể thông qua endpoint. Mỗi chức năng tuân theo một giao thức lớp USB được xác định trước để xử lý các yêu cầu USB. Một số giao thức USB chuẩn bao gồm:

a. HID (Human Interface Device):

Dành cho các thiết bị giao tiếp với con người như bàn phím, chuột, tay cầm chơi game.

b. CDC (Communications Device Class):

Giả lập cổng UART ảo, giúp giao tiếp với các thiết bị sử dụng RS-232, modem, máy fax, thiết bị điện thoại.

c. PHDC (Personal Healthcare Device Class):

Hỗ trợ thiết bị y tế cá nhân như máy đo huyết áp, máy đo đường huyết, thiết bị theo dõi tim mạch. Lớp này bổ sung meta-data để đảm bảo độ trễ thấp và độ tin cậy cao khi truyền dữ liệu.

d. MSC (Mass Storage Class):

Giao thức truy cập thiết bị lưu trữ. Hầu hết USB Flash hiện nay sử dụng bulk transfer để đạt băng thông cao. Một tính năng quan trọng là khả năng khởi động (bootability), cho phép máy tính khởi động từ USB thay vì ổ cứng.

e. Audio Class:

Sử dụng isochronous transfer để truyền dữ liệu âm thanh liên tục. USB tốc độ cao (full-speed) có thể truyền 0-1023 byte mỗi khung 1ms.
Tuy nhiên, isochronous transfer không có cơ chế kiểm tra lỗi, nên có thể xảy ra lỗi trong quá trình truyền dữ liệu.

f. Video Class:

Hỗ trợ truyền phát video theo thời gian thực, thường dùng cho webcam. Tương tự Audio Class, lớp này cũng sử dụng isochronous transfer. Một thiết bị video cần thực hiện “đàm phán” băng thông (bandwidth negotiation) với host.
Sau khi thiết bị báo cáo băng thông tối đa, host sẽ sử dụng Serial Communication Protocols để chọn giao diện thay thế (alternative interface) nếu cần.
Ví dụ, một camera hỗ trợ nhiều độ phân giải khác nhau có thể cung cấp nhiều giao diện thay thế với yêu cầu băng thông khác nhau.

Xem thêm: Giao thức Serial Peripheral Interface (SPI)

Human Interface Device (HID)

1. HID là gì?

HID (Human Interface Device) là một loại thiết bị giúp con người tương tác với máy tính, ví dụ như: chuột, bàn phím, màn hình cảm ứng, tay cầm chơi game.

2. HID hoạt động như thế nào?

HID không phải là thiết bị cụ thể mà là một giao diện (interface descriptor) giúp máy tính hiểu cách giao tiếp với thiết bị HID.
Mỗi thiết bị HID cần có các Endpoint sau:
🔹 Endpoint 0 (Control Endpoint): Dùng để cấu hình thiết bị.
🔹 Interrupt IN Endpoint: Gửi dữ liệu từ thiết bị đến máy tính (ví dụ: phím bấm trên bàn phím).
🔹 Interrupt OUT Endpoint (tùy chọn): Nhận dữ liệu từ máy tính (ví dụ: bật/tắt đèn LED trên bàn phím).

3. HID Descriptor

Hình 16. HID descriptor
Hình 16. HID descriptor

HID Descriptor giống như “sơ yếu lý lịch” của thiết bị HID, chứa thông tin về: đây là thiết bị gì? (Bàn phím, chuột, tay cầm chơi game…), nó có bao nhiêu nút, cách gửi dữ liệu như thế nào?
HID sử dụng HID Descriptor để định nghĩa cách thiết bị và máy tính trao đổi dữ liệu.

Ví dụ:
Dữ liệu đầu vào (Input Report):
🔹 Phím bấm trên bàn phím.
🔹 Giá trị X/Y từ chuột.
Dữ liệu đầu ra (Output Report):
🔹 Đèn LED báo Caps Lock, Num Lock trên bàn phím.

Khi kết nối với máy tính, HID sẽ gửi HID Descriptor để hệ điều hành biết thiết bị này hoạt động ra sao.

Xem thêm: Tổng quan về Inter-Integrated Circuit (I2C)

4. Report Descriptor – Định dạng dữ liệu

Report Descriptor là một bảng mô tả cách dữ liệu được gửi đi giữa thiết bị và máy tính.
Nó quy định cấu trúc dữ liệu: có bao nhiêu byte, mỗi byte có ý nghĩa gì.

a. Ví dụ về bàn phím HID
Hình 17. Report format của bàn phím
Hình 17. Report format của bàn phím

Bàn phím HID gửi dữ liệu đến máy tính theo một cấu trúc cụ thể.
Cấu trúc dữ liệu của bàn phím (8 byte):

ByteÝ nghĩa
Byte 1Cờ trạng thái (modifier keys: Shift, Ctrl, Alt…)
Byte 2Dự trữ (không sử dụng)
Byte 3Đèn LED báo trạng thái (Caps Lock, Num Lock…)
Byte 4 – 8Mã phím bấm (HID Key Code, không phải ASCII)
Hình 18. HID key codes
Hình 18. HID key codes
b. Ví dụ về chuột HID
Hình 19. Report format của chuột
Hình 19. Report format của chuột

Chuột HID cũng gửi dữ liệu đến máy tính theo một cấu trúc riêng gồm 4 byte:

ByteÝ nghĩa
Byte 1Trạng thái nút chuột (nút trái, nút phải, nút giữa)
Byte 2Dịch chuyển trục X
Byte 3Dịch chuyển trục Y
Byte 4Cuộn chuột (scroll wheel)
Hình 20. Cấu trúc của một HID mouse report descriptor
Hình 20. Cấu trúc của một HID mouse report descriptor

5. Một số yêu cầu đặc biệt của HID

HID có các lệnh đặc biệt để giao tiếp với máy tính, bao gồm:
🔹 GET_REPORT: Yêu cầu nhận báo cáo dữ liệu.
🔹 SET_REPORT: Gửi dữ liệu đến thiết bị HID.
🔹 GET_IDLE / SET_IDLE: Kiểm soát tốc độ gửi báo cáo.
🔹 GET_PROTOCOL / SET_PROTOCOL: Chọn giao thức giao tiếp.

6. Ưu & nhược điểm của HID

🔹 Ưu điểm: Hầu hết hệ điều hành (Windows, Linux, MacOS) đều có sẵn driver cho HID, vì vậy bạn không cần viết phần mềm điều khiển thiết bị trên máy tính.
🔹 Nhược điểm: Băng thông của HID khá thấp. Với tốc độ Full Speed USB (12Mbps), dữ liệu truyền tối đa là 64 byte mỗi mili giây (64KB/s). Điều này khiến HID không phù hợp với các ứng dụng cần tốc độ cao như truyền video.

USB đã trở thành một tiêu chuẩn không thể thiếu trong thế giới công nghệ hiện đại, cung cấp giải pháp kết nối nhanh chóng, tiện lợi và đa năng. Từ những phiên bản đầu tiên đến USB4 ngày nay, chuẩn này không ngừng phát triển để đáp ứng nhu cầu về tốc độ truyền dữ liệu, cấp nguồn và khả năng tương thích giữa các thiết bị. Với sự xuất hiện của các công nghệ như USB-C và Power Delivery, đây không chỉ là một giao thức kết nối mà còn đóng vai trò quan trọng trong hệ sinh thái thiết bị số. Trong tương lai, chúng ta có thể kỳ vọng vào những cải tiến mới, giúp công nghệ này trở nên mạnh mẽ hơn, linh hoạt hơn và tiếp tục là lựa chọn hàng đầu cho các thiết bị điện tử.

Xem thêm: Timer là gì? Ứng dụng của timer trong Hệ thống nhúng

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *