2 điểm bởi GN⁺ 2024-06-04 | 1 bình luận | Chia sẻ qua WhatsApp

Hướng dẫn phát triển thiết bị USB

Mục lục

  • Bối cảnh
  • USB là gì?
  • Dây USB
    • Lưu ý về USB-C
    • Truyền dữ liệu qua cặp vi sai
  • USB trên PCB
  • Các tốc độ khác nhau của USB
    • Lưu ý ngắn về tốc độ trên PCB
  • Các lớp giao thức và phần mềm
    • Các lớp thiết bị USB và cách host sử dụng chúng
  • Tạo thiết bị cổng serial
    • Vi điều khiển STM32 và bo mạch Nucleo
    • Cấu hình cổng USB thực tế
    • Viết phần mềm
    • Flash và chạy
  • Kết luận

Bối cảnh

  • Thiết bị USB hữu ích để mở rộng chức năng của máy tính.
  • Mục tiêu của bài viết này là hướng dẫn quy trình tạo một thiết bị USB từ đầu đến cuối.

USB là gì?

  • USB là tiêu chuẩn công nghiệp cho trao đổi dữ liệu và cấp nguồn.
  • USB là bus nối tiếp, trong đó các bit được truyền lần lượt từng bit một.
  • USB không chỉ là một chuẩn kết nối đơn giản mà còn bao gồm cả giao thức truyền thông.

Dây USB

  • Kết nối USB 2.0 có 4 dây chính:
    • Dây +5V: cấp điện từ host đến thiết bị.
    • Dây D-D+: truyền 1 bit dưới dạng một cặp vi sai.
    • Dây GND: đóng vai trò nối đất.

Lưu ý về USB-C

  • USB-C có thể được cắm theo cả hai chiều.
  • USB-C không biểu thị tốc độ hay phiên bản.

Truyền dữ liệu qua cặp vi sai

  • Cặp vi sai sử dụng hai dây để truyền một bit.
  • Cặp vi sai có lợi thế trong việc loại bỏ nhiễu điện áp.

USB trên PCB

  • Khi thêm đầu nối USB vào PCB, cần giữ cho độ dài của cặp vi sai bằng nhau.
  • Các trace của cặp vi sai nên ở gần nhau.
  • Cần duy trì một mức trở kháng nhất định.

Các tốc độ khác nhau của USB

  • USB 2.0 có thể hoạt động ở full-speed (12 Mbit/s) và high-speed (480 Mbit/s).
  • Host và thiết bị sẽ thương lượng tốc độ khi kết nối.

Lưu ý ngắn về tốc độ trên PCB

  • Với full-speed, yêu cầu về trở kháng và độ dài trace có thể bớt nghiêm ngặt hơn.

Các lớp giao thức và phần mềm

  • USB hoạt động giống như một mạng, với nhiều endpoint và cấu hình khác nhau.
  • Host nhận diện và sử dụng thiết bị USB thông qua driver.

Các lớp thiết bị USB và cách host sử dụng chúng

  • Hệ điều hành nhận diện nhiều lớp thiết bị USB khác nhau.
  • Ví dụ như thiết bị lưu trữ dung lượng lớn hoặc thiết bị serial.

Tạo thiết bị cổng serial

  • Hãy thử tạo một thiết bị cổng serial USB đơn giản.
  • Sử dụng vi điều khiển STM32 và bo mạch Nucleo.

Vi điều khiển STM32 và bo mạch Nucleo

  • Sử dụng bo mạch NUCLEO-F103RB.
  • Bo mạch bao gồm bộ nạp/chương trình và vi điều khiển.

Cấu hình cổng USB thực tế

  • Cấu hình cổng USB và đặt jumper để sử dụng nguồn ngoài 5V.
  • Đặt chân PA12PA11 thành USB_DPUSB_DM.
  • Nối điện trở 1.5 kΩ kéo lên ở chân PA12.

Viết phần mềm

  • Cấu hình chế độ thiết bị USB trong STM32CubeIDE.
  • Thiết lập thành thiết bị cổng serial để host có thể nhận diện.
  • Viết mã bật LED trong routine CDC_Receive_FS.

Flash và chạy

  • Build mã và dùng STM32CubeProgrammer để flash lên bo mạch.
  • Kết nối bo mạch với nguồn ngoài 5V và điều khiển LED qua cổng serial.

Kết luận

  • Đã thử tạo một thiết bị cổng serial USB từ đầu đến cuối.
  • Lượng mã boilerplate lớn và cấu hình dựa trên UI của STM32CubeIDE có thể gây bất tiện.
  • Sử dụng SoC chạy Linux có thể là một cách tiếp cận gọn gàng hơn.

Ý kiến của GN⁺

  • Mã boilerplate của STM32CubeIDE: Có thể tạo ra rất nhiều mã boilerplate, khiến việc review code trở nên khó khăn.
  • Cách tiếp cận dựa trên Linux: Dùng SoC Linux có thể mang lại API chuẩn hóa hơn và sự tách biệt mã nguồn gọn gàng hơn.
  • Trở kháng và độ dài trace: Với kết nối USB tốc độ cao, cần chú ý đến trở kháng và độ dài trace.
  • Lợi ích của cặp vi sai: Cặp vi sai có lợi thế trong việc loại bỏ nhiễu điện áp, giúp truyền dữ liệu ổn định.
  • Lựa chọn vi điều khiển: Việc chọn vi điều khiển phù hợp theo từng dự án là rất quan trọng. Ngoài STM32 còn có nhiều lựa chọn khác.

1 bình luận

 
GN⁺ 2024-06-04
Ý kiến trên Hacker News
  • Ý kiến về việc dùng vi điều khiển ST: Đây là một bài viết hay về việc sử dụng USB, nhưng tập trung vào vi điều khiển ST. Gần đây hệ sinh thái ESP32 cung cấp cách tiếp cận cắm là chạy dễ hơn. Với người mới bắt đầu, dùng IC điều khiển USB cơ bản có thể phù hợp hơn so với làm việc tốc độ cao.

  • Kinh nghiệm kiểm thử tuân thủ USB: Khi từng làm kiểm thử tuân thủ USB từ lâu, đã gặp rất nhiều vấn đề ở bài kiểm tra dòng khởi động. Rất dễ tập trung vào thiết kế số tốc độ cao, nhưng trong kiểm thử tuân thủ thì những chi tiết nhỏ lại rất quan trọng.

  • Mẹo liên quan đến USB-C: Cần nối chân CC với điện trở phù hợp. Trong USB 2.0, định tuyến vi sai và trở kháng không phải vấn đề quá lớn. Chỉ cần nối trực tiếp với độ dài tương đương.

  • Đề xuất thay thế STM32: Nếu việc hàn bộ xử lý ARM quá khó, cũng có thể cân nhắc dùng bộ điều khiển nhỏ hơn hoặc thư viện VUSB. Nếu thích lập trình kiểu Arduino, nhiều bo mạch có thể dễ dàng được dùng như thiết bị USB.

  • ESP32 và cách hack giá rẻ: Dù chủ yếu dùng ESP32, vẫn có thể tận dụng bo điều khiển từ bàn phím USB bị bỏ đi để tạo bộ điều khiển tùy chỉnh rẻ và bền.

  • Hỗ trợ nhận hơn 64 byte trên STM32: Có câu hỏi về cách nhận các khung dữ liệu lớn hơn 64 byte. Việc này khó vì cấu hình được nêu trong tài liệu tham chiếu không phải là thanh ghi thông thường.

  • Kinh nghiệm viết mã USB bare-metal: Viết mã USB bare-metal trên MCU phức tạp hơn SPI hay I2C. Tốt nhất là tận dụng tối đa phần mềm do nhà cung cấp cung cấp. Để truyền tốc độ cao, nên dùng bulk transfer và cần kiểm tra các vấn đề ở phía host.

  • Tạo thiết bị USB ảo: Dùng Raspberry Pi để tạo một thiết bị USB ảo và kết nối nó với PC. Đang dùng nó để giả lập máy ảnh MTP nhằm đánh lừa phần mềm.

  • Câu hỏi về bo phát triển hỗ trợ USB 3: Muốn tạo mẫu một USB C monitor sink, nhưng khó tìm được bo có đủ năng lực để nhận DisplayPort.

  • Chi phí sử dụng USB: USB không miễn phí. Cần trả khoản phí một lần $6,000 để lấy vendor ID.