CAN (Controller Area Network) là một chuẩn giao tiếp truyền thông nối tiếp, ban đầu được Bosch phát triển cho ô tô. Ngày nay CAN được dùng rất rộng rãi trong ô tô, máy công nghiệp, robot, máy đo, biến tần, BMS pin, PLC…
Điểm rất hay của CAN là: nhiều thiết bị có thể cùng nối trên một cặp dây và tự tranh quyền truyền dữ liệu mà không cần một máy chủ trung tâm.
1. Hình dung đơn giản
Ví dụ một chiếc ô tô có:
- ECU động cơ
- ECU hộp số
- ABS
- cụm đồng hồ
- túi khí
- cảm biến
- hệ thống điều hòa
Thay vì mỗi thiết bị phải kéo dây riêng đến nhau, chúng có thể cùng nối vào một CAN Bus:
CAN-H ─────────────────────────────────────
│ │ │ │
ECU ABS TCU Dashboard
│ │ │ │
CAN-L ─────────────────────────────────────
Chỉ cần 2 dây chính:
- CAN-H
- CAN-L
Hai đầu của bus thường có điện trở kết thúc 120 Ω.
2. CAN truyền dữ liệu như thế nào?
Điểm đặc biệt là CAN không truyền kiểu:
“Gửi dữ liệu đến thiết bị số 3.”
Thay vào đó, một message có một ID.
Ví dụ:
ID = 0x100
DATA = 25 00 7A 12 ...
Các thiết bị trên bus đều “nghe” message đó.
Ví dụ:
ECU động cơ
│
│ ID 0x100
│ RPM = 2500
▼
================ CAN BUS ================
│ │ │
ABS TCU Dashboard
Thiết bị nào quan tâm đến ID 0x100 thì lấy dữ liệu.
Đây gọi là message-oriented communication.
3. Tại sao phải dùng hai dây CAN-H và CAN-L?
CAN sử dụng tín hiệu vi sai (differential).
Không đơn giản là:
CAN-H = tín hiệu
CAN-L = GND
mà là:
CAN-H
↑
│ tín hiệu vi sai
│
CAN-L
↓
Hai dây thay đổi điện áp tương đối với nhau.
Trong CAN tốc độ cao, trạng thái thường được hiểu đại khái như:
Recessive
CAN-H ≈ 2.5 V
CAN-L ≈ 2.5 V
CAN-H - CAN-L ≈ 0 V
Dominant
CAN-H ≈ 3.5 V
CAN-L ≈ 1.5 V
CAN-H - CAN-L ≈ 2 V
Giá trị thực tế phụ thuộc transceiver và chuẩn CAN cụ thể.
Ưu điểm của truyền vi sai là khả năng chống nhiễu rất tốt, đặc biệt trong môi trường công nghiệp và ô tô.
4. Điều thú vị nhất: CAN có cơ chế “tranh quyền” rất thông minh
Giả sử cùng lúc có ba thiết bị muốn truyền:
ECU ID = 0x100
ABS ID = 0x080
TCU ID = 0x200
Chúng cùng bắt đầu truyền.
CAN sử dụng CSMA/CR — Carrier Sense Multiple Access with Collision Resolution.
Nhưng nó không để xảy ra kiểu:
hai thiết bị truyền cùng lúc → dữ liệu hỏng → truyền lại.
Thay vào đó, CAN có cơ chế arbitration.
5. CAN dùng Dominant và Recessive
Đây là phần quan trọng nhất để hiểu CAN.
Có hai trạng thái:
Dominant = 0
Recessive = 1
Và:
0 thắng 1
Ví dụ:
Thiết bị A: 0 1 0 1 ...
Thiết bị B: 0 1 1 0 ...
Hai thiết bị bắt đầu truyền.
Đến bit thứ 3:
A: 0
B: 1
Bus sẽ trở thành:
BUS = 0
Thiết bị B nhận ra:
“Tôi đang truyền 1 nhưng bus lại là 0.”
→ B biết rằng mình đã thua arbitration.
B dừng truyền.
A tiếp tục truyền mà không làm hỏng message.
6. Vì vậy ID càng nhỏ thì ưu tiên càng cao
Ví dụ:
ID 0x080
ID 0x100
ID 0x200
Thông thường:
0x080 → ưu tiên cao nhất
0x100 → ưu tiên thứ hai
0x200 → ưu tiên thấp hơn
Điều này cực kỳ hữu ích trong ô tô.
Ví dụ:
ABS báo tốc độ bánh xe
↓
message ưu tiên cao
Thông tin giải trí
↓
message ưu tiên thấp
Nếu cả hai cùng muốn truyền thì message quan trọng hơn sẽ được truyền trước.
7. Một CAN frame gồm những gì?
Một CAN frame cơ bản có dạng:
┌─────┬────────┬─────┬────────┬───────┬─────┐
│ SOF │ ID │ RTR │ DLC │ DATA │ CRC │
└─────┴────────┴─────┴────────┴───────┴─────┘
Có thể hiểu đơn giản:
SOF
Start Of Frame — bắt đầu frame.
ID
Identifier — xác định loại message và mức ưu tiên.
RTR
Cho biết đây là data frame hay remote request trong CAN cổ điển.
DLC
Data Length Code — số byte dữ liệu.
DATA
Dữ liệu thực tế.
CRC
Kiểm tra lỗi.
Ngoài ra còn các trường ACK, EOF…
8. CAN cổ điển truyền được bao nhiêu dữ liệu?
CAN 2.0 thông thường:
ID:
11 bit (Standard)
hoặc
29 bit (Extended)
DATA:
tối đa 8 byte
Ví dụ:
ID: 0x180
DLC: 4
DATA: 12 34 56 78
Có thể hiểu là:
Message 0x180
│
└── 4 byte dữ liệu
12 34 56 78
Ngày nay còn có CAN FD, cho phép payload lớn hơn và tốc độ truyền dữ liệu cao hơn.
9. CAN Controller và CAN Transceiver là hai thứ khác nhau
Đây là kiến thức rất quan trọng nếu bạn muốn làm mạch điện tử.
Ví dụ:
STM32
│
│ CAN peripheral
▼
CAN Controller
│
▼
CAN Transceiver
│
├──── CAN-H
│
└──── CAN-L
Một số MCU như nhiều dòng STM32 đã có CAN controller tích hợp bên trong MCU.
Nhưng MCU không được nối trực tiếp vào CAN-H/CAN-L.
Cần một CAN transceiver.
Ví dụ các IC phổ biến:
- TJA1050
- SN65HVD230
- MCP2551
- TCAN series
10. Ví dụ với STM32 mà bạn đang làm
Nếu sau này bạn muốn dùng STM32F103C8T6 Blue Pill để giao tiếp CAN, kiến trúc có thể là:
STM32F103C8T6
┌─────────────┐
│ │
│ CAN RX/TX │
│ │
└──────┬──────┘
│
CAN Transceiver
│
┌──────┴──────┐
│ │
CAN-H CAN-L
│ │
══════════╪═════════════╪══════════ CAN BUS
│ │
Node 2 Node 3
STM32 xử lý:
ID
DLC
DATA
CRC/error
Còn transceiver chịu trách nhiệm chuyển tín hiệu logic của MCU thành tín hiệu điện trên CAN-H/CAN-L.
11. CAN khác UART ở điểm nào?
Đây là cách rất dễ hiểu:
| UART | CAN |
|---|---|
| Thường point-to-point | Multi-node bus |
| TX/RX | CAN-H/CAN-L |
| Không có arbitration kiểu CAN | Có arbitration |
| Không có message ID bắt buộc | Có ID |
| Thường không có cơ chế ưu tiên bus tương tự | ID quyết định ưu tiên |
| Khả năng chống nhiễu thấp hơn | Chống nhiễu rất tốt |
| Đơn giản | Phức tạp hơn |
| Rất phổ biến trong giao tiếp MCU | Rất phổ biến trong ô tô/công nghiệp |
Một ví dụ thực tế rất thú vị
Giả sử có:
Node 1 = Motor Controller
Node 2 = Battery/BMS
Node 3 = Display
Node 4 = STM32
BMS có thể gửi:
ID = 0x300
DATA = Voltage, Current, SOC...
Motor controller gửi:
ID = 0x200
DATA = RPM, Temperature...
Display chỉ cần “nghe” các ID đó:
CAN BUS
│
├── 0x200 → RPM
├── 0x300 → Battery
└── 0x400 → Temperature
Không cần tạo một đường dây riêng:
BMS → Display
Motor → Display
Sensor → Display
Đó chính là sức mạnh của CAN.
Nếu bạn đang tìm hiểu CAN để ứng dụng thực tế vào STM32F103C8T6, tôi có thể đi tiếp một bước rất thực dụng: dùng 2 Blue Pill + 2 module CAN transceiver, nối thành một CAN Bus, rồi viết chương trình để Blue Pill A gửi ID + DATA, Blue Pill B nhận và hiển thị lên UART. Đây là cách rất tốt để hiểu CAN từ phần cứng → tín hiệu → frame → lập trình STM32.

