Kỹ thuật

Góc kỹ thuật

2020.07.21
Công nghiệp

Giao thức CAN - Phần 2: Phương thức truyền dữ liệu CAN

1. Các loại CAN Frame:

        Dữ liệu CAN được truyền dưới dạng các Frame (khung). Có 4 loại Frame khác nhau, đó là:

    • Data Frame (khung dữ liệu): là khung mang dữ liệu từ một bộ truyền dữ liệu đến các bộ nhận dữ liệu. Khung này có vùng để mang các byte dữ liệu.
    • Remote Frame (khung yêu cầu hay điều khiển): là khung được truyền từ một Node bất kỳ để yêu cầu dữ liệu từ Node khác. Khi Node khác đó nhận được yêu cầu sẽ  truyền lại dữ liệu có ID (Identifier) trùng với ID được gửi trong Remote Frame.
    • Error Frame (khung lỗi): là khung được truyền bởi bất kỳ Node nào khi Node đó phát hiện lỗi từ Bus.
    • Overflow Frame (khung báo tràn): mỗi Node trong CAN Bus có thể truyền bất kỳ khi nào nếu phát hiện Bus rảnh. Hoặc nếu một Node nhận quá nhiều dữ liệu và không xử lý kịp, nó sẽ gửi Frame này để các Node khác không gửi thêm dữ liệu cho nó.

        Data Frame và Remote Frame làm việc theo cơ chế phân xử quyền ưu tiên của tín hiệu vì thế cấu trúc của chúng có vùng phân xử quyền ưu tiên, nơi chứa ID của khung. Và chúng có hai định dạng khác nhau là định dạng chuẩn (Standard) và định dạng mở rộng (Extended):

    • Định dạng khung chuẩn sử dụng ID có độ dài 11 bit
    • Định dạng khung mở rộng sử dụng ID có độ dài 29 bit

2. Các loại giao thức CAN:

        Một số loại giao thức CAN hiện có: CAN specification 2.0, CAN FD.
        Sự khác biệt giữa các loại giao thức CAN nằm trong cấu trúc của các loại khung (Frame). Chúng ta sẽ tìm hiểu về cấu trúc của các loại khung của các chuẩn giao thức trên.

2.1. CAN 2.0

        Chuẩn giao thức CAN 2.0 được Bosch công bố lần đầu vào năm 1991. Tốc độ truyền tối đa của chuẩn này là 1 Mbps, lượng dữ liệu truyền tối đa là 8 byte.
        Chuẩn này gồm 2 định dạng: dạng chuẩn CAN 2.0A và dạng mở rộng CAN 2.0B. CAN 2.0A chỉ truyền được dạng khung chuẩn, CAN 2.0B truyền được cả khung chuẩn và khung mở rộng.

2.1.1. Data Frame

        Cấu trúc Data Frame của CAN 2.0A và CAN 2.0B:

 

Hình 2.1. Cấu trúc khung dữ liệu CAN

        Một Data Frame bao gồm 7 trường khác nhau:

✤ Trường bắt đầu (Start Of Frame Field - SOF):
Với cả 2 định dạng của chuẩn CAN 2.0 thì trường bắt đầu là vị trí của bit đầu tiên trong khung. Trường này chiếm 1 bit dữ liệu. Bit đầu tiên này là một Dominant Bit (mức logic 0) đánh dấu sự bắt đầu của một Data Frame.

Trường xác định quyền ưu tiên (Arbitration Field):
Định dạng vùng xác định quyền ưu tiên là khác nhau đối với dạng khung chuẩn và khung mở rộng.
Định dạng chuẩn: vùng xác định quyền ưu tiên có độ dài 12 bit, bao gồm 11 bit ID và 1 bit RTR.
Định dạng mở rộng: trường xác định quyền ưu tiên có độ dài 32 bit, bao gồm có 29 bit ID, 1 bit SRR, 1 bit IDE và 1 bit RTR

Trong đó:
– Bit RTR (Remote Transmission Request):
+ Là bit dùng để phân biệt khung là Data Frame hay Remote Frame.
+ Nếu là Data Frame, bit này luôn bằng 0 (Dominant Bit).
+ Nếu là Remote Frame, bit này luôn bằng 1 (Recessive Bit).
+ Vị trí bit này luôn nằm sau bit ID.
Trường hợp nếu Data Frame và Remote Frame có cùng ID được gửi đi đồng thời thì Data Frame sẽ được ưu tiên hơn.

– Bit SRR (Substitute Remote Request):
+ Bit này chỉ có ở khung mở rộng.
+ Bit này có giá trị là 1 (Recessive Bit).
+ So với vị trí tương ứng trong khung chuẩn thì bit này trùng với vị trí của bit RTR nên còn được gọi là bit thay thế (Substitute).
Giả sử có hai Node cùng truyền, một Node truyền Data Frame chuẩn, một Node truyền Data Frame mở rộng có ID giống nhau thì Node truyền khung chuẩn sẽ thắng phân xử quyền ưu tiên vì đến vị trí sau ID, khung chuẩn là bit RTR = 0, còn khung mở rộng là bit SRR = 1. Như vậy, khung chuẩn chiếm ưu thế hơn so với khung mở rộng khi có ID như nhau.

– Bit IDE (Identifier Extension):
+ Đây là bit phân biệt giữa loại khung chuẩn và khung mở rộng: IDE = 0 quy định khung chuẩn, IDE = 1 quy định khung mở rộng.
+ Bit này nằm ở trường xác định quyền ưu tiên với khung mở rộng và ở trường điều khiển với khung chuẩn.

Trường điều khiển (Control Field):
Khung chuẩn và khung mở rộng có định dạng khác nhau ở trường này:
+ Khung chuẩn gồm IDE, r0 và DLC (Data Length Code).
+ Khung mở rộng gồm r1, r0 và DLC.

Trong đó:
- Bit IDE
+ Dùng phân biệt loại khung (đã được trình bày ở trên).

- Bit r0, r1
+ Đây là hai bit dự trữ: Tuy hai bit này phải được truyền là Recessive Bit bởi bộ truyền nhưng bộ nhận không quan tâm đến giá trị 2 bit này. Bộ nhận có thể nhận được các tổ hợp 00, 01, 10 hoặc 11 của r1 và r0 nhưng không coi đó là lỗi mà bỏ qua và nhận thông điệp bình thường.

- DLC (Data Length Code)
+ Có độ dài 4 bit quy định số byte của trường dữ liệu của Data Frame
+ Chỉ được mang giá trị từ 0 đến 8 tương ứng với trường dữ liệu có từ 0 đến 8 byte dữ liệu. Data Frame có thể không có byte dữ liệu nào khi DLC = 0.
+ Giá trị lớn hơn 8 không được phép sử dụng. Hình dưới mô tả các loại mã bit mà DLC có thể chứa để quy định số byte của trường dữ liệu.

Hình 2.1. DLC và Trường Dữ Liệu của giao thức CAN theo khung dữ liệu tiêu chuẩn

Trường dữ liệu (Data Field):
+ Trường này có độ dài từ 0 đến 8 byte tùy vào giá trị của DLC ở trường điều khiển.

Trường kiểm tra (Cyclic Redundancy Check Field - CRC):
Trường kiểm tra hay trường CRC gồm 16 bit và được chia làm hai phần là:
+ CRC Sequence: gồm 15 bit CRC tuần tự
+ CRC Delimiter: là một Recessive Bit làm nhiệm vụ phân cách trường CRC với trường ACK (mô tả bên dưới).

Hình 2.3. Bit phân cách CRC (CRC Delimitier)

+ Mã kiểm tra CRC phù hợp nhất cho các khung mà chuỗi bit được kiểm tra có chiều dài dưới 127 bit, mã này thích hợp cho việc phát hiện các trường hợp sai nhóm (Bus Error). Ở đây, tổng bit từ trường bắt đầu (SOF) đến trường dữ liệu (Data Field) tối đa là 83 bit (khung định dạng chuẩn) và 103 bit (khung định dạng mở rộng).
=> Trường CRC bảo vệ thông tin trong Data Frame và Remote Frame bằng cách thêm các bit kiểm tra dự phòng ở đầu khung truyền. Ở đầu khung nhận, cũng sẽ tính toán CRC như bộ truyền khi đã nhận dữ liệu và so sánh kết quả đó với CRC Sequence mà nó đã nhận được, nếu khác nhau tức là đã có lỗi, nếu giống nhau tức là đã nhận đúng từ trường SOF đến trường dữ liệu.

Trường báo nhận (Acknowledge Field - ACK):
Trường báo nhận hay trường ACK có độ dài 2 bit và bao gồm hai phần là ACK Slot và ACK Delimiter.

Hình 2.4. Cấu trúc trường ACK

+ ACK Slot: có độ dài 1 bit, một Node truyền dữ liệu sẽ thiết lập bit này là Recessive. Khi một hoặc nhiều Node nhận chính xác giá trị thông điệp (không có lỗi và đã so sánh CRC Sequence trùng khớp) thì nó sẽ báo lại cho bộ truyền bằng cách truyền ra một Dominant Bit ngay vị trí ACK Slot để ghi đè lên Recessive Bit của bộ truyền.
+ ACK Delimiter: có độ dài 1 bit, nó luôn là một Recessive Bit. Như vậy, ta thấy rằng ACK Slot luôn được đặt giữa hai Recessive Bit là CRC Delimiter và ACK Delimiter.

Trường kết thúc (End Of Frame Field - EOF):
Trường EOF là trường thông báo kết thúc một Data Frame hay Remote Frame. Trường này gồm 7 Recessive Bit.

2.1.2. Remote Frame

- Bên cạnh Data Frame được sử dụng để vận chuyển dữ liệu, còn có Remote Frame - loại khung này được sử dụng để yêu cầu dữ liệu, tức là Data Frame, từ bất kỳ Node nào trên cùng Bus. Tuy nhiên, các khung này hầu như không được sử dụng trong các ứng dụng ô tô, vì việc truyền dữ liệu không dựa trên yêu cầu, mà chủ yếu dựa trên sự chủ động của thông tin từ thông số kỹ thuật của ô tô đó.

- Remote Frame giống như Data Frame, nó có hai điểm khác biệt quan trọng:
+ Nó được đánh dấu rõ ràng là Remote Frame (bit RTR trong trường xác định quyền ưu tiên là Recessive Bit, ở Data Frame nó là một Dominant Bit).
+ Không có trường dữ liệu.

- Remote Frame có thể được truyền ở cả 2 định dạng tiêu chuẩn và định dạng mở rộng. Và có cấu trúc gồm 6 trường bit như Data Frame (chỉ không có trường dữ liệu - Data Field).
➤ Remote Frame dạng chuẩn:

Hình 2.5. Remote Frame dạng chuẩn

➤ Remote Frame dạng mở rộng:

Hình 2.6. Remote Frame dạng mở rộng

2.1.3. Error Frame

- Error Frame là một loại khung đặc biệt khác biệt với các quy tắc định khung của tin nhắn CAN. Nó được truyền đi khi một Node phát hiện ra lỗi và sẽ khiến tất cả các Node khác phát hiện ra lỗi - vì vậy chúng cũng sẽ gửi Error Frame. Sau đó, bộ truyền sẽ tự động cố gắng truyền lại tin nhắn.

- Error Frame bao gồm Error Flag có 6 bit có cùng giá trị và Error Delimiter là 8 Recessive Bit. Error Delimiter cung cấp một số khoảng trống trong đó các Node khác trên Bus có thể gửi Error Flag khi chúng phát hiện Error Flag đầu tiên.

Hình 2.7. Error Frame

2.1.3. Overload Frame

- Overload Frame được đề cập ở đây chỉ để hoàn thiện. Nó rất giống với Error Frame về mặt định dạng và nó được truyền bởi một Node khi Node đó quá bận rộn. Overload Frame không được sử dụng thường xuyên, vì ngày nay các bộ điều khiển CAN đủ thông minh để không sử dụng nó. Trong thực tế, bộ điều khiển duy nhất sẽ tạo ra Overload Frame là 82526 đã lỗi thời.

Hình 2.8. Overload Frame

2.2. CAN FD

2.2.1. Giới thiệu

- CAN FD hay CAN Flexible Data Rates là một sự cải tiến của CAN specification 2.0. CAN FD cũng được phát triển bởi tập đoàn Bosch và chính thức được phát hành vào năm 2012.

- CAN FD có thể sử dụng chung tầng vật lý với CAN 2.0.

- Những khác biệt chính của CAN 2.0 và CAN FD:

CAN 2.0 CAN FD
Tốc độ bit tối đa: 1 Mbps. Tốc độ bit tối đa: 12 Mbps (ISO 11898-2 2015).
Lượng dữ liệu tối đa trong 1 Frame: 8 byte. Lượng dữ liệu tối đa trong 1 Frame: 64 byte.
Nhiều Node có thể truyền thông điệp cùng một thời điểm. Chỉ một Node có thể truyền thông điệp tại một thời điểm.
Không có bit để thay đổi tốc độ truyền dữ liệu. Có thêm các bit BRS, FDF, ESI có thể thay đổi tốc độ truyền dữ liệu.
Trường CRC chứa 15 bit. Trường CRC chứa 17 hoặc 21 bit.
Dữ liệu ít bảo mật. Dữ liệu được bảo mật tốt hơn.

➤Sơ đồ phác thảo đường truyền vật lý của Data Frame CAN FD và CAN 2.0:

Hình 2.9. Sơ đồ phác thảo đường truyền vật lý Data Frame của CAN FD và CAN 2.0

- CAN FD cũng có 4 loại khung truyền như CAN 2.0: Data Frame, Remote Frame, Error Frame và Overflow Frame.

- Xét riêng về Data Frame của CAN FD cũng bao gồm 2 định dạng như CAN 2.0 đó là:
+ Data Frame dạng CAN FD chuẩn (Standard Format): 11 bit ID
+ Data Frame dạng CAN FD mở rộng (Extended Format): 29 bit ID

- CAN FD không định nghĩa một định dạng riêng cho Remote Frame, Error Frame và Overload Frame, mà nó có cùng cấu trúc với CAN 2.0 cho các loại khung này.

2.2.2. Cấu trúc Data Frame

- Cấu trúc của khung này tạo nên sự khác biệt (cải tiến) giữa CAN FD và CAN 2.0.

- Data Frame CAN FD cũng bao gồm 7 trường bit như CAN 2.0. Chúng ta sẽ tìm hiểu cấu tạo bit của từng trường để thấy được sự khác biệt của chúng.

Hình 2.10. So sánh khác biệt về cấu trúc giữa CAN 2.0 và CAN FD

✤ Trường bắt đầu (Start Of Frame Field - SOF):
Trường bắt đầu là vị trí của bit đầu tiên trong khung. Trường này chiếm 1 bit dữ liệu. Bit đầu tiên này là một Dominant Bit (mức logic 0).

✤ Trường xác định quyền ưu tiên của tín hiệu (Arbitration Field):
Bit dùng phân biệt Data Frame và Remote Frame - RTR được thay thế bởi bit RRS (Remote Request Substitution) và luôn là một Dominant Bit.

✤ Trường điều khiển (Control Field):
Ngoài bit quy định khung FD chuẩn hay mở rộng (bit IDE). Trường điều khiển có thêm các bit sau:
+ FDF (Flexible Data Rate Format): Quy định việc có chuyển sang tốc độ truyền cao hơn hay không.
+ BRS (Baud Rate Switch) là bit dùng để quyết định việc thay đổi tốc độ bit trong định dạng CAN FD. Nếu bit này là Recessive thì sau Arbitration Phase (pha xác định quyền ưu tiên), tốc độ bit hiện tại sẽ được chuyển thành một tốc độ bit khác đã được cấu hình trước, tốc độ bit mới được dùng cho Data Phase (pha dữ liệu).
+ ESI (Error State Indicator) là cờ biểu thị trạng thái lỗi, là Dominant Bit nếu Node đang trong trạng thái tích cực với lỗi (Active Error) và là Recessive Bit nếu Node đang trong trạng thái lỗi bị động (Passive Error).
+ Bit DLC của CAN FD sử dụng các giá trị từ 9 đến 15 để tăng số byte trường dữ liệu lên đến 64 byte cho phép truyền được nhiều dữ liệu hơn trong 1 lần truyền.

✤ Trường dữ liệu (Data Field):
Kích thước dữ liệu tối đa có thể lên tới 64 byte.

✤ Trường CRC:

Vì độ dài trường dữ liệu tăng lên nên trường CRC cũng được điều chỉnh lại cho phù hợp.
Trường CRC không có độ dài cố định như CAN 2.0 mà thay đổi tùy theo độ dài trường dữ liệu. Cụ thể:
+ Khung theo định dạng CAN sẽ dùng CRC_15 có đa thức sinh như chuẩn CAN 2.0 => độ dài CRC Sequence là 15 bit.
+ Khung theo định dạng CAN FD có độ dài từ 16 byte trở xuống sử dụng CRC_17 => độ dài CRC Sequence là 17 bit.
+ Khung theo định dạng CSN FD có độ dài trên 16 byte sẽ sử dụng CRC_21 => độ dài CRC Sequence là 21 bit.

Hình 2.11. Cấu trúc trường CRC

Trong định dạng CAN FD, CRC được tính cho chuỗi bit đã được áp dụng luật chèn bit. Đây là điểm khác biệt so với định dạng CAN vì CRC của định dạng này không bao gồm các bit chèn.
CRC Delimiter chỉ là 1 Recessive Bit đối với định dạng CAN nhưng nó có thể là 1 hoặc 2 Recessive Bit trong định dạng CAN FD. Cụ thể, trong định dạng CAN FD, bộ truyền chỉ truyền 1 Recessive Bit nhưng phải chấp nhận có 2 Recessive Bit trước khi phát hiện cạnh từ Recessive chuyển sang Dominant của ACK Slot. Một bộ nhận sẽ vẫn gửi ACK của nó sau Recessive Bit đầu tiên của CRC Delimiter.

✤ Trường ACK:

Hình 2.12. Cấu trúc trường ACK

Định dạng CAN FD chấp nhận trường ACK Slot có độ dài tối đa 2 bit để bù sự dịch pha giữa các bộ nhận trong khi định dạng CAN chỉ chấp nhận 1 bit ACK và coi bit ACK thứ 2 là một lỗi định dạng.
ACK Delimiter cũng được tăng lên thành 2 Recessive Bit trong định dạng CAN FD.

Các thông tin liên quan