• Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

Thứ Bảy, 24 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 11] Ví dụ về quan sát một bus CAN thực tế bằng dao động ký


Tham khảo: Introduction to the Controller Area Network (CAN), Application Report, TI

Nội dung bài này tham khảo từ một kết quả đo đạc của TI nhằm cho bạn đọc có cái nhìn cụ thể về sự truyền nhận dữ liệu trên 1 bus CAN và quan sát hoạt động 1 bus CAN trên thực tế.

Chuẩn CAN định nghĩa một giao thức mạng thông tin cho phép tất cả các Node trong mạng có thể thông tin được với nhau. Mạng có thể có hoặc không có Node điều khiển trung tâm. Các Node có thể được thêm vào mạng bất kỳ lúc nào kể cả lúc mạng đang hoạt động (hot-plugging).

Việc quan sát được thực hiện trên:
  1. Bus CAN ở Ch 1 sử dụng đầu đo vi sai
  2. Đường TX của Node A, nối từ vi xử lý DSP có tích hợp CAN controller đến CAN transceiver, ở Ch 2
  3. Đường TX của Node B, nối từ vi xử lý DSP có tích hợp CAN controller đến CAN transceiver, ở Ch 3
  4. Đường TX của Node C, nối từ vi xử lý DSP có tích hợp CAN controller đến CAN transceiver, ở Ch 4
Hình 1. Minh họa bus CAN được kết nối và đo đạc bằng dao động ký

Đầu tiên Node A truyền một thông điệp hợp lệ và được Node B và C xác nhận bằng 1 bit dominant ở vùng ACK slot. Sau đó, Node B và Node C cùng phát thông điệp. Sự xung đột xảy ra và Node C thắng phân xử nên truyền tiếp cho đến khi kết thúc thông điệp của nó. Node B ngừng truyền ngay khi thua phân xử và trở thành bộ nhận. Sau đó, cả Node A và Node B đều phát ACK báo hiệu Node C truyền một thông điệp hợp lệ. Cuối cùng, Node B phát lại thông điệp của nó khi bus rảnh và được Node A và Node C báo ACK.

Chú ý, cực của dạng sóng trên bus đo bằng đầu dò vi sai ở hình sau ngược với dạng sóng đo trên các đường TX, đồng thời cũng là ngõ vào bộ lái bus CAN của CAN transceiver.
Hình 2. Dạng sóng thể hiện trên dao động ký của bus CAN

[CAN2.0][Controller Area Network][Bài 10] Quy định về đồng bộ trong bus CAN

1. Đồng bộ cứng - Hard Synchronization

Đồng bộ cứng làm cho thời gian bit đang được giám sát tại một Node CAN khởi động lại vị trí Sync_seg.

Đồng bộ cứng xảy ra khi có cạnh bit, cạnh lên hoặc cạnh xuống. Như vậy, một cạnh bit xuất hiện sẽ làm việc tính toán thời gian bit của một Node khởi động lại về Sync_seg.

Khi Node phát hiện cạnh xuống của SOF trên đường truyền, Node bắt đầu tính toán thời gian bit bắt đầu từ Sync_seg.
Hình 1. Các phân đoạn của 1 bit
2. Độ rộng bước tái đồng bộ - Resynchronization Jump Width

Như đã trình bày về định thời bit, độ dài đoạn Phase_seg1 và Phase_seg2 không cố định mà Phase_seg1 có thể bị kéo dài và Phase_seg2 có thể bị rút ngắn trong quá trình một Node hoạt động.

Độ rộng bước tái đông bộ (RJW hoặc SJW) sẽ quy định đố lớn của đoạn được kéo dài hoặc rút ngắn. RJW có thể được lập trình trong khoảng từ 1 đến Min(4, Phase_seg1).

3. Lỗi pha của một cạnh bit - Phase Error

Lỗi pha của một cạnh, cạnh lên hoặc cạnh xuống, được xác định bởi vị trí của cạnh bit so với đoạn Sync_seg. Lỗi pha được đo bằng đơn vị TQ. Ký hiệu lỗi pha được quy định như sau:

  • e = 0: cạnh bit xuất hiện trong vùng Sync_seg và không xảy ra lỗi pha
  • e > 0: cạnh bit xuất hiện sau Sync_seg và trước điểm lấy mẫu (Sample point) gọi là lỗi pha dương
  • e < 0: cạnh bit xuất hiện sau điểm lấy mẫu và trước Sync_seg của bit tiếp theo gọi là lỗi pha âm


Hình 2. Vị trí xác định lỗi pha của cạnh bit
Như vậy việc xác định lỗi pha chỉ khi có sự xuất hiện cạnh bit. Việc truyền liên tiếp nhiều bit cùng mức logic sẽ không xác định được lỗi pha. Mỗi Node đều giám sát thời gian từng bit được truyền trên bus. Khi một cạnh bit xuất hiện. Một Node sẽ kiểm tra xem cạnh này rơi vào đoạn thời gian nào của bit mà nó đang giám sát. Từ đó, nó xác định có lỗi pha hay không.

CAN truyền theo dạng NRZ nên việc truyền nhiều bit cùng mức logic liên tiếp sẽ có thể gây ra mất đồng bộ dẫn đến việc nhận dữ liệu bị sai. Vì vậy, chuẩn CAN đã quy định về việc chèn bit để giải quyết vấn đề này. Việc chèn một bit trái dấu sẽ làm các Node đang nhận đồng bộ lại việc tính toán thời gian bit của chúng.

4. Tái đồng bộ - Resynchronization

Sự tái đồng bộ chỉ có thể xảy ra khi xuất hiện cạnh bit. Sự tái đồng bộ xảy ra như đồng bộ cứng (hard synchronization) nếu lớn lỗi pha có xảy ra nhưng độ lớn lỗi pha nhỏ hơn hoặc bằng độ rộng bước tái đồng bộ RJW.
Nếu độ lớn lỗi pha lớn hơn RJW thì việc tái đồng bộ được thực hiện như sau:

  • Nếu lỗi pha dương thì Phase_seg1 được kéo dài thêm một đoạn đúng bằng RJW.
  • Nếu lỗi pha âm thì Phase_seg2 được rút ngắn một đoạn đúng bằng RJW
5. Quy luật đồng bộ - Synchronization rules

Đồng bộ cứng và Tái đồng bộ là hai dạng của sự đồng bộ. Chúng tuân theo quy luật sau đây:
  1. Chỉ một quy luật đồng bộ được áp dụng cho một bit. Một bit nếu đã áp dụng đồng bộ cứng thì không áp dụng tái đồng bộ.
  2. Sự đồng bộ chỉ áp dụng cho một cạnh nếu giá trị được phát hiện tại điểm lấy mẫu trước đó (giá trị bus được đọc trước đó) khác giá trị bus ngay sau cạnh bit.
  3. Đồng bộ cứng xảy ra khi xuất hiện cạnh chuyển từ bit recessive sang bit dominant khi bus IDLE. Như vậy, việc xuất hiện cạnh của một SOF sẽ làm tất cả các Node trong mạng CAN được đồng bộ.
  4. Tất cả các cạnh chuyển từ recessive thành dominant khác theo luật 1 và luật 2 sẽ sử dụng Tái đồng bộ. Ngoại trừ, một Node truyền một bit dominant sẽ không thực hiện Tái đồng bộ khi cạnh chuyển từ recessive sang dominant với lỗi pha dương, nếu chỉ có các cạnh recessive-dominant được sử dụng cho việc Tái đồng bộ.
6. Giải thích về các yêu cầu và quy luật đồng bộ

Kết hợp quy tắc Đồng bộ cứng và Quy luật đồng bộ thì Đồng bộ cứng chỉ xảy ra khi bắt đầu bit SOF khi xét trong một thông điệp.

Sự tái đồng bộ có hai cơ chế thực hiện tùy vào độ lớn của lỗi pha:
  • Lỗi pha nhờ hơn hoặc bằng RJW thì Tái đồng bộ khởi động lại việc tính thời gian bit vào đoạn Sync_seg như đồng bộ cứng
  • Lỗi pha lớn hơn RJW thì Tái đồng bộ kéo dài đoạn Phase_seg1 hoặc rút ngắn đoạn Phase_seg2 theo giá trị cấu hình RJW

Hình 3. Sự tái đồng bộ khi xuất hiện lỗi pha dương nhỏ hơn RJW (trên) và lớn hơn RJW (dưới)
Hình 4. Sự tái đồng bộ khi xuất hiện lỗi pha âm nhỏ hơn RJW (trên) và lớn hơn RJW (dưới)







[CAN2.0][Controller Area Network][Bài 9] Quy định về thời gian bit - Bit Timing

1. Tốc độ bit danh định (Nominal Bit Rate)

Tốc độ bit danh định (fn) là số bit được truyền trong một giây (bps - bit per second) bằng bộ truyền lý tưởng và không có sự tái đồng bộ xảy ra. Sự tái đồng bộ cho phép hiệu chỉnh lại ví trí lấy mẫu bit khi xuất hiện sự lệch bit trên đường truyền.

Tốc độ bit danh định có thể hiểu là tốc độ bit cao nhất mà đường truyền có thể đạt được trên lý thuyết.

2. Thời gian bit danh định (Nominal Bit Time)

Thời gian bit danh định (Nominal Bit Time) được định nghĩa như sau:

Thời gian bit danh định (Tn) = 1/(Tốc độ bit danh định - fn)

Thời gian bit danh định được chia thành 4 đoạn riêng biệt (4 khoảng thời gian) không chồng lấn lên nhau là
  • Đoạn đồng bộ (Synchronization Segment) ký hiệu là Sync_seg
  • Đoạn lan truyền (Propagation Time Segment) ký hiệu là Prop_seg
  • Đoạn đệm pha thứ nhất (Phase Buffer Segment 1) ký hiệu là Phase_seg1
  • Đoạn đệm pha thứ hai (Phase Buffer Segment 2) ký hiệu là Phase_seg2.
Hình 1. Các phân đoạn thời gian của 1 bit

Sync_seg: Đoạn này dành cho việc đồng bộ giữa các Node trong 1 bus CAN. Một cạnh bit xuất hiện trên bus sẽ được mong chờ nằm trong đoạn này. Một Node luôn giám sát và tính toán thời gian bit. Trong khi truyền dữ liệu, bất cứ khi nào xuất hiện sự chuyển mức logic (cạnh bit) thì Node phải đồng bộ lại hoặc hiệu chỉnh cách tính toán thời gian bit để việc lấy mẫu bit được chính xác. Khi một cạnh bit xuất hiện mà Node gimas sát thấy nằm đúng trong đoạn Sync_seq thì đường truyền đang ổn định và các Node đang có sự đồng bộ tốt.

Prop_seg: Đoạn này được dùng để bù cho các thời gian trễ vật lý trong mạng. Nó gấp hai lần khoảng thời gian lan truyền tín hiệu trên bus, độ trễ mạch so sánh (comparator) ngõ vào và độ trễ mạch lái (driver) ngõ ra.

Phase_seq1 và Phase_seq2: Hai đoạn này dành cho việc bù lỗi pha của cạnh bit. Thời gian các đoạn này có thể được kéo dài hoặc rút ngắn khi thực thi tái đồng bộ.

Vị trí lấy mẫu (Sample point) là thời điểm tại đó mức trạng thái của bus CAN được đọc để xác định giá trị logic của bit. Ví trí lấy mẫu là ở cuối đoạn Phase_seg1. Trong quá trình truyền nhận dữ liệu, đoạn Phase_seg1 và Phase_seg2 được điều chỉnh để tái đồng bộ nhưng vị trí lấy mẫu này luôn ở cuối Phase_seg1.

Thời gian xử lý thông tin Tifp (Information processing time) là thời gian dự trữ tính từ vị trí lấy mẫu dành cho việc tính toán mức bit tiếp theo trong chuỗi. Độ dài của nó được xác định tùy vào phần cứng (chip) CAN controller.

3. Tính toán thời gian bit

Đơn vị thời gian sử dụng trong chuẩn CAN là TQ (Time Quantum) được tính từ chu kỳ bộ dao động Tos (chu kỳ xung clock) của CAN controller, datasheet hoặc user manual của CAN controller sẽ quy định rõ nguồn clock này. Bộ dao động ở đây có thể là thạch anh hay bộ tạo dao động bên trong chip cấp cho CAN controller.

TQ là đơn vị thời gian cố định trong suốt quá trình hoạt động của Node nhưng có thể lập trình được. Một TQ sẽ bằng m lần TQmin. TQmin (MINIMUM TIME QUANTUM) là đơn vị thời gian tối thiểu được tính từ Tos, n không có giới hạn cụ thể.

TQ = m x TQmin = m x n x Tos

Trong đó m là giá trị nguyên trong khoảng từ 1 đến 32.
Hình 2. Thời gian của 1 bit với n = 4, m = 3

Thời gian từng đoạn chia của 1 bit được quy định cụ thể như sau:
  • Sync_seg:  1 TQ
  • Prop_seg:  từ 1 đến 8 TQ
  • Phase_seg1: từ 1 đến 8 TQ
  • Phase_seg2 = max(Phase_seg1, Tifp) .Nghĩa là, Phase_seg1 và Tifp cái nào lớn hơn thì sử dụng giá trị đó cho Phase_seg2.
    • Trong đó, thời gian xử lý thông tin Tifp nhỏ hơn hoặc bằng 2 TQ
  • Tổng thời gian một bit ít nhất là 8 TQ và tối đa là 25 TQ
Thông thường việc lập trình thời gian bit là cần thiết để tất cả các Node trong mạng có tốc độ bit và thời gian bit giống nhau. Giống nhau ở đây nghĩ là có sự sai lệch ít nhất. Thường các Node này sẽ đi kèm với một vi xử lý hoặc vi điều khiển. Tuy nhiên, CAN có thể được thiết kế mà không cần cấu hình thời gian bit, nghĩa là nó có thể tự điều chỉnh đến tốc độ bit thích hợp chỉ cần cung cấp nguồn xung clock phù hợp. Đối với Node loại này thì vị trí điểm lấy mẫu phải tương thích cho tất cả các Node và thời gian bit theo định nghĩa sau đây:
  • Sync_seg: 1 TQ
  • Prop_seg: 1 TQ
  • Phase_seg1: 4 TQ
  • Phase_seg2: 4 TQ
Hình 3. Thời gian bit cho các linh kiện CAN không lập trình được thời gian bit

4. Độ sai số cho phép của bộ dao động

Độ sai số cho phép tối đa của bộ dao động là 1.58% và sử dụng một bộ cộng hưởng gốm (ceramic resonator) ở tốc độ bus lên đến 125 Kbits/s như nguyên tắc cơ bản. Tham khảo bài báo sau để có thông tin chính xác hơn:

Dais, S; Chapman, M;
“Impact of Bit Representation on Transport Capacity and Clock
Accuracy in Serial Data Streams”,
SAE Technical Paper Series 890532, Multiplexing in Automobiles SP-773 March 1989

Một Node muốn sử dụng được đầy đủ các tốc độ bus của giao thức CAN (full speed) thì cần sử dụng bộ dao động thạch anh. Chip CAN yêu cầu cao nhất về độ chính xác của bộ tạo dao động. Việc xác định độ chính xác của các bộ tạo dao động sử dụng trong các Node của mạng CAN phải được thực hiện.

5. Tính toán thời gian trễ lan truyền và Prop_seg

Như đã trình bày ở trên, đoạn Prop_seg gấp hai lần khoảng thời gian lan truyền tín hiệu trên bus, độ trễ mạch so sánh (comparator) ngõ vào và độ trễ mạch lái (driver) ngõ ra. Độ trễ mạch lái ngõ ra và độ trễ mạch so sánh ngõ vào thuộc chip CAN transceiver.
Hình 4. Giải thích độ trễ giữa 2 Node trong bus CAN

Theo hình minh họa trên, các độ trễ được tính như sau:

  • Độ trễ từ Node A đến Node B:
    • Độ trễ mạch lái ngõ ra tại Node A: Txa
    • Độ trễ trên bus: Tbus
    • Độ trễ mạch so sánh ngõ vào tại Node B: Trb
    • Độ trễ lan truyền từ A đến B:
      • Tprop(A->B) = Txa + Tbus + Txb
  • Độ trễ từ Node B đến Node A:
    • Độ trễ mạch lái ngõ ra tại Node B: Txb
    • Độ trễ trên bus: Tbus
    • Độ trễ mạch so sánh ngõ vào tại Node A: Tra
    • Độ trễ lan truyền từ B đến A:
      • Tprop(B->A) = Txb + Tbus + Txa

Thời gian đoạn Prop_seg:
Tprop_seg = Tprop(A->B) + Tprop(B->A)

Nếu CAN transceiver ở cả 2 Node là cùng loại thì Txa = Txb và Tra = Trb. Vì vậy, thời gian lan truyền từ A đến B và từ B đến A là như nhau.
Tprop_seg = 2 x (Tx + Tbus + Tr)

Số TQ cấu hình cho Prop_seg được tính như sau:

Prop_seg = Tprop_seg/Ttq

Nếu không phải là một số nguyên thì giá trị này được làm tròn lên đến số nguyên gần nhất. Chú ý, thông số cấu hình này được tính trên trường hợp xấu nhất là 2 Node nằm cách xa nhau nhất (nằm ở hai đầu cuối) trong bus CAN.

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

Thứ Tư, 21 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 8] Luật truyền chuỗi bit của CAN - Bit Stream Coding

1. Loại mã hóa chuỗi bit

Phương pháp mã hóa được sử dụng trong giao thức CAN là phương pháp NRZ mà cụ thể hơn là NRZ-L (Non-Return-to-Zero Level). Đây là dạng mã hóa theo mức, tức là mỗi trạng thái dominant và recesive sẽ được quy định mang một mức áp khác nhau. Cụ thể, dominant là mức thấp tương ứng với logic 0, recessive là mức cao tương ứng với logic 1. Trong suốt thời gian phát một bit, không xảy ra sự chuyển mức.
Hình 1. Mã hóa NRZ

2. Luật chèn bit - Bit stuffing

Vấn đề của loại mã hóa NRZ là có thể dẫn đến mất đồng bộ và nhận sai giá trị bit khi truyền một chuỗi bit cùng mức logic quá dài. Vì vậy, CAN quy định cứ sau 5 bit liên tiếp cùng mức logic thì bộ truyền phải tự động chèn một bit trái mức logic, gọi là bit chèn (STUFF BIT).

Luật chèn bit này áp dụng cho vùng SOF, vùng phân xử, vùng điều khiển, vùng dữ liệu và cùng CRC SEQUENCE. Các cùng còn lại là CRC DELIMITER, ACK FIELD và EOF không áp dụng luật này.
Bộ nhận tự động giám sát để loại bỏ bit chèn khi nhận dữ liệu.

Ví dụ:
  • Chuỗi bit gốc:            0100000  00000  1111  10001
  • Chuỗi bit được chèn: 010000010000011111010001
Hình 2. (a) chuỗi bit gốc (b) chuỗi bit sau khi áp dụng luật chèn bit với S là vị trị bit được chèn thêm

Vai trò của các bit chèn là tạo ra sự chuyển mức (cạnh lên hoặc cạnh xuống) để bộ nhận có thể sử dụng tái đồng bộ. Việc đồng bộ khi truyền nhận dữ liệu sẽ được trình bày sau.

Khung báo lỗi và khung báo quá tải có định dạng cố định và không áp dụng luật chèn bit.

3. Luật phân xử

Như đã trình bày trong các phần trước, luật phân xử bit giải quyết vấn đề xung đột khi nhiều Node cùng truyền dữ liệu. Đồng thời, luật phân xử cũng đảm bảo việc truyền thông điệp không bị bất cứ gián đoạn nào khi có xung đột xảy ra.

Sử phân xử này xảy ra trong vùng IDENTIFIER của thông điệp với bit dominant luôn chiếm ưu thế.

Hình 3. Luật phân xử của CAN bus

Sự phân xử và chèn bit được thực hiện tự động bởi chip (vi mạch) thực hiện giao thức CAN.


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

Chủ Nhật, 18 tháng 6, 2017

[CAN2.0][Controller Area Network][Bài 7] Quy định về trạng thái lỗi của CAN Node và tính hợp lệ của thông điệp

1. Các trạng thái lỗi của CAN Node

Để giám sát và kiểm soát lỗi, mỗi Node đều tự động xác định trạng thái của chính nó dựa trên số lượng lỗi mà nó phát hiện được. Tại một thời điểm, một Node có thể thuộc một trong ba trạng thái sau:
  • Error active - Trạng thái chủ động với lỗi (gọi tắt là trạng thái lỗi chủ động). Đây là trạng thái hoạt động thông thường và tốt nhất của một Node. Node có thể tham gia truyền nhận dữ liệu trên bus một cách bình thường, nếu phát hiện lỗi thì sẽ phát khung báo lỗi với cờ báo lỗi chủ động (ACTIVE ERROR FLAG). Khi cờ báo lỗi chủ động được phát thì đường truyền bị ngắt ngay và các Node đều nhận biết được sự báo lỗi này vì cờ báo lỗi chủ động gồm 6 bit dominant sẽ phá vỡ cấu trúc thông thường của khung dữ liệu hoặc khung yêu cầu và không tuân theo luật chèn bit.
    • Error warning - Trạng thái cảnh báo lỗi là trạng thái lỗi chủ động nhưng Node CAN lúc này giám sát thấy số lượng lỗi phát hiện được quá nhiều đến ngưỡng cần phải báo động để Node có cơ chế xử lý thích hợp. Node trong trạng thái này hoạt động như trong trạng thái lỗi chủ động. Đây là trạng thái không được quy định trong chuẩn CAN Specification 2.0 nhưng hều hết các CAN controller hiện tại đều có.
  • Error Passive - Trạng thái bị động với lỗi (gọi tắt là trạng thái lỗi bị động). Một Node ở trạng thái này sẽ có một vài hoạt động bị giới hạn và kém ưu tiên hơn các Node ở trạng thái lỗi chủ động. Cụ thể, trong khi truyền nhận, nếu phát hiện một lỗi bus thì Node sẽ truyền khung báo lỗi bị động với cờ báo lỗi bị động (PASSIVE ERROR FLAG) toàn là bit recessive nên kém ưu tiên và thông điệp đang truyền có thể vẫn truyền tiếp. Mặt khác nó có thẻ bị ghi đè bởi các Node phát cờ báo lỗi chủ động. Một hạn chế nữa là, Node trong trạng thái lỗi bị động, sau khi vừa truyền xong một thông điệp thì phải chờ thêm một khỏng thời gian của vùng SUSPEND TRANSMISSION trước khi được phép truyền tiếp. Trong khoảng thời gian chờ này, nếu có Node khác truyền dữ liệu thì nó trở thành bộ nhận.
  • Bus-off - Trạng thái ngắt khỏi bus CAN (gọi tắt là trạng thái ngắt bus) là trạng thái Node không được phép có bất cứ táng động nào trên bus. Bộ lái ngõ ra bus, nằm trong chip CAN transceiver, bị ngắt.
2. Cách xác định trạng thái lỗi

Mỗi Node sẽ có 2 bộ đếm được dùng để xác định trạng thái lỗi của Node là:
  • Bộ đếm lỗi truyền (TRANSMIT ERROR COUNT)
  • Bộ đếm lỗi nhận (RECEIVE EROR COUNT)
Hai bộ đếm lỗi này được tích hợp trong phần cứng CAN controller và chạy tự động khi Node CAN hoạt động.

Giá trị của hai bộ đếm lỗi là bộ đếm lỗi truyền (Tx_count) và bộ đếm lỗi nhận (Rx_count) sẽ quyết định Node đang trong trạng thái nào. Các khoảng giá trị của chúng được quy định như sau: 
  • Trạng thái lỗi chủ động ‘Error active’ nếu Tx_count ≤ 127 và Rx_count ≤ 127. 
  • Trạng thái lỗi bị động ‘Error passive’ nếu Tx_count > 127 hoặc Rx_count > 127 nhưng Tx_count ≤ 255. 
  • Trạng thái ngắt bus ‘Bus off’ nếu Tx_count > 255.
  • Trạng thái cảnh báo lỗi 'Error Warning' nếu Tx_count >= 96 hoặc Rx_count >= 96. Đây là trạng thái không được quy định trong CAN Specification 2.0 nhưng được tách ra dựa trên một chú ý (Note) trong chuẩn này. Cụ thể, giá trị của một bộ đếm lỗi lớn hơn "khoảng" 96 sẽ chỉ ra việc bus bị nhiễu nặng và có thể cần kiểm tra điều kiện này.
Hình 1. Các trạng thái của một CAN NODE

3. Các loại lỗi mà một Node CAN có thể phát hiện

Có 5 loại lỗi khác nhau và chúng không loại trừ lẫn nhau, nghĩa là một lỗi xảy ra có thể thuộc hơn 2 loại.
  1. Lỗi bit (BIT ERROR) Một Node khi gửi một bit lên bus thì phải giám sát bit đó. Một lỗi bit được phát hiện ngay trong khoảng thời gian truyền bit đó nếu giá trị được lấy mẫu khi giám sát khác với giá trị bit được truyền ra. Nghĩa là truyền bit dominant nhưng giám sát thấy recessive và ngược lại. Ngoại trừ một số trường hợp dù giá trị gửi ra và giá trị bit giám sát khác nhau nhưng không được xem là lỗi bit, cụ thể như sau:
    1. Gửi một bit recessive trong vùng ACK SLOT nhưng giám sát thấy một bit dominant.
    2. Node gửi cờ báo lỗi bị động nhưng giám sát thấy có bit dominant xuất hiện
  2. Lỗi chèn bit (STUFF ERROR) Một Node giám sát thấy chuỗi 5 bit liên tiếp giống nhau thì sẽ kiểm tra bit thứ 6 có khác cực với 5 bit trước hay không. Nếu không khác thì đây là lỗi chèn bit vì sau 5 bit dominant liên tiếp phải được chèn 1 bit recessive, sau 5 bit recessive liên tiếp phải được chèn 1 bit dominant.
  3. Lỗi CRC (CRC ERROR) CRC SEQUENCE đi kèm theo thông điệp được tính bởi bộ truyền. Các bộ nhận phải tính lại chuỗi CRC giống với cách tính của bộ truyền. Kết quả tính toán này sẽ được dùng để so sánh với chuỗi CRC từ bộ truyền. Nếu hai chuỗi khác nhau thì đó là lỗi CRC.
  4. Lỗi định dạng (FORM ERROR) Một Node giám sát thấy các vùng có định dạng bit cố định (các vùng quy định rõ mức logic cố định của bit là 1 hoặc 0) nhưng chứa 1 hoặc nhiều bit vi phạm quy định thì đó là lỗi định dạng. Ngoại trừ:
    1. Một bộ nhận phát hiện thấy một bit dominant ở bit cuối cùng vùng EOF (bit thứ 7 của EOF) thì không xem đây là lỗi định dạng
  5. Lỗi ACK (ACKNOWLEDGMENT ERROR) là lỗi được phát hiện bởi bộ truyền khi nó không thấy một bit dominant xuất hiện tròng vùng ACK SLOT.
Hình 2. Các vùng được giám sát lỗi

Một Node phát hiện thấy một trong các lỗi trên thì phải phát cờ báo lỗi chủ động hoặc bị động tùy vào trạng thái hiện tại của Node.

Đối với loại lỗi BIT, lỗi chèn bit, lỗi định dạng và lỗi ACK thì việc truyền cờ báo lỗi bắt đầu ngay ở bit kế tiếp ngay sau khi phát hiện lỗi.

Đối với loại lỗi CRC thì cờ báo lỗi chỉ được truyền sau vùng ACK DELIMITER trừ khi có một cờ báo lỗi sinh ra bởi điều kiện khác đang được truyền. Ví dụ, giả sử Node A và Node B đều ở trạng thái lỗi chủ động. Node A là transmitter phát hiện lỗi bit tại bit cuối của CRC Sequence bị lỗi (lỗi Bit). Node A phát cờ báo lỗi bắt đầu từ vùng đáng lẽ là CRC Delimiter và làm vi phạm định dạng bit của vùng CRC Delimiter. Node B không phát hiện ra lỗi ở bit cuối CRC Seuqence nhưng sau khi nhận bit cuối cùng của CRC Sequence thì Node B kiểm tra thấy lỗi CRC. Tuy nhiên, Node B giám sát thấy vùng CRC Delimiter bị lỗi (lỗi định dạng - FORM ERROR) nên Node B phát cờ báo lỗi của nó  bắt đầu từ vùng đáng lẽ là ACK SLOT chứ không chờ sau vùng ACK DELIMITER mới phát cờ báo lỗi để đáp ứng cho lỗi CRC.
Hình 3. Ví dụ về việc phát hiện lỗi và báo lỗi

4. Quy định về việc tăng/giảm giá trị các bộ đếm lỗi

Hai bộ đếm lỗi Tx_count và Rx_count khi nào tăng? khi nào giảm? giá trị tăng hoặc giảm là bao nhiêu? được quy định rõ ràng bởi chuẩn. Trong suốt quá trình truyền một thông điệp, các quy tắc tăng giảm bộ đếm lỗi sau đây sẽ được áp dụng:
  1. Node là bộ nhận phát hiện một lỗi thì Rx_count tăng 1, ngoại trừ phát hiện lỗi bit khi phát cờ báo lỗi chủ động và cờ báo quá tải
  2. Node là bộ nhận phát hiện một bit dominant ở bit đầu tiên sau khi phát một cờ báo lỗi thì Rx_count tăng 1
  3. Node là bộ truyền phát một cờ báo lỗi thì Tx_count tăng 8. Tuy nhiên, Tx_count không thay đổi trong hai trường hợp ngoại lệ sau:
    1. Ngoại lệ 1: Bộ truyền trong trạng thái lỗi bị động phát hiện lỗi ACK và không phát hiện một bit dominant nào trong khi gửi cờ báo lỗi bị động của nó.
    2. Ngoại lệ 2: Nếu bộ truyền gửi một cờ báo lỗi sinh ra bởi lỗi chèn bit xuất hiện trong vùng phân xử mà bit chèn này đáng lẽ là recessive và bộ truyền đã truyền đi bit recessive nhưng lại được giám sát thấy là dominant
  4. Node là bộ truyển phát hiện lỗi bit khi đang truyền cờ báo lỗi chủ động hoặc cờ báo quá tải thì Tx_count tăng 8
  5. Node là bộ nhận phát hiện một lỗi bit trong khi gửi một cờ báo lỗi chủ động hoặc cờ báo quá tải thì Rx_count tăng 8
  6. Sau khi gửi một cờ báo lỗi chủ động, cờ báo lỗi bị động hoặc cờ báo quá tải, nếu một Node phát hiện thêm 7 bit dominant liên tiếp thì:
    1. Trong trường hợp của cờ báo lỗi chủ động và cờ báo quá tải, sau khi phát hiện bit dominant thứ 14 liên tiếp và sau mỗi chuỗi 8 bit dominant tiếp theo thì Tx_count và Rx_count tăng lên 8.
    2. Trong trường hợp của cờ báo lỗi bị động, sau khi phát hiện bit dominant thứ 8 liên tiếp và sau mỗi chuỗi 8 bit dominant tiếp theo thì Tx_count và Rx_count tăng lên 8.
  7. Sau khi truyền thành công một thông điệp (phát hiện được ACK và không có lỗi cho đến khi EOF kết thúc), Tx_count giảm 1 trừ khi Tx_count đang là 0 thì không giảm.
  8. Sau khi nhận thành công một thông điệp (nhận không lỗi đến ACK SLOT và gửi thành công bit ACK) thì:
    1. Rx_count giảm 1 nếu giá trị 1 ≤ Rx_count ≤ 127. 
    2. Rx_count giữa giá trị 0 nếu nó đang bằng 0
    3. Rx_count được gán một giá trị giữa 119 và 127 nếu Rx_count ≥ 127
Chú ý, trong quá trình khởi động (Start-up), chỉ có một Node được phép hoạt động. Nếu Node này truyền một số thông điệp, nó sẽ không nhận được ACK nên phát hiện ra lỗi và lặp lại việc truyền thông điệp. Node này có thể rơi vào trạng thái lỗi bị động nhưng không được phép bị bus-off vì lý do này.

5. Tính hợp lệ của thông điệp

Thời điểm xác nhận sự hợp lệ của thông điệp của bộ truyền và bộ nhận là khác nhau.

Với bộ truyền, thông điệp gọi là hợp lệ khi không có bất kỳ lỗi nào cho đến khi EOF kết thúc. nếu thông điệp bị lỗi thì thông điệp sẽ được tự động truyền lại dựa trên sự ưu tiên. Để có thể cạnh trang với sự truy cập bus từ các thông điệp khác thì việc truyền lại phải được bắt đầu sớm nhất có thể khi bus rảnh (BUS IDLE).

Với bộ nhận, thông điệp gọi là hợp lệ nếu nó không lỗi cho đến bit cuối của EOF. Giá trị bit cuối EOF, được bộ nhận xem như don't care. Bộ nhận phát hiện bit cuối này là dominant cũng không xem là một lỗi định dạng (FORM ERROR) mà đáp ứng lại bằng một khung báo quá tải.

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