3.25. Kiến thức cơ bản về bus CAN¶
CAN (Controller Area Network) ban đầu được Bosch thiết kế vào những năm 1980 để kết nối tất cả các bộ điều khiển điện tử trong ô tô trên một bus chia sẻ ngắn. Nó vẫn còn chiếm ưu thế trong dây điện ô tô, nhưng sự bền vững, đặc tính thời gian thực và thiết kế đa chủ cũng khiến nó trở thành bus hiện trường mặc định trong tự động hóa, robot, thiết bị nông nghiệp và công nghiệp đủ loại.
CAN không có một "bộ điều khiển" đơn lẻ và một tập hợp các "ngoại vi" như SPI hay I2C. Mỗi nút trên bus đều là ngang hàng, và bất kỳ nút nào cũng có thể truyền khi bus đang rảnh. Điều làm cho điều đó hoạt động theo quy mô là thiết kế phát sóng có trọng tài của bus.
3.25.1. Phát sóng với trọng tài ưu tiên¶
Mỗi thông điệp trên bus CAN mang một định danh -- 11 bit cho khung chuẩn cổ điển, 29 bit cho biến thể mở rộng. Định danh không phải là địa chỉ; nó ghi nhãn nội dung của thông điệp là gì (vòng quay động cơ, vị trí bàn đạp phanh, điện áp pin, v.v.). Khi một nút muốn gửi một giá trị, nó phát sóng với định danh thích hợp, và mọi nút trên bus đều nhận được phát sóng đó. Mỗi bộ nhận lọc bus theo phần cứng để chỉ chọn các ID mà nó quan tâm.
Nếu hai nút cố gắng truyền cùng lúc, thiết kế điện của bus cho phép thông điệp có định danh số thấp hơn thắng mà không mất bit nào.
Bí quyết nằm ở hai trạng thái điện của bus: dominant (logic 0) và recessive (logic 1). Các dây CAN được giữ ở mức cao (recessive) bởi các điện trở kết cuối khi không có nút nào đang truyền; bất kỳ nút nào cũng có thể kéo dây xuống thấp (dominant) bằng cách cấp dòng qua bộ thu phát của nó. Kết quả là một AND dây: nếu bất kỳ nút đơn lẻ nào điều khiển bus dominant, đường dây đọc là dominant, và nó đọc là recessive chỉ khi mọi nút đều đã thả ra. Dominant luôn thắng. (Một số tài liệu tham khảo gọi cùng một cách sắp xếp là OR dây, coi "dominant" là tín hiệu được khẳng định thay vì AND của các bit recessive -- hành vi vật lý giống nhau theo cả hai cách.)
AND dây ở dạng khái niệm. CAN thực sự chạy cùng logic đó trên một cặp vi sai (CAN_H / CAN_L) với các bộ thu phát và điện trở kết cuối được chia đều trên cả hai dây, nhưng quy tắc trên bus vẫn như vậy: bất kỳ nút nào cũng có thể kéo dominant, chỉ khi mọi nút đều đã thả ra thì nó mới đọc là recessive.¶
Quá trình trọng tài sử dụng sự bất đối xứng này trực tiếp. Mỗi nút truyền gửi ID của nó từng bit một, MSB trước, và quan sát bus trong khi nó truyền. Một nút đặt bit recessive lên dây nhưng đọc lại là dominant biết rằng một nút khác có ID thấp hơn đang truyền cùng lúc và đã thắng ở vị trí bit đó. Nút đó dừng điều khiển bus ngay lập tức và lắng nghe. Trong khi đó, nút thắng thấy các bit của chính nó phát ra không thay đổi -- theo quan điểm của nó, không có gì bất thường xảy ra. ID có số thấp hơn thắng vì các bit dominant của nó ghi đè lên các bit recessive mà các ID có số cao hơn sẽ gửi ở cùng vị trí.
Nút thua sau đó chờ bus về trạng thái rảnh và tự động thử lại. Không có va chạm, không mất thông điệp -- chỉ có thứ tự ưu tiên xác định.
Đây là kiểu publish/subscribe khiến CAN hoạt động theo quy mô: bất kỳ ai cũng có thể nói, bất kỳ ai cũng có thể lắng nghe, và các ID làm cho việc điều phối trở nên ngầm định.
3.25.2. Bus vật lý¶
Bộ điều khiển CAN của MCU không điều khiển bus trực tiếp. Nó chỉ cung cấp hai chân CMOS 3.3 V -- TX (bit nó muốn gửi) và RX (bit nó thấy trên bus) -- và các chân đó kết nối với một chip riêng gọi là bộ thu phát CAN hay PHY. Bộ thu phát nằm giữa bộ điều khiển và dây CAN thực tế; đó là thứ biết cách giao tiếp với bus.
Bản thân bus là một cặp vi sai 5 V:
CAN_H -- dây "cao" của cặp.
CAN_L -- dây "thấp".
Ở trạng thái recessive, cả hai dây ở khoảng 2.5 V (điểm giữa của nguồn 5 V của bus). Ở trạng thái dominant, bộ thu phát kéo CAN_H lên khoảng 3.5 V và CAN_L xuống khoảng 1.5 V, tạo ra vi phân khoảng 2 V qua cặp. Các bộ nhận lấy mẫu hiệu số giữa hai dây, điều này làm cho tín hiệu miễn nhiễm với nhiễu chế độ chung được thu lên qua các đường cáp dài.
Nhiệm vụ hai chiều của bộ thu phát:
Ở phía TX, nó đọc chân TX đơn đầu 3.3 V của bộ điều khiển và hoặc điều khiển CAN_H và CAN_L ra xa nhau cho dominant hoặc thả cả hai cho recessive.
Ở phía RX, nó đọc cặp vi sai CAN_H / CAN_L và báo cáo mức 3.3 V đơn đầu trên chân RX của nó trở lại bộ điều khiển.
Hai điện trở kết cuối 120 ohm, một ở mỗi đầu vật lý của cáp, giữ bus ở điểm giữa recessive khi không có nút nào đang điều khiển và dập tắt các phản xạ mà nếu không sẽ làm hỏng tín hiệu vi sai trên các đường chạy dài.
3.25.3. Khung dữ liệu¶
Một khung dữ liệu CAN chuẩn trông như thế này trên dây:
Một khung dữ liệu CAN chuẩn: các trường SOF, ID, RTR, control, data, CRC, ACK và EOF.¶
Mỗi trường có một nhiệm vụ cụ thể:
SOF (bắt đầu khung). Một bit dominant báo hiệu một khung mới đang bắt đầu và đồng bộ hóa đồng hồ bit của mọi nút.
ID (định danh). Định danh 11 bit mà bus trọng tài. Số thấp hơn = ưu tiên cao hơn.
RTR (yêu cầu truyền từ xa). Được đặt trên yêu cầu dữ liệu thay vì gửi dữ liệu; các bộ nhận có ID khớp phản hồi bằng cách tự gửi dữ liệu.
Control. Một trường 6 bit mã hóa độ dài dữ liệu (
DLC) và một vài bit quản lý.Data. 0 đến 8 byte tải trọng (CAN Classic; CAN FD mở rộng lên 64 byte).
CRC. Tổng cộng 16 bit: một CRC 15 bit trên các trường trước cộng với 1 bit phân cách CRC.
ACK. Tổng cộng 2 bit. Ở bit đầu tiên -- khe ACK -- máy phát thả đường và bất kỳ nút nào nhận được khung chính xác kéo nó xuống thấp; bit thứ hai là phân cách recessive. Thiếu ACK cho máy phát biết không có nút nào nghe thấy khung và nó cần thử lại.
EOF (kết thúc khung). Bảy bit recessive đóng khung.
Tất cả những điều đó được tạo và giải mã bởi bộ điều khiển CAN trong phần cứng; phần mềm chỉ thấy ID, dữ liệu và một vài cờ.
3.25.4. Vị trí của CAN¶
Các lựa chọn thiết kế của CAN xác định vị thế của nó:
Bền vững. Báo hiệu vi sai trên cặp dây xoắn, phát hiện lỗi tích hợp, trọng tài ưu tiên xác định và tự động thử lại khiến CAN tồn tại trong môi trường ồn ào về điện nơi UART và SPI sẽ làm hỏng dữ liệu.
Đa chủ. Bất kỳ nút nào cũng có thể nói bất cứ lúc nào. Không cần bộ điều khiển trung tâm và không có nút nào là điểm lỗi duy nhất.
Băng thông giới hạn. CAN cổ điển đạt tối đa khoảng
1 Mbit/s; CAN FD mở rộng điều này. CAN là câu trả lời đúng khi liên kết nằm giữa các bảng mạch hoặc mô-đun, thường qua nhiều mét cáp, với độ tin cậy là ưu tiên hàng đầu.Giao thức lớp cao hơn. Bus CAN trần không nói ID có nghĩa gì hay cách chia một thông điệp dài thành các đoạn. Các giao thức lớp ứng dụng -- CANopen, J1939, ISO-TP/UDS, NMEA 2000 -- đặt các quy tắc đó lên trên. Một điều đáng biết riêng là tệp DBC: một định dạng văn bản do nhà cung cấp quy định ghi lại các ID nào mang tín hiệu cấp bit nào trên một phương tiện hoặc hệ thống cụ thể. Tệp DBC là định dạng metadata mô tả bố cục thông điệp của một bus, không phải giao thức riêng của chúng.
Trình điều khiển trong Bus CAN trong code xử lý khung CAN cấp dây; việc ánh xạ các ID thành ý nghĩa là công việc của ứng dụng.