5.2.1. Các kiểu lỗi cơ bản
Lỗi bit (Bit Error): Một bộ điều khiển gửi một bit trên đƣờng truyền Bus có nghĩa là nó có nhiệm vụ phải xác minh sự đồng nhất giữa dữ liệu nó gửi và dữ liệu truyền đến Bus. Nếu bộ truyền gửi một bit trội lên đƣờng truyền Bus nhƣng phát hiện một bit lặn
61 hay nó gửi một bit lặn lên đƣờng truyền Bus nhƣng phát hiện một bit trội, nghĩa là một lỗi bit đã bị phát hiện. Tuy nhiên lỗi bit phải đƣợc phát hiện trong bit time đó.
Hình 5.1: Lỗi bit
Một lỗi bit sẽ kh ng đƣợc công nhận trong vùng phân xử (Arbitration Field) hoặc vùng xác nhận (ACK Field). Bởi vì hai vùng đó là những vùng có thể ghi đề lên bit trội để thực hiện chức năng phân xử và chức năng xác nhận.
Lỗi chèn bit (Bit-Stuffing Error): Phƣơng pháp chén bit sẽ gây ra lỗi dữ liệu tại một số vùng của khung dữ liệu nhƣ: Vùng xác nhận (ACK), vùng kết thúc khung (EOF). Phƣơng pháp chén bit đối với khung remote cũng gần giống nhƣ khung dữ liệu tuy nhiên nó sẽ kh ng đƣợc chèn bit tại khoảng phân cách của vùng CRC. Ngoài ra khung lỗi (Error Frame), khung quá tải (Overload Frame) là dạng khung cố định và kh ng đƣợc mã hòa bằng phƣơng pháp chèn bit.
Hình 5.2: Lỗi chèn bit
Một lỗi chèn bit phải đƣợc phát hiện tại bit time của bit thứ sáu trong sáu bit cùng mức logic liên tiếp trong vùng bit chèn của khung và hệ thống CAN sẽ truyền một khung lỗi ở bit time kế tiếp.
Lỗi CRC: Chuỗi CRC là kết quả tính toán chuỗi bit kiểm tra của bộ truyền. Các bộ tiếp nhận cũng phải tính toán chuỗi CRC giống nhƣ bộ truyền. Một lỗi CRC đƣợc phát hiện nếu kết quả tính toàn không giống nhƣ kết quả nhận đƣợc trong dãy CRC, hay nói cách khác là kết quả tính toán trong bộ truyền và bộ nhận không giống nhau.
62
Hình 5.3: Lỗi CRC
Trong trƣờng hợp này, bộ truyền sẽ phải truyền một khung lỗi ở bit kế tiếp của khoảng phân cách CRC, trừ trƣờng hợp một cờ lỗi của điều kiện lỗi khác đã đƣợc bắt đầu trƣớc đó. Sự kiểm tra chuỗi bit CRC chỉ đƣợc dùng để phát hiện lỗi, nó kh ng dùng để khắc phục lỗi. Khoảng Hamming của chuỗi CRC có thể phát hiện tối đa 5 lỗi bit đơn lẻ ngẫu nhiên trong dãy bit.
Lỗi Form: Lỗi Form đƣợc phát hiện khi một dạng cố định của vùng bit chứa một hoặc nhiều bit không hợp lệ. Nghĩa là bộ truyền phát hiện một bit trội trong phần định dạng cố định của khoảng phân cách CRC, khoảng ACK và vùng kết thúc.
Hình 5.4: Lỗi Form
Chú ý: Trong bộ tiếp nhận, một bit trội xuất hiện trong bit cuối cùng của vùng kết thúc thì kh ng đƣợc xem là lỗi.
Lỗi xác nhận (ACK Error): Kiểm tra lỗi ACK, thiết bị truyền sẽ gửi một bit lặn ACK và một bit trội ACK sẽ đƣợc ghi đè lên bởi thiết bị nhận đã nhận thành công tin nhắn. Lỗi xác nhận sẽ đƣợc phát hiện bởi thiết bị truyền nếu nó không nhận thấy bit trộitrong khoảng ACK. Các lỗi đƣợc phát hiện sẽ đƣợc thông báo bằng cách truyền đi một cờ lỗi ngay tại bit time kế tiếp.
Lỗi cục bộ: Lỗi cục bộ thƣờng xảy ra trong phần kết thúc khung. Nếu một trong các bit tại vùng kết thúc từ bit một đến bit sáu bị phát hiện các bit trội, nó sẽ gửi một cờ lỗi để thông báo cho các nút. Dựa vào đặc t nh kĩ thuật của CAN chỉ ra rằng: Khi lỗi cục bộ xảy ra thì một tin nhắn có tác dụng khác nhau giữa bộ truyền và bộ nhận. Cụ thể nhƣ sau:
63 Bộ truyền: Truyền tin nhắn sẽ thành công với bộ truyền nếu nó không có lỗi cho đến vùng kết thúc khung. Nếu tin nhắn bị ngắn hay gián đoạn thì hệ thống CAN sẽ tự động gửi lại tin nhắn.
Bộ nhận: Truyền tin nhắn thành công với bộ nhận nếu nó không có lỗi cho đến tận bit cuối cùng của vùng kết thúc.
Hình 5.5: Lỗi cục bộ trong vùng kết thúc khung
Bộ tiếp nhận đã nhận một giá trị trội tại bit thứ bảy trong vùng EOF, nó không quan tâm đây có phải là lỗi hay không? Bộ tiếp nhận mất đi sự đồng bộ hóa vì một bit không hợp lệ xuất hiện trong dạng bit cố định. Hệ thống CAN sẽ gửi đi một khung quá tải để tạo ra độ trễ giữa các vùng. Bộ tiếp nhận sẽ th ng báo đến bộ truyền tại một thời điểm sớm nhất trong bit time kế tiếp, bộ truyền sẽ phải đợi thêm một bit time để tin nhắn đƣợc truyền thành công.
64
5.2.2. Cơ sở lý thuyết của việc phát hiện lỗi
Hệ thống CAN phát hiện lỗi trong các khung dữ liệu của một tin nhắn thì nó phải kết hợp các cách kiểm tra sau:
- Kiểm tra vòng lặp thừa (Cylic Redundancy Check – CRC): Nó kiểm tra dữ liệu trong các vùng trƣớc từ bit bắt đầu đến bit cuối cùng của vùng dữ liệu và kết thúc quá trình kiểm tra bằng một bit lặn.
- Kiểm tra khung: Kiểm tra định dạng của khung và các vùng bit đặc biệt (vùng bit cố định) của khung để phát hiện lỗi có thể xảy ra.
- Kiểm tra ACK (vùng xác nhận): Kiểm tra độ chính xác của tin nhắn.
Trong CAN Bus, sự kiểm tra vòng lặp thừa dùng để phát hiện lỗi trong sự truyền dữ liệu đƣợc dựa trên mã vòng lặp (cyclic code). Một dãy bit đƣợc biểu diễn dƣới dạng một đa thức đặc biệt (đa thức polynomial).
Ví dụ: Một dãy bit 11001101 đƣợc biểu diễn bởi một đa thức:
(5-2)
Trong đó: tƣơng ứng với bit quan trọng nhất, còn số một tƣơng ứng với bit ít quan trọng nhất.
Phƣơng pháp CRC là phƣơng phát kiểm tra và phát hiện lỗi đƣợc sinh ra bởi một thuật toán tuần hoàn tại hai vị trí nhận và gửi, một khối ký tự kiểm tra (Block Check Character) đƣợc chèn vào tin nhắn để truyền đi.Một phần cứng (Thanh ghi dịch-Shift Register) sẽ đảm bảo việc nhân, chia đa thức liên quan.
Một mã tuần hoàn đƣợc xác định bởi một đa thức sinh G(x), bậc k và một đa thức thông báo M(x), bậc n. Ví dụ:
( ) (5-3)
Mã hóa M(x) theo G(x) với giá trị n = 7
( ) ( ) ( ) ( )(5-4)
Trong đó: Q(x) là thƣơng của phép chia xM(x) cho G(x) và R(x) là số dƣ tƣơng ứng. Ta có:
( ) (5-5)
Mã hóa đa thức M(x )=( ):
( ) ( ) ( ) ( ) (5-6)
Mã hóa đa thức để truyền bây giờ đƣợc xây dựng bởi:
( ) ( ) ( ) (5-7)
65
( ) ( ) ( ) (5-8)
Tƣơng đƣơng: 110001010010001
Dãy bit đƣợc miêu ta bởi các đa thức tƣơng đƣơng nhƣ trên tuân theo quy luật đại số. Các bộ ghi dịch của phần cứng đảm bảo việc giải mã tuần hoàn bằng các phép nhân hoặc chia đa thức.
Sự phát hiện lỗi của một tin nhắn tuần hoàn đƣợc mã hóa thì dựa vào một số yếu tố nhƣ: Sự sai lệch trong việc truyền dữ liệu, đa thức truyền P(x) sẽ có một thành phần lỗi. Chúng ta có:
( ) ( ) ( )(5-9)
Lỗi truyền xảy ra nếu Q(x) không chia hết cho F(x) và E(x) không chia hết cho P(x).Vì vây, chọn P(x) là một vấn đề mang tính quyết định để có thể giải quyết các kiểu lỗi xảy ra trong quá trình truyền tải.
Ngoài ra, mã tuần hoàn có thêm một ƣu điểm. Đó là một mã có khả năng phát hiện một lỗi kép thì nó cũng có khả năng khắc phục một lỗi đơn. Trong trƣờng hợp xuất hiện lỗi đơn, một bit đã đƣợc khắc phục thì sẽ không xuất hiện lỗi. Trong trƣờng hợp lỗi kép thì hệ thống sẽ xuất hiện lỗi nếu một bit đƣợc khắc phục.
Trong Bus CAN, đa thức sinh (Generator Polynomial) là đa thức:
X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1 (5-10)
Đa thức đƣợc dùng làm đa thức bị chia và các hệ số của nó đƣợc xác định bởi các dãy bit xả nhồi của một số vùng:
- Vùng bắt đầu của khung - Vùng phân xử
- Vùng điều khiển - Vùng dữ liệu
Giá trị 0 tƣơng ứng với 15 hệ số thấp nhất. Số dƣ của phép chia đƣợc truyền trong khung ứng với chuỗi CRC. Sự thông báo lỗi để báo cho tất cả các nút trên Bus có một tình trạng lỗi đƣợc phát hiện. Một nút phát hiện một tính rạng lỗi chẳng hạn nhƣ lỗi bit, lỗi nhồi bit, lỗi CRC, lỗi xác nhận thì nó sẽ thông báo cho các nút khác bằng cách truyền đi một cờ lỗi. Nếu lỗi là lỗi chủ động thì nút sẽ truyền cờ báo lỗi chủ động hoặc nếu lỗi là lỗi bị động thì nút sẽ truyền cờ báo lỗi bị động. Một trong các lỗi kể trên xảy ra thì hệ thống điều khiển CAN sẽ truyền cờ lỗi ngay bit kế tiếp. Ngoài ra, nếu một lỗi CRC đƣợc phát hiện, cờ báo lỗi sẽ bắt đầu truyền sau khoảng phân cách ACK (ACK Delimiter), trừ trƣờng hợp một cỡ lỗi của lỗi khác đƣợc truyền trƣớc đó.
5.3. HẠN CHẾ LỖI (FAULT CONFINEMENT) 5.3.1. Khung lỗi chủ động và khung lỗi bị động 5.3.1. Khung lỗi chủ động và khung lỗi bị động
66 Các bộ điều khiển trên đƣờng truyền Bus có một trong các trạng thái sau:
- Trạng thái lỗi chủ động: Bộ điều khiển tham gia giao tiếp trên đƣờng truyền Bus bình thƣờng. Khi hệ thống phát hiện lỗi thì nó sẽ gửi đi cờ báo lỗi chủ động.
- Trạng thái lỗi bị động: Bộ điều khiển kh ng đƣợc phép gửi một cờ báo lỗi chủ động. Nó vẫn tham gia giao tiếp trên đƣờng truyền Bus nhƣng khi hệ thống phát hiện lỗi thì nó chỉ đƣợc phép gửi cờ báo lỗi bị động. Sau khi thực hiện một lần truyền, bộ điều khiển ở trạng thái lỗi bị động sẽ phải chờ trƣớc khi bắt đầu truyền tiếp.
- Trạng thái không hoạt động (Bus off):Vì bộ điều khiển ở trạng thái ngắt nên bộ điều khiển không tham gia truyền dữ liệu trên đƣờng truyền Bus.
5.3.1.1. Khung lỗi chủ động (Active Error Frame)
Hình 5.6: Khung lỗi chủ động
Khi một nút phát hiện lỗi trên đƣờng truyền Bus thì một khung lỗi sẽ đƣợc truyền đi. Khung lỗi chƣa một cờ lỗi (Error Flag) và một khoảng phân cách lỗi (Erro Delimiter). Các bit trội của cờ lỗi sẽ ghi đề lên khung dữ liệu bị lỗi và ngăn ngừa việc nhận dữ liệu của các nút khác.Khi tín hiệu cờ báo lỗi đƣợc gửi đi, các bộ điều khiển khác nhận ra lỗi và ngừng nhận dữ liệu để gửi cờ lỗi của chính nó.Cuối cùng là 8 bit lặn của vùng phân cách lỗi cho phép khởi động lại sự giao tiếp trên đƣờng truyền Bus.
5.3.1.2. Khung lỗi bị động (Passive Error Frame)
Hệ thống CAN ngăn ngừa sự tắc ngẽn trên đƣờng truyền Bus thì các khung lỗi đƣợc gửi từ các nút bị lỗi sẽ bị hạn chế. Một nút lỗi chủ động sẽ gửi đi cờ báo lỗi trội còn một nút lỗi bị động sẽ gửi đi cờ báo lỗi lặn. Trong vùng phân cách lỗi, nút sẽ kiểm tra xem liệu nó có phải là nút đầu tiên phàn hồi lỗi hay không? Nếu nó là nút đầu tiên thì ngừng truyền dữ liệu.
Các bộ tiếp nhận lỗi bị động không làm ảnh hƣởng đến việc truyền dữ liệu, bởi vì các cờ báo lỗi lặn không ảnh hƣởng đến mức độ ƣu tiên trên đƣờng truyền Bus. Bộ truyền lỗi bị động có thể ngắt truyền tin nhắn bằng cách truyền đi một cờ lỗi bị động.
67
Hình 5.7: Khung báo lỗi bị động
Chú ý: Khi một bộ nhận đang trong trạng thái lỗi bị động thì tính bên vững, nhất quan của dữ liệu kh ng đƣợc đảm bảo.
5.3.2. Các bộ đếm lỗi
Mỗi bộ điều khiển CAN đều có hai bộ đếm để phục vụ cho việc hạn chế lỗi: Bộ đếm lỗi truyền (Transmit Error Counter_TEC) và bộ đếm lỗi nhận (Receive Error Counter_REC)
5.3.2.1. Bộ đếm lỗi truyền (Transmit Error Counter_TEC)
68 0-96: Nút đang ở trạng thái lỗi chủ động (Active Error) dƣới mức giới hạn cảnh báo. Nếu bộ đếm vƣợt quá giá trị 96 lỗi thì bộ điều khiển CAN sẽ thiết lập cảnh báo.
97-127: Nút đang ở trạng thái lỗi chủ động. Bộ đếm nằm trong khoảng giá trị này nghĩa là nút gặp vấn đề nặng (nhiễu nặng).
128-225: Nút đang ở trạng thái lỗi bị động. Tuy nhiên, một vài bộ điều khiển CAN không thông báo cho hệ thống biết về sự thay đổi vì nhiễu tín hiệu.
>225: Nút sẽ chuyển sang trạng thái ngắt kết nối (Bus Off). Bộ vi xử lý sẽ đƣợc thông báo về tình trạng của nút.
5.3.2.2. Bộ đếm lỗi nhận (Receive Error Counter_REC)
Hinh 5.9: Bộ đếm lỗi nhận
Về lý thuyết, một nút lỗi truyền đi một cờ lỗi thì các nút khác sẽ tăng bộ đếm lỗi của chúng thêm một đơn vị. Do đó, nhà chế tạo đã đƣa ra các quy luật hạn chế lỗi của CAN.Giá trị số lỗi nhận (REC) sẽ đƣợc giới hạn bằng một số thức (127). Trong các model của Bosch, số lỗi nhận chỉ có dung lƣợng 8 bit. Vì vậy giá trị số lỗi nhận không thể tăng lên trong chế độ lỗi bị động.
5.4. Các quy luật hạn chế lỗi
Hệ thống CAN phải tuân theo một số quy tắc nhằm hạn chế lỗi:
1. Khi bộ nhận phát hiện lỗi, sự đếm lỗi sẽ tăng lên một, trừ khi lỗi bit trong quá trình gửi một cờ lỗi chủ động hay một cờ báo quá tải (Overload Flag).
2. Sau khi gửi đi một cờ báo lỗi, bộ nhận phát hiện một bit trội thì bộ đếm lỗi nhận sẽ tăng lên 8.
69
3. Khi bộ truyền đi một cờ lỗi thì bộ đếm lỗi bộ truyền sẽ tăng lên 8
Ngoại trừ:
- Trƣờng hợp 1: Bộ truyền đang ở trạng thái lỗi bị động và nó phát hiện ra một lỗi xác nhận (ACK Error) bởi vì bộ điều khiển không tìm thấy một bit ACK trội và không tìm thấy một bit trội khi nó gửi cờ báo lỗi bị động.
- Trƣờng hợp 2: Bộ truyền gửi đi một cờ báo lỗi do lỗi nhồi bit xảy ra trong vùng phân xử. Phƣơng pháp nhồi bit phải đƣợc thực hiện trƣớc bit RTR. Đáng lẽ bộ điều khiển phải gửi đi một bit trội theo tình trạng trên đƣờng truyền Bus tuy nhiên nó lại gửi một bit lặn. Trong hai trƣờng hợp trên bộ đếm lỗi truyền sẽ kh ng thay đổi.
4. Khi bộ truyền đang gửi một cờ báo lỗi chủ động (Active Error Flag) hoặc một cờ báo quá tải (Overload Flag) thì nó phát hiện một bit lỗi thì bộ đếm lỗi truyền sẽ tăng lên giá trị 8.
5. Khi bộ nhận đang gửi một cờ báo lỗi chủ động (Active Error Flag) hoặc một cờ báo quá tải (Overload Flag) thì nó phát hiện một bit lỗi thì bộ đếm lỗi nhận tăng lên 8.
6. Một nút kh ng đƣợc phép có 7 bit trội liên tiếp sau khi gửi một cờ báo lỗi chủ động, cờ báo lỗi bị động, cờ báo quá tải. Khi bộ điều khiển CAN phát hiện bit trội thứ 14 trong chuỗi bit trội liên tiếp (bộ điều khiển CAN gửi đi cờ lỗi chủ động và cờ lỗi quá tải) hoặc phát hiện bit trội thứ 8 trong chuỗi bit trội liên tiếp theo sau cờ lỗi bị động và sau một chuỗi 8 bit trội bổ sung vào tin nhắn. Mỗi bộ truyền sẽ tăng bộ đếm lỗi của nó lên 8 và mỗi bộ nhận cũng sẽ tăng bộ đếm lỗi của nó lên 8.
7. Bộ điều khiển CAN truyền thành công một tin nhắn (tin nhắn có khung xác nhận và không có lỗi cho đến khi kết thúc vùng kết thúc) thì số lỗi của bộ truyền sẽ giảm một, trừ trƣờng hợp số lỗi bộ truyền là 0.
8. Bộ điều khiển CAN nhận thành cộng một tin nhắn (tin nhắn không có lỗi đến khoảng ACK (ACK Slot) và gửi thành công bit của vùng ACK) thì sỗ lỗi của bộ nhận sẽ giảm một, trƣờng trƣờng hợp số lỗi bộ nhận từ 1 đến 127. Bộ đếm lỗi nhận lớn hơn 127 sẽ thiết lập một giá trị giữa 119 và 127.
9. Khi số lỗi truyền bằng hoặc vƣợt quá 128 hay khi số lỗi bộ nhậnbằng hoặc vƣợt quá 128 thì nút đang ở trạng thái lỗi bị động. Một nút đáp ứng một trong hai điều khiển trên thì nút trở thành nút lỗi bị động và nó phải gửi đi cờ báo lỗi bị động.
10. Một nút chuyển sang trạng thái ngắt (Bus Off) khi bộ đếm lỗi truyền bằng hoặc vƣợt quá 256 lỗi.
11. Một nút đang ở trạng thái lỗi bị động chuyển sang trạng thái lỗi chủ động khi bộ đếm lỗi truyền và bộ đếm lỗi nhận có giá trị nhỏ hơn hoặc bằng 127.
70
12. Khi bộ đếm lỗi nhận và bộ đếm lỗi truyền đƣợc thiết lập về giá trị 0 khi hệ thống CAN xuất hiện 128 lần 11 bit lặn liên tiếp trên đƣờng truyền Bus thì nút ở trạng thái ngắt chuyển sang trạng thái lỗi chủ động.
Chú ý:
- Một nút có giá trị bộ đếm lỗi lớn hơn 96 thì đƣờng truyền Bus bị nhiễu nặng. Chúng