Tổng quan các chuẩn giao tiếp cho vi điều khiển: UART, I2C, SPI, RS-485, CAN và cách chọn
So sánh các chuẩn giao tiếp thường gặp với vi điều khiển: UART, I2C, SPI, 1-Wire, RS-485, CAN, Ethernet và không dây. Giải thích tín hiệu vi sai, ba lớp của một hệ giao tiếp và cách chọn chuẩn theo nhu cầu.
Một mạch vi điều khiển hiếm khi làm việc một mình: nó đọc cảm biến, ghi thẻ nhớ, điều khiển màn hình, trao đổi với máy tính hoặc với các mạch khác. Mỗi việc đó cần một chuẩn giao tiếp, và có khá nhiều chuẩn để chọn: UART, I2C, SPI, 1-Wire, RS-485, CAN, Ethernet cùng các kiểu không dây. Bài viết này đặt các chuẩn đó cạnh nhau để thấy mỗi chuẩn sinh ra cho việc gì và khi nào nên dùng.
Đây là bài mở đầu của loạt bài nền tảng về giao tiếp. Các bài sau đi vào từng chuẩn, có sơ đồ nối dây và chương trình mẫu cho ESP32.
1. Ba câu hỏi trước khi chọn
- Thiết bị cách nhau bao xa? Trên cùng một bo mạch, trong cùng một tủ điện hay cách nhau cả trăm mét là ba bài toán khác nhau.
- Cần truyền nhanh đến đâu? Đọc nhiệt độ mỗi giây một lần cần rất ít; ghi thẻ nhớ hay vẽ màn hình màu cần hàng Mbit/s.
- Có bao nhiêu thiết bị trên cùng đường truyền? Chỉ hai thiết bị, hay vài chục thiết bị dùng chung một cặp dây.
Sau ba câu hỏi này mới đến các yếu tố khác: môi trường có nhiều nhiễu không, số chân còn trống của vi điều khiển, giá linh kiện và thiết bị sẵn có dùng chuẩn gì.
2. So sánh nhanh các chuẩn
| Chuẩn | Dây tín hiệu | Tốc độ điển hình | Khoảng cách điển hình | Số thiết bị | Thường dùng cho |
|---|---|---|---|---|---|
| UART (mức TTL) | TX, RX | 9,6 đến 921,6 kbit/s | Dưới vài mét | 2 | Module GPS, Bluetooth, nối hai vi điều khiển, cổng nạp chương trình |
| I2C | SDA, SCL | 100 hoặc 400 kbit/s | Trong một bo mạch, dưới khoảng 1 m | Hàng chục, mỗi thiết bị một địa chỉ | Cảm biến, màn hình OLED, đồng hồ thời gian thực |
| SPI | SCK, MOSI, MISO và mỗi thiết bị một dây CS | 1 đến 40 Mbit/s | Trong một bo mạch | Vài thiết bị, giới hạn bởi số chân CS | Thẻ nhớ, màn hình màu, module vô tuyến |
| 1-Wire | Một dây dữ liệu | Khoảng 16 kbit/s | Hàng chục mét | Nhiều, mỗi thiết bị có mã 64 bit | Cảm biến nhiệt độ |
| RS-485 | Cặp dây A, B | 9,6 đến 115,2 kbit/s | Tới khoảng 1200 m ở tốc độ thấp | 32 tải chuẩn trên một đoạn dây | Thiết bị công nghiệp, Modbus RTU |
| CAN | Cặp dây CAN_H, CAN_L | 125 kbit/s đến 1 Mbit/s | Khoảng 40 m ở 1 Mbit/s, 500 m ở 125 kbit/s | Hàng chục nút | Ô tô, máy móc, robot |
| Ethernet | Hai cặp dây | 10 hoặc 100 Mbit/s | 100 m mỗi đoạn | Theo mạng LAN | Modbus TCP, MQTT, web |
| Không dây | Không | Tùy công nghệ | Vài mét đến vài km | Tùy công nghệ | Wi-Fi, BLE, ESP-NOW, LoRa, RF 433 MHz |
Mọi chuẩn có dây đều cần thêm một dây GND chung giữa các thiết bị, trừ khi tín hiệu được cách ly.
3. Có dây clock hay không
- Không đồng bộ (UART, RS-485, CAN): không có dây clock. Hai bên phải thống nhất trước tốc độ truyền; bên nhận tự canh thời điểm đọc từng bit. Đặt sai tốc độ thì nhận được toàn ký tự vô nghĩa.
- Đồng bộ (I2C, SPI): có một dây clock do thiết bị chủ phát. Bên nhận đọc dữ liệu theo từng nhịp clock nên không cần đặt trước tốc độ chính xác, và truyền được nhanh hơn.
4. Tín hiệu đơn cực và tín hiệu vi sai
- Đơn cực: mỗi tín hiệu đi trên một dây, mức điện so với GND. UART mức TTL, I2C, SPI và 1-Wire thuộc loại này. Dây càng dài càng dễ bắt nhiễu và càng chênh lệch điện áp GND giữa hai đầu.
- Vi sai: tín hiệu đi trên hai dây xoắn vào nhau, mang hai mức ngược nhau; bộ thu chỉ quan tâm hiệu điện áp giữa hai dây. Nhiễu tác động lên cả hai dây gần như nhau nên bị trừ mất. RS-485, CAN và Ethernet dùng cách này.
5. Ai được quyền gửi?
- Điểm nối điểm: UART chỉ nối hai thiết bị, mỗi bên có đường gửi riêng nên gửi lúc nào cũng được.
- Một chủ, nhiều tớ: I2C, SPI và Modbus có một thiết bị chủ (master) điều khiển. Thiết bị tớ (slave) chỉ trả lời khi được hỏi, nhờ vậy không bao giờ có hai thiết bị gửi cùng lúc.
- Nhiều nút ngang hàng: trên CAN, nút nào cũng có thể chủ động gửi. Khi hai nút gửi cùng lúc, khung tin có mã nhận dạng nhỏ hơn được ưu tiên, khung còn lại tự gửi lại sau.
6. Dây dẫn, cách gửi byte và giao thức là ba chuyện khác nhau
- Lớp vật lý: loại dây và mức điện. Ví dụ RS-485 quy định cặp dây vi sai và mức điện, không quy định nội dung dữ liệu.
- Lớp truyền byte: cách đóng gói từng byte hoặc từng khung thành chuỗi bit. Ví dụ UART thêm bit bắt đầu và bit kết thúc quanh mỗi byte.
- Lớp giao thức: ý nghĩa của các byte. Ví dụ Modbus quy định byte nào là địa chỉ, byte nào là mã hàm, hai byte cuối là mã kiểm tra.
Nhiều nhầm lẫn bắt nguồn từ việc trộn các lớp với nhau. Modbus RTU không phải một loại dây: đó là giao thức, thường chạy trên UART và RS-485. Giữ nguyên giao thức nhưng đổi hai lớp dưới thành TCP/IP và Ethernet thì có Modbus TCP.
7. Gợi ý chọn chuẩn
- Trên cùng bo mạch: I2C khi có nhiều cảm biến và ít chân; SPI khi cần tốc độ; UART khi hai thiết bị trao đổi lệnh dạng chuỗi.
- Dây dài, nhiều nhiễu: RS-485 với Modbus RTU là lựa chọn phổ biến nhất trong công nghiệp; CAN khi nhiều nút cần chủ động gửi và cần tự phát hiện lỗi; Ethernet khi đã có mạng LAN.
- Không kéo được dây: Wi-Fi khi có router và cần lên Internet; BLE khi nối với điện thoại; ESP-NOW khi các mạch ESP32 nói chuyện trực tiếp; LoRa khi cần đi xa với lượng dữ liệu nhỏ.
Một hệ thống thực tế thường dùng vài chuẩn cùng lúc. Ví dụ một bộ thu thập dữ liệu đọc cảm biến qua I2C, ghi thẻ nhớ qua SPI, nói chuyện với biến tần qua RS-485 và gửi số liệu lên máy chủ qua Wi-Fi.
8. ESP32 có sẵn những gì?
| Giao tiếp | Trên ESP32 | Cần thêm |
|---|---|---|
| UART | 3 cổng; cổng 0 dùng để nạp chương trình và Serial Monitor | Không |
| I2C | 2 bộ, gán được vào hầu hết các chân | Điện trở kéo lên nếu module chưa có |
| SPI | 2 bộ dùng tự do (VSPI, HSPI) | Không |
| 1-Wire | Dùng một chân GPIO bất kỳ | Điện trở kéo lên 4,7 kΩ |
| RS-485 | Dùng một cổng UART | Module chuyển đổi RS-485 |
| CAN | Có bộ điều khiển CAN (tên là TWAI) | Module thu phát CAN |
| Ethernet | Có bộ điều khiển Ethernet | Module Ethernet |
| Không dây | Wi-Fi, Bluetooth, BLE, ESP-NOW | LoRa, RF 433 MHz cần module riêng |
Các mạch ESP32 làm việc ở mức 3,3 V. Khi nối với thiết bị 5 V phải xem lại mức logic, đề tài của một bài riêng trong loạt này.
9. Lộ trình của loạt bài
- Trên bo mạch: UART, I2C, SPI, 1-Wire, mức logic 3,3 V và 5 V.
- Nền chung: kiểm tra lỗi bằng parity, checksum, CRC; tự thiết kế khung tin trên UART.
- Công nghiệp: RS-485, Modbus RTU, TCP và UDP, Modbus TCP/IP, CAN, vòng dòng 4–20 mA.
- Không dây: RF 433 MHz, hồng ngoại, Bluetooth Low Energy.
Xem thêm