
Giới thiệu về CAN bus
1. CAN bus là gì?
Hãy tưởng tượng chiếc xe của bạn như một cơ thể con người:
🔹 Hệ thống dây thần kinh chính là CAN bus, giúp các bộ phận giao tiếp với nhau.
🔹 Các bộ phận trên cơ thể chính là các nút (nodes) hay các bộ điều khiển điện tử (ECU – Electronic Control Unit).
Ví dụ: Khi bạn đạp phanh, ECU phanh sẽ gửi thông tin lên CAN bus. ECU túi khí có thể nhận thông tin này và chuẩn bị kích hoạt trong trường hợp khẩn cấp.
2. ECU là gì?
ECU là các bộ điều khiển điện tử trong xe, mỗi ECU đảm nhận một chức năng cụ thể như:
🔹 Bộ điều khiển động cơ
🔹 Hệ thống phanh ABS
🔹 Hệ thống túi khí
🔹 Hệ thống âm thanh
Một chiếc xe hiện đại có thể có tới 70 ECU, và chúng cần giao tiếp với nhau. CAN bus giúp truyền tải thông tin này một cách dễ dàng mà không cần quá nhiều dây nối phức tạp.
Bên trong một ECU (Electronic Control Unit – Bộ điều khiển điện tử) có ba thành phần chính:
Vi điều khiển (Microcontroller – MCU) đóng vai trò là “bộ não”, giải mã thông điệp CAN nhận được, xử lý dữ liệu và quyết định gửi thông điệp nào lên CAN bus. Ví dụ, một cảm biến có thể được lập trình để đo và phát nhiệt độ dầu với tần số 5 Hz.
Bộ điều khiển CAN (CAN Controller) thường được tích hợp trong vi điều khiển, giúp đảm bảo tất cả dữ liệu truyền đi tuân thủ giao thức CAN. Nó thực hiện việc mã hóa thông điệp, kiểm tra lỗi và xử lý tranh chấp bus (arbitration), giúp nhiều ECU có thể truyền dữ liệu mà không bị xung đột.
Bộ thu phát CAN (CAN Transceiver) kết nối bộ điều khiển với hệ thống dây CAN bus, chuyển đổi dữ liệu từ bộ điều khiển thành tín hiệu vi sai trên bus và ngược lại. Nó cũng cung cấp khả năng bảo vệ điện áp, đảm bảo giao tiếp ổn định giữa các ECU.
Xem thêm: Hiểu về Direct Memory Access (DMA)
3. CAN bus hoạt động như thế nào?
Mỗi ECU có thể giao tiếp với tất cả các ECU khác mà không cần hệ thống dây nối phức tạp.
Thay vì từng ECU phải kết nối trực tiếp với nhau, chúng cùng sử dụng chung một đường truyền gọi là CAN bus (gồm hai dây: CAN Low và CAN High).
Cách hoạt động:
🔹 Một ECU chuẩn bị dữ liệu (ví dụ: cảm biến đo tốc độ gửi dữ liệu tốc độ xe).
🔹 ECU này phát dữ liệu lên bus.
🔹 Tất cả ECU khác có thể “nghe” dữ liệu này.
🔹 Mỗi ECU sẽ kiểm tra dữ liệu và quyết định nhận hoặc bỏ qua tùy theo nhiệm vụ của nó.
Ví dụ thực tế:
🔹 Cảm biến tốc độ gửi dữ liệu lên bus.
🔹 ECU động cơ có thể nhận dữ liệu này để điều chỉnh hiệu suất.
🔹 ECU hệ thống giải trí có thể hiển thị tốc độ xe trên màn hình.
Nhờ cơ chế này, CAN bus giúp truyền thông tin nhanh chóng, ổn định, giảm dây nối phức tạp và tối ưu hệ thống xe hơi hiện đại.
Vậy: Hệ thống CAN bus cho phép mỗi ECU có thể giao tiếp với tất cả các ECU khác mà không cần phải kết nối trực tiếp từng dây một với nhau. Thay vì phải kéo nhiều dây riêng biệt giữa các ECU, tất cả đều sử dụng chung một đường truyền dữ liệu duy nhất, giúp giảm sự phức tạp trong hệ thống dây điện.
Các chân kết nối
Không có một tiêu chuẩn chung cho đầu nối CAN bus trên tất cả các ứng dụng. Điều này có nghĩa là các phương tiện hoặc máy móc khác nhau có thể sử dụng các đầu nối khác nhau.
Tuy nhiên, một lựa chọn phổ biến là đầu nối DB9 (D-sub9), còn được gọi là CANopen CiA 303-1. Đây đã trở thành tiêu chuẩn thực tế cho nhiều ứng dụng, bao gồm bộ ghi dữ liệu CAN (CAN logger) và bộ giao tiếp CAN (CAN interface).
Xem thêm: Quad Serial Peripheral Interface (Quad-SPI) là gì?
Tiêu chuẩn ISO của CAN bus
1. Tiêu chuẩn ISO là gì?
Tiêu chuẩn ISO 11898 giúp quy định cách thức CAN bus hoạt động, đảm bảo các thiết bị từ nhiều hãng khác nhau có thể giao tiếp với nhau một cách đồng bộ và ổn định.
ISO 11898-1 (Tầng liên kết dữ liệu – Data Link Layer)
🔹 Quy định cách dữ liệu được đóng gói và gửi đi trong mạng CAN.
🔹 Đảm bảo tất cả ECU trên mạng hiểu và xử lý dữ liệu theo cùng một cách.
ISO 11898-2 (Tầng vật lý – Physical Layer)
🔹 Quy định về phần cứng, dây dẫn, tín hiệu điện áp,… giúp đảm bảo tín hiệu truyền ổn định.
2. Một số quy định quan trọng
Tốc độ truyền dữ liệu (Baud rate):
🔹 CAN thông thường (Classical CAN): Tốc độ tối đa 1 Mbit/s.
🔹 CAN mở rộng (CAN FD – Flexible Data Rate): Tốc độ tối đa 5 Mbit/s.
Hiểu đơn giản: CAN FD nhanh hơn Classical CAN → Giúp truyền nhiều dữ liệu hơn trong cùng một khoảng thời gian.
Chiều dài cáp tối đa (càng nhanh thì cáp càng ngắn):
🔹 125 kbit/s → Dây dài tối đa 500m.
🔹 1 Mbit/s → Dây dài tối đa 40m.
Hiểu đơn giản: Tốc độ càng cao thì dây phải càng ngắn để tránh nhiễu và mất tín hiệu.
Điện trở kết thúc (Termination resistor):
🔹 Cần có hai điện trở 120Ω ở hai đầu dây để tránh phản xạ tín hiệu gây lỗi dữ liệu.
Hiểu đơn giản: Điện trở giúp “kết thúc” tín hiệu gọn gàng, tránh bị dội lại gây nhiễu mạng.
Xem thêm: Giao thức truyền thông Local Interconnect Network (LIN)
CAN frame là gì?
Dữ liệu trên CAN bus được truyền qua CAN Frame (khung dữ liệu CAN).
1. Hai loại CAN Frame chính
🔹 CAN 2.0A (ID 11-bit) – Thường dùng trên ô tô.
🔹 CAN 2.0B (ID 29-bit) – Dùng trong xe tải, máy móc nặng (chuẩn J1939).
2. 8 Trường dữ liệu trong một CAN Frame
SOF (Start of Frame – Bắt đầu khung): Một bit 0 (dominant) báo hiệu một ECU sắp gửi dữ liệu.
ID (Identifier – Định danh khung):
🔹 Xác định ECU nào gửi dữ liệu.
🔹 ID nhỏ hơn → Ưu tiên cao hơn trên mạng CAN.
RTR (Remote Transmission Request – Yêu cầu truyền dữ liệu):
🔹 Nếu là 0: Gửi dữ liệu.
🔹 Nếu là 1: Yêu cầu ECU khác gửi dữ liệu.
Control (Điều khiển):
🔹 Chứa bit IDE (xác định khung 11-bit hay 29-bit).
🔹 Chứa DLC (Data Length Code) xác định số byte dữ liệu (0-8 byte).
Data (Dữ liệu):
🔹 Chứa tối đa 8 byte dữ liệu (payload).
🔹 Dữ liệu này có thể là giá trị cảm biến, trạng thái hệ thống, v.v.
CRC (Cyclic Redundancy Check – Kiểm tra lỗi):
🔹 Đảm bảo dữ liệu không bị lỗi trong quá trình truyền.
ACK (Acknowledgment – Xác nhận dữ liệu):
🔹 Nếu ECU nhận đúng dữ liệu, nó gửi tín hiệu ACK để xác nhận.
EOF (End of Frame – Kết thúc khung)
🔹 Đánh dấu cuối khung dữ liệu, giúp CAN bus sẵn sàng nhận khung tiếp theo.
3. 4 biến thể của CAN frame
🔹 Data frame: Đây là khung dữ liệu chính, mang thông tin từ một nút gửi đến một hoặc nhiều nút nhận. Hơn 99% ứng dụng thực tế tập trung vào loại khung này.
🔹 Error frame: Được sử dụng khi một nút phát hiện lỗi trong quá trình truyền thông. Nó chứa cờ lỗi (error flag) và dấu phân tách lỗi (error delimiter), thường được dùng để chẩn đoán lỗi giao tiếp giữa các ECU.
🔹 Remote frame: Dùng để yêu cầu dữ liệu từ một nút khác. Nó giống với data frame nhưng không có trường Data, và trường RTR được đặt là 1 (recessive). Tuy nhiên, loại khung này rất ít được sử dụng, vì hầu hết các giao thức tầng cao (như OBD2, J1939) đều dựa vào data frame để yêu cầu dữ liệu.
🔹 Overload frame: Dùng để tạo thêm khoảng trễ giữa các khung nếu một số nút CAN cần thêm thời gian xử lý. Tuy nhiên, nó hầu như không được sử dụng trong thực tế.
Xem thêm: Tổng quan về giao thức Improved inter-integrated circuit (I3C)
Các giao thức tầng cao của CAN bus
CAN bus giống như một hệ thống giao tiếp cơ bản, giúp các thiết bị (ECU) truyền dữ liệu với nhau. Tuy nhiên, CAN chỉ quy định cách gửi và nhận dữ liệu, chứ không hướng dẫn cách hiểu và xử lý dữ liệu. Vì vậy, nhiều giao thức tầng cao được phát triển để quy định cụ thể cách thiết bị trao đổi dữ liệu với nhau trong từng lĩnh vực khác nhau.
1. OBD2 (On-Board Diagnostics 2) → Chẩn đoán lỗi ô tô
- Được dùng trong xe hơi để kiểm tra lỗi, bảo trì và kiểm tra khí thải.
- Nó giúp máy quét lỗi hiển thị mã lỗi khi xe gặp vấn đề.
- Ví dụ: Khi đèn “Check Engine” sáng, thợ sửa xe có thể cắm máy OBD2 vào xe để đọc mã lỗi và tìm nguyên nhân hỏng hóc.
2. UDS (Unified Diagnostic Services) → Chẩn đoán và cập nhật ECU
- Giao thức này giúp các xưởng sửa chữa kiểm tra lỗi sâu hơn trong hệ thống xe.
- Ngoài ra, nó còn hỗ trợ nâng cấp phần mềm (firmware) cho ECU mà không cần tháo rời thiết bị.
3. CCP/XCP (CAN Calibration Protocol / Universal Measurement and Calibration Protocol) → Đọc/ghi dữ liệu ECU
- Dùng trong quá trình hiệu chỉnh và đo lường thông số từ ECU, giúp các kỹ sư điều chỉnh hiệu suất động cơ.
- Ví dụ: Khi chế tạo xe mới, kỹ sư có thể tăng công suất động cơ bằng cách điều chỉnh phần mềm của ECU.
4. CANopen → Tự động hóa công nghiệp
- Dùng trong các nhà máy, dây chuyền sản xuất, giúp các máy móc có thể kết nối với nhau mà không cần thiết kế riêng lẻ.
- Ví dụ: Một cánh tay robot và băng chuyền có thể giao tiếp qua CANopen để đồng bộ hóa chuyển động.
5. J1939 (SAE J1939) → Giao tiếp trên xe tải, xe buýt
- Dùng trên xe tải, xe buýt, máy kéo, giúp quản lý dữ liệu tốc độ, mức nhiên liệu, hệ thống phanh.
- Ví dụ: Công ty quản lý xe tải có thể giám sát mức nhiên liệu và hiệu suất xe từ xa.
6. NMEA 2000 → Giao tiếp trên tàu thuyền
- Dùng trong hàng hải, kết nối cảm biến, động cơ và thiết bị điều hướng trên tàu thuyền.
- Ví dụ: Một hệ thống NMEA 2000 có thể thu thập dữ liệu từ cảm biến gió, nhiệt độ, radar và GPS để giúp thuyền trưởng điều khiển tàu tốt hơn.
7. ISOBUS (ISO 11783) → Giao tiếp trên máy nông nghiệp
- Giúp máy kéo và các thiết bị nông nghiệp của nhiều hãng khác nhau có thể kết nối và làm việc chung.
- Ví dụ: Máy kéo có thể tự động điều chỉnh lượng phân bón khi kết nối với hệ thống phun phân ISOBUS.
Các giao thức Lower-layer vs các giao thức higher-layer
1. So sánh CAN bus với giao tiếp giữa con người
CAN bus giống như dây thanh quản và khả năng phát âm, cung cấp phương tiện để truyền tín hiệu.
Giao thức lớp cao hơn giống như các ngôn ngữ (tiếng Anh, tiếng Đức, v.v.), sử dụng bảng chữ cái và ngữ pháp để tạo thành câu có nghĩa.
2. Những điểm quan trọng
Luôn cần có giao thức lớp cao hơn:
🔹 Nếu chỉ có CAN bus mà không có giao thức lớp cao hơn, thì giống như nói chuyện không có ngôn ngữ, chỉ là những âm thanh vô nghĩa.
Có hàng ngàn giao thức lớp cao hơn:
🔹 Giống như có nhiều ngôn ngữ trên thế giới, cũng có nhiều giao thức CAN khác nhau, bao gồm cả những giao thức tùy chỉnh của nhà sản xuất.
🔹 Ví dụ: Một mô-đun cảm biến nhiệt CAN có thể sử dụng một giao thức đơn giản chỉ để gửi thông tin về nhiệt độ.
Ghi dữ liệu không đồng nghĩa với hiểu dữ liệu:
🔹 Một máy ghi âm có thể thu âm mọi cuộc trò chuyện, nhưng để hiểu nội dung, bạn cần biết ngôn ngữ đó.
🔹 Tương tự, một thiết bị ghi dữ liệu CAN có thể ghi lại toàn bộ dữ liệu trên CAN bus, nhưng để giải mã nó, bạn cần biết giao thức lớp cao hơn.
Một hệ thống có thể sử dụng nhiều giao thức cùng lúc:
🔹 Một chiếc ô tô thường dùng giao thức CAN riêng của hãng để trao đổi dữ liệu giữa các ECU.
🔹 Nhưng ngoài ra, nó cũng có thể giao tiếp bằng OBD2 hoặc UDS khi cần chẩn đoán hoặc kiểm tra khí thải.
Khả năng tương thích giữa các hệ thống:
🔹 Việc sử dụng giao thức lớp cao hơn tiêu chuẩn giúp các hệ thống khác nhau có thể làm việc với nhau.
🔹 Ví dụ: Nếu bạn hiểu giao thức J1939, bạn có thể sử dụng nó trong nhiều ứng dụng khác nhau mà không cần tùy chỉnh nhiều.
Cách xuất dữ liệu thô từ CAN bus
1. Chọn phần cứng phù hợp
- CAN-to-USB: Dùng bộ chuyển CAN-USB để xem dữ liệu theo thời gian thực, phù hợp cho chẩn đoán lỗi tại chỗ hoặc đảo ngược giao thức.
- CAN-to-SD: Sử dụng bộ ghi dữ liệu CAN có thẻ nhớ SD để thu thập lỗi không liên tục hoặc lưu dữ liệu làm hộp đen.
- CAN-to-cloud: Dùng logger kết nối Internet để tải dữ liệu lên server, hỗ trợ giám sát từ xa, bảo trì dự đoán và phân tích dữ liệu.
2. Chọn cáp kết nối phù hợp
Xe hơi: Dùng cổng OBD2 để ghi dữ liệu CAN thô hoặc thực hiện các yêu cầu OBD2/UDS.
Xe hạng nặng: Dùng cáp J1939 (đầu nối deutsch 9-pin) để lấy dữ liệu J1939.
Tàu biển: Dùng cổng M12 để ghi dữ liệu theo chuẩn NMEA 2000.
CANopen: Dùng đầu nối DB9 theo chuẩn CiA 303-1.
Thiết bị đọc không tiếp xúc: Như CANCrocodile, giúp ghi dữ liệu từ dây CAN mà không cần cắm trực tiếp.
Các kết nối khác: Đôi khi cần tự làm cáp chuyển đổi tùy ứng dụng.
3. Cấu hình và kết nối thiết bị
Trước khi kết nối, bạn cần kiểm tra:
- Tốc độ baud-rate: Phải trùng với tốc độ của hệ thống CAN. Một số logger có thể tự động phát hiện baud-rate.
- Gửi yêu cầu dữ liệu: Nếu bạn cần dữ liệu theo yêu cầu (ví dụ: OBD2/UDS), bạn phải cấu hình thiết bị để gửi lệnh truy vấn.
4. Xem lại dữ liệu CAN thô

Dữ liệu CAN có thể được lưu ở định dạng nhị phân (MF4) hoặc CSV, rồi giải mã bằng phần mềm chuyên dụng.
Ví dụ dữ liệu CAN thô từ xe tải nặng (J1939):TimestampEpoch;BusChannel;ID;IDE;DLC;DataLength;Dir;EDL;BRS;DataBytes
1578922367.777150;1;14FEF131;1;8;8;0;0;0;CFFFFFF300FFFF30
1578922367.777750;1;10F01A01;1;8;8;0;0;0;2448FFFFFFFFFFFF
1578922367.778300;1;CF00400;1;8;8;0;0;0;107D82BD1200F482
1578922367.778900;1;14FF0121;1;8;8;0;0;0;FFFFFFFFFFFFFCFF
Lưu ý:
🔹 CAN ID và DataBytes được lưu ở hexadecimal (hệ 16).
🔹 Thời gian (TimestampEpoch) giúp đồng bộ dữ liệu theo thời gian thực.
Xem thêm: Tổng quan về Universal Asynchronous Receiver and Transmitter (UART)
Cách giải mã dữ liệu CAN thô thành giá trị thực tế
Dữ liệu CAN gốc không thể đọc trực tiếp mà cần được giải mã để chuyển thành các đơn vị kỹ thuật (km/h, độ C, v.v.). Điều này yêu cầu tệp DBC và công cụ phần mềm phù hợp.
Dưới đây là quy trình giải mã dữ liệu CAN qua 3 bước:
1. Hiểu về trích xuất tín hiệu CAN
Mỗi khung tin CAN chứa các tín hiệu CAN trong trường dữ liệu.
Để trích xuất giá trị thực tế từ một tín hiệu CAN, cần biết:
🔹 Byte order: Kiểu mã hóa dữ liệu (Intel/Little Endian hoặc Motorola/Big Endian)
🔹 Bit start: Vị trí bit bắt đầu của tín hiệu
🔹 Bit length: Độ dài tín hiệu (tính theo bit)
🔹 Offset: Giá trị dịch chuyển
🔹 Scale: Hệ số nhân để chuyển đổi sang giá trị thực tế
Công thức chuyển đổi:
Giá trị thực tế = Offset + Scale x (Giá trị thô)
Sau khi trích xuất đúng các bit dữ liệu, ta chuyển đổi sang giá trị thực tế bằng công thức trên.
Từ ví dụ ở hình 10, sau khi lấy được giá trị raw = 153, ta áp dụng công thức.
Dựa vào thông tin trong DBC:
🔹 Offset = -128
🔹 Scale = 1
Thay vào công thức:
Giá trị thực tế = Offset + Scale x (Giá trị thô) = -128 + 1 * 153 = 25°C
Kết quả: Nhiệt độ thực tế của cảm biến là 25°C
Xem thêm: Giao thức Serial Peripheral Interface (SPI)
2. Lấy tệp DBC phù hợp
a. Tại sao cần tệp DBC phù hợp?
Dữ liệu CAN thô không có ý nghĩa nếu không biết cách giải mã. Mỗi tín hiệu trong một khung tin CAN (CAN frame) được mã hóa theo một quy tắc cụ thể, bao gồm thứ tự byte (byte order), vị trí bit bắt đầu (bit start), độ dài bit (bit length), giá trị lệch (offset), hệ số tỉ lệ (scale).
Tệp DBC (Database CAN) là một tệp văn bản chứa thông tin này, giúp phần mềm có thể chuyển đổi dữ liệu CAN thô thành giá trị thực tế (ví dụ: tốc độ km/h, nhiệt độ °C).
b. Làm sao để có tệp DBC?
Nếu bạn là OEM (nhà sản xuất gốc), bạn có thể đã có DBC hoặc thông tin để tạo ra nó.
Nếu bạn không phải OEM, bạn có thể thử:
🔹 Kiểm tra tài liệu sản phẩm: Một số thiết bị (ví dụ: cảm biến CAN) cung cấp sẵn DBC.
🔹 Yêu cầu OEM: Nhà sản xuất có thể cung cấp DBC toàn phần hoặc một phần.
🔹 Sử dụng DBC tiêu chuẩn: Một số chuẩn công nghiệp có DBC sẵn, ví dụ: J1939 DBC (xe tải, máy công trình, OBD2 DBC (ô tô con), NMEA 2000 DBC (tàu biển), ISOBUS DBC (máy nông nghiệp)
🔹 Reverse Engineering: Tìm kiếm các tệp DBC đã được dịch ngược cho xe hơi hoặc tự giải mã dữ liệu.
🔹 Dùng cảm biến-CAN: Một số cảm biến-CAN có thể giúp ghi lại dữ liệu (ví dụ: GPS, nhiệt độ) mà không cần DBC OEM.
Xem thêm: Tổng quan về Inter-Integrated Circuit (I2C)
3. Dùng phần mềm để giải mã
Sau khi có file DBC, bạn cần một phần mềm để áp dụng DBC vào dữ liệu CAN và chuyển đổi thành giá trị thực tế. Một số công cụ phổ biến:
🔹 asammdf GUI: Phân tích, kiểm tra lỗi, xuất file dữ liệu
🔹 Grafana Dashboard: Hiển thị dữ liệu CAN dưới dạng đồ thị, báo cáo
🔹 Python (có thư viện như cantools, canmatrix): Tự động phân tích và xử lý dữ liệu lớn
🔹 MATLAB: Dùng để phân tích thống kê chuyên sâu
Controller Area Network (CAN) bus đóng vai trò quan trọng như hệ thần kinh trung ương của ô tô hiện đại, giúp các bộ điều khiển điện tử (ECU) giao tiếp hiệu quả mà không cần hệ thống dây phức tạp. Bài viết đã giải thích cấu trúc, nguyên lý hoạt động, các tiêu chuẩn ISO, định dạng CAN frame và những giao thức tầng cao như OBD2, UDS, J1939. Ngoài ra, các phương pháp ghi và giải mã dữ liệu CAN cũng được đề cập để hỗ trợ phân tích và chẩn đoán hệ thống. Nhờ CAN bus, ô tô trở nên thông minh hơn, nâng cao hiệu suất và an toàn vận hành.
Xem thêm: Timer là gì? Ứng dụng của timer trong Hệ thống nhúng