Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
2,15 MB
Nội dung
CONTROLLER AREA NETWORK (CAN) Dr Tuong Quan Vo Mục lục Giới thiệu CANCAN protocol Lớp vật lý Giải tranh chấp bus CAN frame Nominal Bit Time Sự đồng xung clock Truyền nhận message Xử lý lỗi 10 CAN MODULE PIC 11 Giới thiệu CAN trình dịch CCS Giới thiệu CAN giao thức giao tiếp nối tiếp hỗ trợ mạnh cho hệ thống điều khiển thời gian thực với độ ổn định truyền tốc độ cao , bảo mật chống nhiễu tốt CAN phát triển nhà cung cấp phụ tùng xe ôtô Đức Robert Bosch vào năm 80 giảm thiểu việc dây chằng chịt, đơn giản hóa hệ thống sử dụng nhiều ngành công nghiệp khác ngồi xe máy nơng nghiệp, tàu ngầm, dụng cụ y khoa, máy dệt, v.v… CAN chuẩn hóa thành tiêu chuẩn ISO11898 Tính ổn định an toàn chế phát xử lý lỗi cực mạnh lỗi CAN messages phát 1000 năm trung bình có frame lỗi mà không phát CAN chiếm lĩnh ngành cơng nghiệp Ơ tơ CAN high speed dùng điều khiển động thắng CAN lowspeed dùng điều khiển thiết bị khác kiếng hậu, light… CAN protocol • cặp dây truyền tín hiệu vi sai •Đường dây bus kết thúc điện trở 120 ohm đầu CAN tạo thành nhóm nodes Truyền, nhận gói liệu - message Mỗi loại message gán ID tùy theo mức độ ưu tiên message Mạng CAN : message base system, có tính mở thêm, bớt node khơng làm ảnh hưởng đến hệ thống, dễ dàng thay đổi mà không cần phải thiết kế lại hệ thống Mỗi node nhận nhiều loại message khác nhau, ngược lại message nhận nhiều node ID message phụ thuộc vào mức độ ưu tiên message Điều cho phép phân tích response time message Quan trọng việc thiết kế hệ thống nhúng thời gian thực Tiêu chuẩn ISO11898 Các lớp layer giao tiếp 10.3 Truyền message CAN buffer truyền –TXB0, TXB1, TXB2 ghi điều khiển: TXBnCON ghi ID: TXBnSIDL, TXBnSIDH, TXBnEIDL, TXBnEIDH ghi đếm độ dài liệu: TXBnDLC ghi liệu: TXBnDm Thiết lập truyền: Bit TXREQ phải xóa SIDH,SIDL, DLC liệu nạp Sử dụng frame mở rộng: EIDH:EIDL phải ghi bit EXIDE set set bit TXREQ cho buffer truyền Sự truyền bắt đầu thiết bị kiểm tra bus rảnh Khi truyền thành công, bit TXREQ xóa cờ TXBnIF set ngắt xảy bit cho phép ngắt TXBnIE set Nếu truyền không thành công, bit TXREQ set Nếu có lỗi, TXERR IRXIF set ngắt xảy Nếu message ưu tiên bus, bit TXLARB set Ưu tiên truyền: không liên quan tới ưu tiên message bus theo giao thức CAN Buffer có mức ưu tiên cao truyền trước Nếu buffer có mức ưu tiên, buffer có số kí hiệu cao truyền trước Có mức ưu tiên: bit TXP ‘11’, buffer có mức ưu tiên cao nhất; bit TXP ‘00’, buffer có mức ưu tiên thấp 10.4 Nhận message: Có buffer nhận: RXB0 RXB1 Buffer Message Assembly Buffer (MAB) Mỗi buffer chiếm 14 byte SRAM: ghi điều khiển (RXBnCON) ghi ID (RXBnSIDL, RXBnSIDH, RXBnEIDL, RXBnEIDH) ghi đếm độ dài liệu (RXBnDLC) ghi liệu (RXBnDm) Nhận message: Một message chuyển tới buffer nhận bit RXFUL set Bit phải xóa MCU xử lý xong message buffer phép message nhận Nếu ngắt nhận cho phép, ngắt xảy báo hiệu message nhận thành công Xác định lọc cho phép nhận cách kiểm tra filter hit bits FILHIT ghi RXBnCON Message vừa nhận messafe chuẩn bit EXID ghi RXBnSIDL xóa Ngược lại, bit EXID set báo hiệu message mở rộng Ưu tiên nhận RXB0 chứa message,message khác nhận đưa vào RXB1 RXB0 buffer có mức ưu tiên cao RXB1 buffer có mức ưu tiên thấp RXB0CON thiết lập RXB0 chứa message message khác nhận đưa vào RXB1 Có mặt nạ lọc cho bufer Message Acceptance Filtes and Masks Vùng ID so sánh với giá trị lọc Nếu đúng, message chuyển vào bufer tương ứng Filter mask sử dụng để xác định xem bit vùng ID so sánh với lọc Baud Rate Setting: FOSC tần số xung clock TOSC chu kì dao động BRP số nguyên (từ đến 63) theo giá trị bit BRGCON1 CAN trình dịch CCS void can_init(void); void can_set_baud(void); void can_set_mode(CAN_OP_MODE mode); void can_set_id(int* addr, int32 id, int1 ext); int32 can_get_id(int * addr, int1 ext); int1 can_getd(int32 & id, int * data, int & len, struct rx_stat & stat); int can_putd(int32 id, int * data, int len, int priority, int1 ext, int1 rtr); can_kbhit() can_tbe() can_abort() Một ví dụ đơn giản: #include #fuses HS,NOPROTECT,NOLVP,NOWDT #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) #include int16 ms; #int_timer2 void isr_timer2(void) { ms++; //keep a running timer that increments every milli-second } void main() { struct rx_stat rxstat; int32 rx_id; int in_data[8]; int rx_len; //send a data (tx_rtr=0) for bytes of data (tx_len=8) from id 125 int out_data[8]; int32 tx_id=125; int1 tx_rtr=0; int1 tx_ext=0; int tx_len=8; int tx_pri=3; int i; for (i=0;i