Tổng quan về giap tiếp CAN và hướng dẫn sử dụng CAN trên vi điều khiển STM32 – P1

CAN là một chuẩn giao tiếp có dây được phát triển bởi công ty BOSCH. CAN được thiết kế để cho phép liên lạc hiệu quả và đơn giản giữa các bộ điều khiển điện tử (ECU – Electronic Control Unit – Node) trong một mạng phức tạp.

Bài viết này sẽ giới thiệu tổng quan, giải thích các cơ chế hoạt động cơ bản của giao tiếp CAN, đồng thời hướng dẫn sử dụng CAN trên vi điều khiển STM32.

Các ECU trong xe hơi 

  • Hệ thống điện tử bên trong xe hơi bao gồm rất nhiều thành phần kết nối với nhau một cách phức tạp. Sự phối hợp nhịp nhàng giữa các bộ phận liên quan đến việc đảm bảo một chiếc xe hoạt động trơn tru. Một hệ thống điện tử điển hình của xe hơi có thể được chia thành nhiều phần như: động cơ, hệ thống truyền động, điều hòa, giải trí đa phương tiện, phanh,…

Hình 1. Ví dụ về hệ thống điện tử trên xe hơi (Source: https://www.bestproto.net/news/category/newsletter/) 

  • Mỗi chức năng của xe hơi sẽ do một bộ điều khiển đảm nhận được gọi là ECU (Electronic Control Unit) hay ECM (Electronic Control Module). Đây là một hệ thống nhúng trong hệ thống điện tử của ô tô. 
  • Trong một số xe hiện đại, số lượng ECU có thể lên tới 150 đơn vị. Các ECU này liên tục được phát triển: tăng về số lượng, độ phức tạp và độ tinh vi. Vì vậy việc quản lý hiệu quả một hệ thống phức tạp, nhiều thành phần mà vẫn phải đáp ứng nhiều điều kiện khắt khe trong tiêu chuẩn ngành công nghiệp xe hơi thật sự là thử thách lớn với các nhà sản xuất và phát triển 

Hình 2. Sự phức tạp của hệ thống điện tử trên xe hơi (Source: https://fr.scribd.com/doc/262438555/Automobile-ECU)

CAN – Đơn giản hóa sự phức tạp

  • BOSCH tạo ra giao thức CAN nhằm đơn giản hóa việc giao tiếp giữa các ECU từ đó tăng khả năng kiểm soát và tối ưu hóa những hệ thống điện bao gồm nhiều thành phần có những chức năng khác nhau. Có thể hiểu, CAN có thể được áp dụng hiệu quả nhất trong các hệ thống cấu tạo từ nhiều vi điều khiển, cần giao tiếp với nhau một cách ổn định, tin cậy.

Hình 3. Ví dụ về hệ thống CANBus trên xe hơi (Source: http://www.flexautomotive.net/EMCFLEXBLOG/post/2015/09/08/can-bus-for-controller-area-network) 

  • Ưu điểm nổi bật của CAN và lý do nó được sử dụng trong xe hơi:
    • Cấu tạo đơn giản: CANbus chỉ có sử dụng duy nhất 2 dây để nhiều ECU trong hệ thống có thể giao tiếp với nhau  
    • Khả năng chống nhiễu: Canbus được thiết kế tăng khả năng chống nhiễu khi hoạt động trong môi trường không ổn định như xe hơi, VD: Dây tín hiệu được nối đi ngang qua động cơ bị ảnh hưởng bởi nhiễu từ trường,…
    • Ngoài ra do cấu tạo đơn giản nó còn có một số ưu điểm khác như là dễ lắp đặt, giá rẻ và dễ áp dụng cho nhiều hệ thống xe hơi khác nhau.

Cấu tạo của một CANbus – mạng lưới các thiết bị giao tiếp với nhau sử dụng giao thức CAN

  • Một ECU trên CANbus có 3 thành phần cơ bản: Vi điều khiển(MCU), CAN Controller và Can Transceiver 
    • Vi điều khiển: Xử lý dữ liệu nhận được từ bộ điều khiển CAN (CAN Controller) và điều khiển dữ liệu sẽ được gửi đến một ECU khác.
    • CAN Controller: 
      • Khi truyền: Truyền dữ liệu nối tiếp từ vi điều khiển theo vào bus khi bus rảnh.
      • Khi nhận: Nó lưu trữ các bit đã nhận từ bus cho đến khi có toàn bộ khung truyền (nhờ EOF) và thông báo vi điều khiển lấy lại tin nhắn đó.
    • CAN transceiver: 
      • Khi nhận: Chuyển đổi mức điện áp trên bus CAN thành mức mà CAN Controller có thể hiểu được (bit nhị phân). 
      • Khi truyền: Nó chuyển đổi luồng dữ liệu logic nhị phân từ CAN controller thành mức logic của bus CAN.

Hình 4. Cấu tạo phần cứng một Node CAN

Cơ chế truyền nhận trên dây

  • CANbus sử dụng hai dây để giao tiếp. Các dây được gọi là CAN High và CAN Low. CANbus kết nối với tất cả các thành phần trên mạng thông qua hai dây này. Trong CANbus không hề phân biệt Master và Slave như một số giao thức khác.

Hình 5. Ví dụ về các Node trên hệ thống CAN 

  • Các điểm đầu và cuối của Canbus thường được nối bằng bằng điện trở 120 ohm, điện trở này được gọi là terminator resistor. 
  • Không giống như một số giao thức khác trong việc sử dụng mức điện áp trên dây so với GND để quy đổi ra bit logic, CAN sử dụng mức chênh lệch điện áp giữa 2 dây để quy đổi. Những thay đổi về mức điện áp này sau đó được dịch sang mức logic:

Hình 6. Logic 0 và Logic 1 trên CANBus

  • Thông thường, giá trị điện áp cao nhất ở dây CAN High là 3.5V, điện áp thấp nhất là 2.5V.  Ở dây CAN low điện áp thấp nhất là 1.5V và cao nhất là 2.5V:
    • Mức logic 0: Khi VCANH – VCANL = 2.5V. Hay mức chênh lệch điện áp 2 dây là 2.5V.
    • Mức logic 1: Khi VCANH – VCANL = 0V. Hay khi cả hai dây đều có điện áp 2.5V.
  • Đó chính là lý do tại sao CAN lại có khả năng kháng nhiễu rất tốt. Đơn giản, khi có nhiễu tác động lên CANbus đều khiến mức điện áp ở 2 dây cùng thay đổi,cùng tăng hoặc cùng giảm nhưng mức chênh lệch điện áp giữa 2 dây không thay đổi nhiều.

Hình 7. Khả năng kháng nhiễu của giao tiếp CAN (Source:https://www.youtube.com/watch?v=JZSCzRT9TTo) 

Cơ chế truyền gói tin

  • Mỗi ECU trên bus có một ID định danh phân biệt với các ECU khác. Tất cả các ECU trên bus đều được nối song song với đường dây, điều này dẫn đến tất cả các ECU đều nhận mọi dữ liệu chạy trên đường bus mọi lúc. Chúng ta có thể cấu hình để 1 ECU chỉ nhận gói tin đến từ một hay nhiều ECU nhất định bằng ID.
  • Có 4 loại gói tin CAN : Data Frame, Remote Frame, Error Frame and Overload Frame
    • Data Frame : Gói tin được truyền từ ECU này sang ECU khác
    • Remote Frame: 
      • Cung cấp khả năng cho phép ECU yêu cầu thông tin từ các ECU khác (dựa vào bit RTR)
      • VD: Thiết bị ECU muốn nhận dữ liệu từ 5 cảm biến định kỳ 5s/1 lần  mà chỉ có 3 cảm biến gửi về, thì ECU này sẽ gửi 1 Remote Frame giúp kiểm tra có lỗi do dây đứt (không có dữ liệu phản hồi), lỗi cảm biến  (có dữ liệu phản hồi trạng thái của cảm biến)
    • 2 Frame cuối để sửa lỗi ít được sử dụng: Error Frame, Overload Frame
  • Cấu trúc gói tin của ECU khi truyền bao gồm như sau: 
    • SOF: Bit bắt đầu của khung truyền với giá trị 0 để thông báo cho các ECU khác biết rằng một ECU muốn truyền dữ liệu.
    • Arbitration Field (Trọng tài)
      • ID: là định danh của một ECU. Nó được sử dụng để chỉ rõ ECU nào đang gửi gói tin. ID cũng xác định mức độ ưu tiên: ID càng thấp, mức độ ưu tiên của gói tin càng cao. Gồm 11 bit ID cho gói tin Standard và 29 bit cho gói tin Extended. 
      • RTR: 1 bit dùng để thể hiện yêu cầu 1 ECU khác truyền dữ liệu. Để thực hiện yêu cầu RTR, gửi gói tin không cần Data Field mà bit RTR mức 0.

Hình 8. Cấu trúc gói tin Standard CAN (Source: https://www.ti.com/lit/an/sloa101b/sloa101b.pdf) 

Hình 9. Cấu trúc gói tin Extended CAN

    • Control Field : IDE: 1 bit dùng để kiểm tra xem gói tin Extended hay Standard
    • Data Field : Chứa 8 byte dữ liệu được truyền đi (Vd: Giá trị cảm biến)
    • CRC Field : Mã kiểm tra lỗi dữ liệu
    • ACK Field : Bit xác nhận cho biết liệu ECU nhận xác nhận đã nhận được dữ liệu.
    • EOF: Đánh dấu kết thúc của khung truyền.

Cơ chế lọc của CANbus

  • Khi 1 ECU truyền gói tin đi, các ECU khác đều nhận được gói tin của ECU đó. Sau đó, các ECU sẽ bắt đầu quá trình lọc thông tin (filtering) để biết được ID của gói tin (ID của ECU truyền). Nếu ID của bản tin nằm trong danh sách ID cho phép nhận của ECU nhận thì ECU đó sẽ tiếp tục xử lý gói tin đó, ngược lại sẽ bỏ qua.

Cơ chế tránh xung đột của CAN khi truyền

  • CAN xác định độ ưu tiên còn dựa vào Arbitration field gồm gồm các bits ID và 1 bit RTR. Vì “ID” của CAN được lập trình hoàn toàn bằng người dùng, phần cứng bản chất không có “thanh ghi” chứa ID. Tuy nhiên, vì với CAN nhiều ECU đều kết nối trên cùng ở 1 đường bus và vì thế chỉ có duy nhất 1 ECU được truyền đi trong một thời điểm. Vậy nên để đảm bảo hoạt động bình thường, CAN bus còn phải thực hiện quá trình kiểm định (arbitration) bằng cách xác định ID của gói tin. ID càng thấp thì độ ưu tiên của gói tin càng cao
  • Arbitration Process: Quá trình phân xử thường sẽ được quản lý bởi CAN Controller của một ECU. Khi ECU đó gửi gói tin thì sẽ đọc lại dữ liệu trên đường truyền CAN và thực hiện quá trình phân xử được giải thích kỹ hơn trong ví dụ sau:
    • Ban đầu mặc định đường logic trên CAN bus là 0 (dominant level) và nó chỉ lên 1 tất cả các node đều gửi 1 (do cấu tạo cách mắc các mode hoạt động như các cổng AND gate).
    • Khi cả ECU 15 và ECU 16 đều muốn gửi đi, với các bit từ 10 đến 5 đều là 0 và khi cả 2 node thăm do chúng đều thấy bình thường do logic trên đường bus chung trùng với logic tụi nó gửi đi.
    • Tuy nhiên khi đến bit thứ 4, do ECU 16 giá trị bit đó là 1, nhưng đường CAN bus vẫn ở giá trị 0 khi đó ECU 16 khi thăm dò sự bất thường khi tín hiệu đường bus thấy giá trị 0 trong khi nó đang gửi 1. Vì vậy ECU 16 sẽ hiểu đường bus chung đã bị ECU 15 có ID thấp hơn kiểm soát về 0 nên nó sẽ tự động qua chế độ nhận và ECU 15 sẽ tiếp tục gửi phần còn lại của gói tin.
    • Trong trường hợp ngược lại, nếu ECU 15 đang gửi 0 mà đường bus chung lại là 1 thì nó sẽ tính đó là 1 trường hợp lỗi ( Vì không thể có chuyện một node gửi 0 mà đường bus vẫn giữ nguyên mức logic 1) ( 0 AND X không thể = 1).

Hình 10. Mô tả quá trình phân xử xung đột trên CANbus

  • Trên thực tế, CAN bus khó có thể tránh khỏi việc xung đột đường bus. CAN có một số cơ chế tránh xung đột (Arbitration Process). Tuy nhiên nếu người dùng bản thân lập trình không cẩn trọng CAN bus có thể bị lỗi, như việc gắn ID của 2 gói tin như nhau. CAN không thể tự tránh xung đột trong những trường hợp như này, đôi lúc hệ thống vẫn sẽ hoạt động bình thường và đôi lúc lỗi. Vì vậy, khi lập trình CAN người dùng phải thiết kế cẩn thận, set ID cho mỗi gói tin sao cho hợp lý (vd: không nên đặt ID 2 gói tin giống nhau), đúng với nhu cầu và phù hợp cho hệ thống.

Phần tiếp theo sẽ cung cấp các hướng dẫn sử dụng CAN trên vi điều khiển STM32, thiết lập kết nối giữa 2 vi điều khiển STM32 bằng giao tiếp CAN thông qua module MCP2551 và sử dụng UART để thể hiện dữ liệu lên màn hình máy tính.

Chúc các bạn thành công!
Nhóm tác giả : Trần Đình Hoàng Long, Lê Hữu Bảo Thuận

Hướng dẫn : Nguyễn Huỳnh Nhật Thương