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

Biểu đồ so sánh khoảng cách và tốc độ điển hình của SPI, I2C, UART, 1-Wire, Ethernet, CAN, RS-485, Wi-Fi, BLE và LoRa
Khoảng cách và tốc độ điển hình của các chuẩn (giá trị dùng để so sánh, không phải giới hạn tuyệt đối).
ChuẩnDây tín hiệuTốc độ điển hìnhKhoảng cách điển hìnhSố thiết bịThường dùng cho
UART (mức TTL)TX, RX9,6 đến 921,6 kbit/sDưới vài mét2Module GPS, Bluetooth, nối hai vi điều khiển, cổng nạp chương trình
I2CSDA, SCL100 hoặc 400 kbit/sTrong một bo mạch, dưới khoảng 1 mHà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
SPISCK, MOSI, MISO và mỗi thiết bị một dây CS1 đến 40 Mbit/sTrong một bo mạchVài thiết bị, giới hạn bởi số chân CSThẻ nhớ, màn hình màu, module vô tuyến
1-WireMột dây dữ liệuKhoảng 16 kbit/sHàng chục métNhiều, mỗi thiết bị có mã 64 bitCảm biến nhiệt độ
RS-485Cặp dây A, B9,6 đến 115,2 kbit/sTới khoảng 1200 m ở tốc độ thấp32 tải chuẩn trên một đoạn dâyThiết bị công nghiệp, Modbus RTU
CANCặp dây CAN_H, CAN_L125 kbit/s đến 1 Mbit/sKhoảng 40 m ở 1 Mbit/s, 500 m ở 125 kbit/sHàng chục nútÔ tô, máy móc, robot
EthernetHai cặp dây10 hoặc 100 Mbit/s100 m mỗi đoạnTheo mạng LANModbus TCP, MQTT, web
Không dâyKhôngTùy công nghệVài mét đến vài kmTù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

So sánh tín hiệu đơn cực và tín hiệu vi sai khi có nhiễu: nhiễu làm sai bit trên đường đơn cực, còn trên đường vi sai nhiễu vào hai dây như nhau nên bị triệt khi lấy hiệu
Cùng một xung nhiễu trên đường truyền đơn cực và đường truyền vi sai (hình vẽ minh họa nguyên lý).
  • Đơ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

Bảng ba lớp của một hệ giao tiếp gồm lớp vật lý, lớp truyền byte và lớp giao thức cho bốn hệ: cảm biến trên bo mạch, Modbus RTU, Modbus TCP và CAN
Ba lớp của bốn hệ giao tiếp thường gặp (hình vẽ minh họa).
  • 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

Bảng gợi ý chọn chuẩn giao tiếp theo ba nhóm nhu cầu: trên cùng bo mạch dùng UART, I2C, SPI, 1-Wire; dây dài dùng RS-485, CAN, Ethernet, 4 đến 20 mA; không dây dùng Wi-Fi, BLE, ESP-NOW, LoRa
Gợi ý chọn chuẩn theo nhu cầu thường gặp (hình vẽ minh họa).
  • 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ếpTrên ESP32Cần thêm
UART3 cổng; cổng 0 dùng để nạp chương trình và Serial MonitorKhông
I2C2 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ó
SPI2 bộ dùng tự do (VSPI, HSPI)Không
1-WireDùng một chân GPIO bất kỳĐiện trở kéo lên 4,7 kΩ
RS-485Dùng một cổng UARTModule chuyển đổi RS-485
CANCó bộ điều khiển CAN (tên là TWAI)Module thu phát CAN
EthernetCó bộ điều khiển EthernetModule Ethernet
Không dâyWi-Fi, Bluetooth, BLE, ESP-NOWLoRa, 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

  1. Trên bo mạch: UART, I2C, SPI, 1-Wire, mức logic 3,3 V và 5 V.
  2. Nền chung: kiểm tra lỗi bằng parity, checksum, CRC; tự thiết kế khung tin trên UART.
  3. Công nghiệp: RS-485, Modbus RTU, TCP và UDP, Modbus TCP/IP, CAN, vòng dòng 4–20 mA.
  4. Không dây: RF 433 MHz, hồng ngoại, Bluetooth Low Energy.

10. Xem thêm


Tin tức liên quan

Bluetooth Low Energy (BLE) là gì: quảng bá, GATT, dịch vụ, đặc tính và ESP32
Bluetooth Low Energy (BLE) là gì: quảng bá, GATT, dịch vụ, đặc tính và ESP32

Giải thích Bluetooth Low Energy: quảng bá và kết nối, cấu trúc GATT gồm dịch vụ, đặc tính, mô tả, UUID. Hướng dẫn cho ESP32 làm thiết bị BLE có đặc tính đọc, ghi, thông báo và thử bằng điện thoại.

Điều khiển hồng ngoại hoạt động thế nào: sóng mang 38 kHz, giao thức NEC và ESP32
Điều khiển hồng ngoại hoạt động thế nào: sóng mang 38 kHz, giao thức NEC và ESP32

Giải thích điều khiển hồng ngoại: sóng mang 38 kHz, mắt thu và giao thức NEC với khung 32 bit, mã lặp. Hướng dẫn tự giải mã phím điều khiển và tự phát lệnh bằng ESP32, không dùng thư viện ngoài.

RF 433 MHz là gì: điều chế ASK/OOK và tự viết giao thức phát, thu bằng ESP32
RF 433 MHz là gì: điều chế ASK/OOK và tự viết giao thức phát, thu bằng ESP32

Giải thích sóng RF 433 MHz và điều chế ASK/OOK, cách mã hóa bit bằng độ rộng xung và khung tin 24 bit. Hướng dẫn tự viết chương trình phát và thu trên hai mạch ESP32, không dùng thư viện ngoài.

Vòng dòng 4-20 mA là gì và cách đọc cảm biến 4-20 mA bằng ESP32
Vòng dòng 4-20 mA là gì và cách đọc cảm biến 4-20 mA bằng ESP32

Giải thích vòng dòng 4-20 mA: vì sao dùng dòng điện, vì sao bắt đầu từ 4 mA, cách đổi ra giá trị đo và ngưỡng báo lỗi. Hướng dẫn đọc bằng ESP32 qua điện trở shunt 120 Ω, với ADC có sẵn và với ADS1115.

CAN bus (phần 2): bộ lọc nhận, tốc độ bit và xử lý lỗi bus-off trên ESP32
CAN bus (phần 2): bộ lọc nhận, tốc độ bit và xử lý lỗi bus-off trên ESP32

Phần 2 về CAN bus với ESP32: đặt bộ lọc nhận theo mã lọc và mặt nạ, chọn tốc độ bit theo chiều dài dây, hiểu ba trạng thái lỗi của nút và viết chương trình theo dõi bộ đếm lỗi, tự hồi phục sau bus-off.

CAN bus (phần 1): tín hiệu, khung tin, phân xử ưu tiên và gửi nhận bằng ESP32
CAN bus (phần 1): tín hiệu, khung tin, phân xử ưu tiên và gửi nhận bằng ESP32

Giải thích CAN bus: hai dây CAN_H, CAN_L, mức trội và mức lặn, khung tin có ID 11 bit, phân xử ưu tiên, CRC và ACK. Kèm hai chương trình ESP32 dùng bộ điều khiển TWAI: tự kiểm tra và hai nút gửi nhận.

Modbus TCP/IP (phần 2): ESP32 làm máy khách và cổng chuyển đổi Modbus TCP sang RTU
Modbus TCP/IP (phần 2): ESP32 làm máy khách và cổng chuyển đổi Modbus TCP sang RTU

Hướng dẫn dùng ESP32 làm máy khách Modbus TCP đọc thanh ghi của một thiết bị trong mạng, và làm cổng chuyển đổi Modbus TCP sang Modbus RTU qua RS-485: cách đổi khung, mã thiết bị, thời gian chờ, mã lỗi 0x0B.

Modbus TCP/IP (phần 1): phần đầu MBAP và ESP32 làm máy chủ qua Wi-Fi
Modbus TCP/IP (phần 1): phần đầu MBAP và ESP32 làm máy chủ qua Wi-Fi

Giải thích Modbus TCP/IP: phần đầu MBAP, cổng 502, điểm khác với Modbus RTU. Kèm chương trình ESP32 làm máy chủ Modbus TCP qua Wi-Fi với 10 thanh ghi giữ và 8 cuộn, tự phân tích khung, không dùng thư viện.


Bình luận
Đã thêm vào giỏ hàng