Thứ Sáu, 16 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 5] Khung báo lỗi (Error frame)

Khung báo lỗi (Error frame) được truyền trên bus bởi các Node phát hiện thấy có điều kiện lỗi (các điều kiện lỗi sẽ được trình bày trong bài khác). Khung báo lỗi gồm hai vùng khác nhau. Vùng đầu tiên (superposition of Error Flags) là sự chồng chập của các cờ lỗi (Error Flag) được phát từ các Node khác nhau trên bus. Tiếp theo đó là vùng phân cách khung báo lỗi (Error delimiter).
Hình 1. Khung báo lỗi

1. Cờ lỗi (Error Flag)

Cờ lỗi có 2 dạng là cờ lỗi chủ động (Active Error Flag) và cờ lỗi bị động (Passive Error Flag)
  • Cờ lỗi chủ động có 6 bit dominant liên tiếp
  • Cờ lỗi bị động có 6 bit recessive liên tiếp
Một Node đang trong trạng thái chủ động với lỗi (error active station) sẽ truyền cờ lỗi chủ động khi phát hiện một điều kiện lỗi. Dạng cờ lỗi chủ động sẽ vi phạm luật chèn bit (bit stuffing) được quy định bởi chuẩn này. Luật chèn bit quy định cứ sau 5 bit liên tiếp có mức logic giống nhau thì bộ truyền phải tự động chèn thêm một bit khác mức logic của 5 bit trước đó. Luật này áp dụng từ vùng SOF đến hết vùng CRC của khung dữ liệu và khung yêu cầu. Đồng thời, dạng cờ lỗi chủ động cũng không giống bất kỳ định dạng nào của vùng ACK hay EOF.

Tất cả các Node phát hiện thấy một điều kiện lỗi đều phải truyền cờ báo lỗi. Vì có thể có nhiều Node cùng phát hiện lỗi và truyền cờ lỗi nên các cờ lỗi được phát ra bus sẽ đè hay chồng lên nhau tạo thành vùng chồng chập các cờ lỗi. Với cờ lỗi chủ động, vùng chồng chập này sẽ tạo ra một chuỗi bi dominant (bit 0) có số bit tối thiểu là 6 và tối đa là 12 bit.

Một Node ở trong trạng thái lỗi bị động (passive error station) sẽ cố gắng báo hiệu bằng một cờ lỗi bị động khi nó phát hiện điều kiện lỗi. Cờ lỗi bị động có thể bị ghi đè bởi cờ lỗi chủ động được phát từ các Node ở trạng thái chủ động với lỗi. Vì vậy, Node truyền cờ lỗi bị động sẽ chờ cho đến khi phát hiện được 6 bit liên tiếp cùng cực tính từ lúc bắt đầu phát cờ lỗi bị động của nó. Việc truyền cờ lỗi bị động được xem là hoàn thành khi 6 bit bằng nhau liên tiếp đã được phát hiện.

2. Vùng phân cách khung báo lỗi (Error Delimiter)

Vùng này gồm 8 bit recessive liên tiếp.
Sau khi truyền xong cờ lỗi, các Node bắt đầu phát các bit recessive và phải giám sát cho đến khi bắt đầu nhận được một bit recessive thì bit này được tính là bit đầu tiên của vùng phân cách khung báo lỗi. Lúc này, các Node tiếp tục phát thêm 7 bit recessive nữa để hoàn thành vùng này.

3. Giải thích về sự truyền khung báo lỗi

Khung báo lỗi được phát theo dạng nào là tùy vào trạng thái lỗi hiện tại của Node. Trạng thái lỗi của Node sẽ được trình bày trong 1 bài khác.

Khung báo lỗi được phát khi nào?
  • Bất cứ khi nào một Node phát hiện điều kiện lỗi bus khi khung dữ liệu hoặc khung yêu cầu đang được phát thì nó sẽ phát ngay khung báo lỗi của nó. Khung báo lỗi được phát có thể ngắt sự truyền ngay lập tức hoặc có thể không gây ngắt sự truyền.
  • Chú ý, trường hợp phát hiện lỗi CRC thì việc truyền cờ báo lỗi phải sau vùng phân cách ACK (ACK DELIMITER) trừ khi đã có một cờ lỗi khác đã phát trước đó.
Khi nào khung báo lỗi gây ngắt sự truyền hiện tại trên bus và khi nào không?
  • Khi khung báo lỗi được phát ra là loại khung báo lỗi chủ động vì cờ lỗi chủ động có 6 bit dominant liên tiếp sẽ phá vỡ các quy định về việc truyền dữ liệu như luật chèn bit hoặc phá vỡ định dạng chung của các vùng cấu tạo nên khung dữ liệu hoặc khung yêu cầu. Vì vậy, việc truyền một cờ lỗi chủ động từ bất kỳ Node nào cũng sẽ được tất cả các Node trong mạng phát hiện được
  • Khi khung báo lỗi được phát ra là loại khung báo lỗi bị động và được phát ra bởi chính bộ truyền thông điệp trên bus. Một bộ truyền đang ở trạng thái lỗi bị động phát hiện lỗi bus thì nó sẽ ngừng truyền và việc phát 6 bit recessive liên tiếp sẽ vi phạm luật chèn bit và báo hiệu cho các Node khác.
  • Một hoặc nhiều bộ nhận trong trạng thái lỗi bị động khi phát hiện lỗi sẽ cố gắng phát khung báo lỗi bị động lên bus. Nếu đó là lỗi cục bộ của riêng của các Node này và không có Node nào truyền khung báo lỗi chủ động thì sự truyền vẫn tiếp tục bởi vì khung báo lỗi bị động toàn bit recessive nên không ảnh hưởng đến dữ liệu đang truyền trên bus. Lúc này, các Node phát khung báo lỗi bị động sẽ ngừng nhận dữ liệu và gí giát bus để chờ nhận được 6 bit liên tiếp bằng nhau như quy định trước khi phát tiếp các bit phân cách khung báo lỗi.
Tại sao độ dài vùng chồng chập cờ lỗi chủ động là từ 6 đến 12 bit?
  • Giả sử tại thời điểm phát hiện lỗi bus, đây là một lỗi toàn cục, tất cả các Node trên bus đều đồng thời nhận ra và phát khung báo lỗi thì các cờ lỗi chủ động chồng chập lên nhau và có độ dài ngắn nhất là 6 bit.
  • Nếu một lỗi xuất hiện nhưng chỉ có một hoặc một vài Node nhận ra thì chỉ các các Node này phát khung báo lỗi. Các Node còn lại chưa giám sát bus thấy có 6 bit dominant liên tiếp của cờ lỗi chủ động trên bus thì ngay lập tức phát hiện đây là một lỗi và bắt đầu phát khung báo lỗi của nó. Lúc này sự chồng chập các cờ lỗi chủ động sẽ là 6 bit dominant của các Node phát trước đó cộng với 6 bit dominant của các Node phát sau này là 12 bit
Việc khung báo lỗi bị động bị ghi đè bởi khung báo lỗi chủ động?
  • Đối với các trạng phát khung báo lỗi chủ động, trường hợp này sẽ không nhận ra có khung báo lỗi bị động và xử lý bình thường.
  • Đối với Node phát khung báo lỗi bị động, như đã trình bày, khi phát cờ lỗi bị động, trong trường hợp này bị ghi đè, nó giám sát thấy 6 bit dominant. Đây chính là là 6 bit cùng cực (cùng mức logic) thì coi như nó đã phát xong cờ báo lỗi. Lúc này nó bắt đầu gửi các bit recessive của vùng phân tách khung báo lỗi và chờ đến khi phát hiện bit recessive đầu tiên thì tiếp tục truyền 7 bit recesssive và kết thúc việc truyền khung báo lỗi cùng với các Node truyền khung báo lỗi chủ động.

Lịch sử cập nhật:
1) 2019.10.18 - Chỉnh sửa link hình minh họa

2 bình luận:

  1. Cờ lỗi bị trùng lặp thì có ảnh hưởng gì không và có cần giải mã hay xử lý nó như thế nào không ạ?

    Trả lờiXóa
    Trả lời
    1. Chào bạn, về "cờ lỗi bị trùng lặp", khi một lỗi xảy ra thì một hoặc nhiều Node phát hiện ra lỗi sẽ phát cờ báo lỗi của nó nên việc nhiều Node cùng phát trùng lặp cờ lỗi là bình thường.
      Khi bạn lập trình cho một Node trong mạng CAN thì bạn chỉ cần quan tâm đến việc "Node sẽ xử lý như thế nào khi có lỗi?" chứ khó biết được có bao nhiêu Node bị lỗi hay bao nhiêu Node phát cờ lỗi.
      => Bạn không cần xử lý việc trùng lặp các cờ lỗi mà chỉ cần quan tâm nếu Node phát hiện lỗi thì cần xử lý như thế nào.

      Xóa