Giao tiếp CAN

0
1996

Controller Area network (CAN bus) là một chuẩn bus ổn định dùng cho các phương tiện giao thông, đặc biệt là xe hơi. CAN được thiết kế để các vi điều khiển và các thiết bị giao tiếp với nhau mà không cần thông qua máy tính. CAN là một giao thức hoạt động dựa trên các gói tin (message-based protocol), ban đầu được thiết kế để ghép kênh (multiplex) các dây điện trong ô tô để tiết kiệm số lượng dây dẫn, nhưng sau đó được sử dụng rộng rãi hơn trong các trong các hệ thống tự động hóa công nghiệp hay hàng không.

Giao thức CAN hỗ trợ hai định dạng Data Frame:

  • CAN tiêu chuẩn (CAN 2.0A) – Standard Data Frame
  • CAN mở rộng (CAN 2.0B) – Extended Data Frame

Trong bài viết này chúng ta sẽ tìm hiểu về tiêu chuẩn CAN 2.0A, CAN 2.0B hoàn toàn tương thích với CAN 2.0A mặc dù CAN2.0B có thể truyền và nhận các thông điệp mở rộng, không giống như chỉ truyền và nhận các thông điệp chuẩn của CAN2.0A.

Khung dữ liệu của chuẩn giao tiếp CAN:

Data Frame CAN (Phiên bản 2.0A) tiêu chuẩn bao gồm bảy trường bit khác nhau:

1.Trường bắt đầu khung (Start Of Frame Field – SOF)

Với cả 2 định dạng của chuẩn CAN 2.0 thì trường bắt đầu là vị trí của bit đầu tiên trong khung. Trường này chiếm 1 bit dữ liệu. Bit đầu tiên này là một Dominant Bit (mức logic 0) đánh dấu sự bắt đầu của một Data Frame.

2.Trường xác định quyền ưu tiên (Arbitration Field)

Định dạng vùng xác định quyền ưu tiên là khác nhau đối với dạng khung chuẩn và khung mở rộng.

  • Định dạng chuẩn: vùng xác định quyền ưu tiên có độ dài 12 bit, bao gồm 11 bit ID và 1 bit RTR.
  • Định dạng mở rộng: trường xác định quyền ưu tiên có độ dài 32 bit, bao gồm có 29 bit ID, 1 bit SRR, 1 bit IDE và 1 bit RTR

Trong đó:

Bit RTR (Remote Transmission Request)

  • Là bit dùng để phân biệt khung là Data Frame hay Remote Frame.
  • Nếu là Data Frame, bit này luôn bằng 0 (Dominant Bit).
  • Nếu là Remote Frame, bit này luôn bằng 1 (Recessive Bit).
  • Vị trí bit này luôn nằm sau bit ID.

Trường hợp nếu Data Frame và Remote Frame có cùng ID được gửi đi đồng thời thì Data Frame sẽ được ưu tiên hơn.

Bit SRR (Substitute Remote Request)

  • Bit này chỉ có ở khung mở rộng.
  • Bit này có giá trị là 1 (Recessive Bit).
  • So với vị trí tương ứng trong khung chuẩn thì bit này trùng với vị trí của bit RTR nên còn được gọi là bit thay thế (Substitute).

Giả sử có hai Node cùng truyền, một Node truyền Data Frame chuẩn, một Node truyền Data Frame mở rộng có ID giống nhau thì Node truyền khung chuẩn sẽ thắng phân xử quyền ưu tiên vì đến vị trí sau ID, khung chuẩn là bit RTR = 0, còn khung mở rộng là bit SRR = 1. Như vậy, khung chuẩn chiếm ưu thế hơn so với khung mở rộng khi có ID như nhau.

Bit IDE (Identifier Extension)

  • Đây là bit phân biệt giữa loại khung chuẩn và khung mở rộng: IDE = 0 quy định khung chuẩn, IDE = 1 quy định khung mở rộng.
  • Bit này nằm ở trường xác định quyền ưu tiên với khung mở rộng và ở trường điều khiển với khung chuẩn.

3.Trường điều khiển (Control Field)

Khung chuẩn và khung mở rộng có định dạng khác nhau ở trường này:

  • Khung chuẩn gồm IDE, r0 và DLC (Data Length Code).
  • Khung mở rộng gồm r1, r0 và DLC.

Trong đó:

Bit IDE

  • Dùng phân biệt loại khung (đã được trình bày ở trên).

Bit r0, r1 (hai bit dự trữ)

Tuy hai bit này phải được truyền là Recessive Bit bởi bộ truyền nhưng bộ nhận không quan tâm đến giá trị 2 bit này. Bộ nhận có thể nhận được các tổ hợp 00, 01, 10 hoặc 11 của r1 và r0 nhưng không coi đó là lỗi mà bỏ qua và nhận thông điệp bình thường.

DLC (Data Length Code)

  • Có độ dài 4 bit quy định số byte của trường dữ liệu của Data Frame
  • Chỉ được mang giá trị từ 0 đến 8 tương ứng với trường dữ liệu có từ 0 đến 8 byte dữ liệu. Data Frame có thể không có byte dữ liệu nào khi DLC = 0.
  • Giá trị lớn hơn 8 không được phép sử dụng. Hình dưới mô tả các loại mã bit mà DLC có thể chứa để quy định số byte của trường dữ liệu.

4.Trường dữ liệu (Data Field)

Trường này có độ dài từ 0 đến 8 byte tùy vào giá trị của DLC ở trường điều khiển.

5.Trường kiểm tra (Cyclic Redundancy Check Field – CRC)

Trường kiểm tra hay trường CRC gồm 16 bit và được chia làm hai phần là:

  • CRC Sequence: gồm 15 bit CRC tuần tự
  • CRC Delimiter: là một Recessive Bit làm nhiệm vụ phân cách trường CRC với trường ACK
  • Mã kiểm tra CRC phù hợp nhất cho các khung mà chuỗi bit được kiểm tra có chiều dài dưới 127 bit, mã này thích hợp cho việc phát hiện các trường hợp sai nhóm (Bus Error). Ở đây, tổng bit từ trường bắt đầu (SOF) đến trường dữ liệu (Data Field) tối đa là 83 bit (khung định dạng chuẩn) và 103 bit (khung định dạng mở rộng).

=> Trường CRC bảo vệ thông tin trong Data Frame và Remote Frame bằng cách thêm các bit kiểm tra dự phòng ở đầu khung truyền. Ở đầu khung nhận, cũng sẽ tính toán CRC như bộ truyền khi đã nhận dữ liệu và so sánh kết quả đó với CRC Sequence mà nó đã nhận được, nếu khác nhau tức là đã có lỗi, nếu giống nhau tức là đã nhận đúng từ trường SOF đến trường dữ liệu.

6.Trường báo nhận (Acknowledge Field – ACK)

Trường báo nhận hay trường ACK có độ dài 2 bit và bao gồm hai phần là ACK Slot và ACK Delimiter.

  • ACK Slot: có độ dài 1 bit, một Node truyền dữ liệu sẽ thiết lập bit này là Recessive. Khi một hoặc nhiều Node nhận chính xác giá trị thông điệp (không có lỗi và đã so sánh CRC Sequence trùng khớp) thì nó sẽ báo lại cho bộ truyền bằng cách truyền ra một Dominant Bit ngay vị trí ACK Slot để ghi đè lên Recessive Bit của bộ truyền.
  • ACK Delimiter: có độ dài 1 bit, nó luôn là một Recessive Bit. Như vậy, ta thấy rằng ACK Slot luôn được đặt giữa hai Recessive Bit là CRC Delimiter và ACK Delimiter.

7.Trường kết thúc (End Of Frame Field – EOF)

Trường EOF là trường thông báo kết thúc một Data Frame hay Remote Frame. Trường này gồm 7 Recessive Bit.

Chip STM32F746 có hai khối giao tiếp CAN, chúng ta sẽ thực hiện truyền và nhận giữa CAN1 với CAN2, ngoài KIT STM32F746, chúng ta cần thêm phần cứng nữa là IC drive cho CAN bus, ở đây tôi sử dụng IC VP230 do thiết kế đơn giản và có sẵn module nhỏ gọn.

Module VP230

Sơ đồ mạch nguyên lý VP230

Sơ đồ kết nối module VP230 với chip STM32F746

Hướng dẫn cấu hình giao tiếp CAN trên STM32F746

Cấu hình trên STM32CubeMX

Bước 1: Mở STM32CubeMX và tạo dự án mới

Bước 2: Gõ tên tìm kiếm loại MCU cần lập trình và click đúp vào tên của nó

Bước 3: Cấu hình chế độ Debug cho chip là Serial Wire

Bước 4: Trong tab Clock Configuration, cấu hình tần số hoạt động cho chip là 216Mhz (max)

Bước 5: Cấu hình Activated hai ngoại vi CAN1,CAN2 và nhập Time Quanta như hình dưới.

Bước 6: Trong tab Project Manager, đặt tên cho Project, chọn đường dẫn lưu thư mục, chọn trình biên dịch là Keilc (MDK-ARM) và chọn phiên bản sử dụng

Bước 7: Trong mục Code Generator tích chọn Generate peripheral initialization.. Sau đó tiến hành GENERATE CODE.

Ở trong file main.c, chúng ta khai báo các biến truyền và nhận giữa các bộ CAN, và biến bộ lọc thông tin truyền nhận.

Data là mảng lưu dữ liệu truyền đi của bộ CAN2 sang CAN1, ở đây xhungs ta sẽ gửi chuỗi có nội dung “CAN Test”.

Trong vòng lặp While(1), CAN2 sẽ thực hiện truyền dữ liệu sang CAN1, CAN1 nhận được dữ liệu và gửi kết quả ra UART1.

Kết quả

Chúc các bạn thành công!

Biên dịch: Mai Văn Ba

Để cập nhật tin tức công nghệ mới nhất và các sản phẩm của công ty AIoT JSC, vui lòng truy cập link: http://aiots.vn hoặc linhkienaiot.com

0 0 Phiếu bầu
Article Rating
Subscribe
Notify of
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả các bình luận