Công nghệ

Giao tiếp CAN là gì nó hoạt động như thế nào?

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.

About the author

lbtmicr06

Leave a Comment