Chia sẻ CAN và Tiva C123

huunho

Thạc sỹ
#1
Chào các bạn!
Bài viết này mình cung cấp cho các bạn nguyên lý hoạt động của mạng CAN và modun CAN trên kít Tiva C123GXL hoặc kít selarit lanchpad là tên cũ của kít tiva c123gxl.
1. Nguyên lý mạng CAN:
CAN là viết tắt của Control Area Network ,tạm dịch là mạng điều khiển nội bộ, CAN được Robert Bosch GmbH phát triển từ năm 1983 để ứng dụng trên oto nhằm giảm số lượng dây dẫn, tăng tính an toàn, tin cậy của hệ thống điện ô tô, đến nay CAN đã có phiên bản CAN 2.0B được ứng dụng trên chíp ARM của TI và ST. Do khả năng truyền dữ liệu tin cậy, đảm bảo độ trễ của CAN nên nó được gọi là mạng điều khiển thời gian thực và được ứng dụng trên máy bay, tàu ngầm, tàu vũ trụ, hàng hải, y tế, công nghiệp.... CAN được đánh giá là modun truyền thông nối tiếp đắt đỏ và hiệu quả nhất của vi điều khiển.
Trên 1 mạng CAN có nhiều thiết bị giao tiếp với nhau qua chuẩn CAN 2.0B, mỗi thiết bị như vậy gọi là 1 nốt CAN, mỗi nốt CAN bao gồm 1 vi điều khiển có tích hợp modun CAN 2.0B và 1 IC giao tiếp CAN, ví dụ IC VP230 của TI, vi điều khiển đóng vai trò là bộ điều khiển CAN. Các nốt được kết nối với nhau bằng 2 dây dẫn xoắn lấy nhau, không cần chung GND ,không bọc chống nhiễu, hai dây dẫn này có tên là CAN H và CAN L, phân biệt và không dùng lẫn cho nhau được. Nốt đầu tiên có 1 trở 120 ôm nối CAN H với CAN L, Nốt cuối cùng cũng vậy. Như vậy cả mạng CAN chỉ cần 2 điện trở 120 ôm.Tốc độ truyền dữ liệu tối đa trên mạng CAN là 1Mb/s, độ dài tối đa của dây mạng CAN là khoảng 1000m.
Các truyền thông nối tiếp cổ điển như UART,SPI,I2C,I2S,USART,LIN,.... có nhược điểm rất lớn là số lượng thiết bị tham gia giao tiếp rất ít, dữ liệu dễ bị lỗi, phân biệt chíp chủ tớ,... Mạng CAN thì không có các nhược điểm này.
Mỗi nốt CAN được ví như 1 người tham gia 1 cuộc họp bàn tròn, người này bình đẳng so với tất cả những người khác, không có ai điều khiển cuộc họp,điều này nghĩa là không có nốt CAN là chủ và không có nốt nào là tớ, trong 1 thời điểm thì chỉ có 1 người được phát biểu, những người khác lắng nghe và nhận thông điệp từ người nói nếu cần, không cần thì có thể bỏ ngoài tai hết, như vậy trong cuộc họp này có những người chỉ nói, có người chỉ nghe, có người vừa nghe vừa nói. Ví dụ nốt 1 có nhiệm vụ đọc vận tốc bánh xe ô tô và gửi dữ liệu vận tốc đi cứ 5s 1 lần, nốt này rõ ràng là nót chỉ nói, nốt 2 có nhiệm vụ điều khiển các đèn pha, đèn hậu, xi nhan ô tô, như vậy nốt này chỉ lắng nghe lệnh điều khiển từ nốt khác, nốt 3 có nhiệm vụ nhận dữ liệu nhiệt độ động cơ, cảm biến phanh,bàn điều khiển... để điều khiển đèn, còi,... rõ ràng nốt này vừa nghe vừa nói.
Mạng CAN truyền dữ liệu theo kiểu phát tán (Broastcasting) tức là bất cứ nốt nào cần là có thể lấy dữ liệu phát tán này.Mỗi nốt CAN truyền dữ liệu đi theo định dạng 1 khung truyền , có 2 định dạng khung truyền (format frame) là khung truyền dữ liệu ( data frame) và khung truyền điều khiển ( remote frame).
Khung truyền dữ liệu thì có ID và data trong khi khung truyền remote thì chỉ có ID mà không có data. Mỗi not CAN có thể nhận dữ liệu từ nhiều nốt khác và có thể truyền dữ liệu đến nhiều nốt khác tùy ý đồ của người lập trình. Khi 1 nốt truyền đi 1 khung truyền người ta gọi khung truyền này là 1 thông điệp (meassage), thông điệp này có nội dung là 1 số định danh ( identifier) và dữ liệu , nốt khác nhận được sẽ phát ra tín hiệu xác nhận để nốt phát biết quá trình truyền thành công,khi đấy nốt nhận sẽ xử lý dữ liệu và quyết định trả lời hay không. Khi 1 nốt nhận được 1 thông điệp remote frame thì nó buộc phải trả lời lại nốt đã phát ra remote frame.
Số định danh ID có 2 loại là ID chuẩn ( standard có 11 bít) và ID mở rộng ( extended ID có 29 bít) là căn cứ để các nốt CAN biết được nó có cần thông điệp này hay không. Giả sử mỗi nốt chỉ nhận thông điệp từ 1 ID khác nhau thì trên mạng CAN có ID chuẩn tồn tại tối đa 2^11 = 2048 nốt CAN, trong khi đó ID mở rộng có tối đa 2^29 = 536870912 nốt CAN
Ví du: nốt 1 phát thông điệp có ID = 0x15, data = 0xFF8 và nhận thông điệp có ID = 0x10 và 0x11

2. Tiva C123GXL và CAN:
Đứng trên quan điểm người sử dụng hay kỹ sư lập trình nhúng thì hiểu như trên là đủ để dùng CAN cho các ứng dụng , vì rằng chúng ta chỉ sử dụng chứ không nghiên cứu để tạo ra phiên bản CAN 3.0. Vậy sử dụng CAN như thế nào?
Để học CAN thì cách đơn giản và tiết kiệm nhất là dùng 1 kít Tiva C123 hay kít selarit lanchpad, hoặc sinh động hơn ta có thể dùng 2 kít selarit để giao tiếp CAN với nhau, hoặc 1 kít tiva c123 giao tiếp với 1 kít STM32F4.
cụ thể mình dùng 1 kít tiva C 123 và kích hoạt chế độ loopback để kiểm tra giao tiếp CAN, chế độ này kít tiva c sẽ gửi thông điệp CAN cho chính nó.
==Kít tiva C123 hỗ trợ nạp code và debug, nó hơn kít discovery của ST ở chỗ: giá rẻ, có cổng COM ảo để dùng UART thay cho LCD hay led hiển thị quá trình giao tiếp CAN. Sau đây là nội dung code:

===chọn thạch anh ngoài 16mhz làm xung nhịp chính với số chia tần số là 1
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
===cấp xung clock cho port B:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
===cấp clock cho modun CAN0:
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
====cài dặt chân PB4 và PB5 là chân CAN0
GPIOPinConfigure(GPIO_PB4_CAN0RX);
GPIOPinConfigure(GPIO_PB5_CAN0TX);
GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);
=== reset cài đặt CAN0:
CANInit(CAN0_BASE);
====Chọn xung nhịp và tốc độ truyền: 500 khz
CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 500000);
=== đăng ký tên hàm ngắt cho CAN0 :
CANIntRegister(CAN0_BASE, CANIntHandler); // if using dynamic vectors
=== cho phép ngắt master , ngắt lỗi, ngắt trạng thái:
CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
=== bật bít TST trong thanh ghi CAN_O_CTL của CAN0
HWREG( CAN0_BASE + CAN_O_CTL) |= CAN_CTL_TEST;
===kích hoạt chế dộ loopback:
HWREG( CAN0_BASE + CAN_O_TST) |= CAN_TST_LBACK ;
===Cho phép ngắt CAN0
IntEnable(INT_CAN0);
===cho CAN0 chạy:
CANEnable(CAN0_BASE);
 
Sửa lần cuối:
#2
ủa, em tương ID là ID của tin nhắn chứ, ảnh hưởng gì đến số nốt đâu. gải định như có có 2 nốt muốn hiển thị dữ liệu của một nốt thì hai nốt đó phát cùng ID là bình thường mà bác
 

huunho

Thạc sỹ
#3
ủa, em tương ID là ID của tin nhắn chứ, ảnh hưởng gì đến số nốt đâu. gải định như có có 2 nốt muốn hiển thị dữ liệu của một nốt thì hai nốt đó phát cùng ID là bình thường mà bác
đọc kỹ đã
 

nguyensytuan

Học sinh phổ thông
#4
a có lập trình trên con TM4C123 không ạ?
e đang làm đề tài SIM900A với con đấy để nhắn tin với gọi ạ.
a có mẫu code nào cho e tham khảo với ạ. >:<
 

kuem0912

Kỹ sư
#5
Chào các bạn!
Bài viết này mình cung cấp cho các bạn nguyên lý hoạt động của mạng CAN và modun CAN trên kít Tiva C123GXL hoặc kít selarit lanchpad là tên cũ của kít tiva c123gxl.
1. Nguyên lý mạng CAN:
CAN là viết tắt của Control Area Network ,tạm dịch là mạng điều khiển nội bộ, CAN được Robert Bosch GmbH phát triển từ năm 1983 để ứng dụng trên oto nhằm giảm số lượng dây dẫn, tăng tính an toàn, tin cậy của hệ thống điện ô tô, đến nay CAN đã có phiên bản CAN 2.0B được ứng dụng trên chíp ARM của TI và ST. Do khả năng truyền dữ liệu tin cậy, đảm bảo độ trễ của CAN nên nó được gọi là mạng điều khiển thời gian thực và được ứng dụng trên máy bay, tàu ngầm, tàu vũ trụ, hàng hải, y tế, công nghiệp.... CAN được đánh giá là modun truyền thông nối tiếp đắt đỏ và hiệu quả nhất của vi điều khiển.
Trên 1 mạng CAN có nhiều thiết bị giao tiếp với nhau qua chuẩn CAN 2.0B, mỗi thiết bị như vậy gọi là 1 nốt CAN, mỗi nốt CAN bao gồm 1 vi điều khiển có tích hợp modun CAN 2.0B và 1 IC giao tiếp CAN, ví dụ IC VP230 của TI, vi điều khiển đóng vai trò là bộ điều khiển CAN. Các nốt được kết nối với nhau bằng 2 dây dẫn xoắn lấy nhau, không cần chung GND ,không bọc chống nhiễu, hai dây dẫn này có tên là CAN H và CAN L, phân biệt và không dùng lẫn cho nhau được. Nốt đầu tiên có 1 trở 120 ôm nối CAN H với CAN L, Nốt cuối cùng cũng vậy. Như vậy cả mạng CAN chỉ cần 2 điện trở 120 ôm.Tốc độ truyền dữ liệu tối đa trên mạng CAN là 1Mb/s, độ dài tối đa của dây mạng CAN là khoảng 1000m.
Các truyền thông nối tiếp cổ điển như UART,SPI,I2C,I2S,USART,LIN,.... có nhược điểm rất lớn là số lượng thiết bị tham gia giao tiếp rất ít, dữ liệu dễ bị lỗi, phân biệt chíp chủ tớ,... Mạng CAN thì không có các nhược điểm này.
Mỗi nốt CAN được ví như 1 người tham gia 1 cuộc họp bàn tròn, người này bình đẳng so với tất cả những người khác, không có ai điều khiển cuộc họp,điều này nghĩa là không có nốt CAN là chủ và không có nốt nào là tớ, trong 1 thời điểm thì chỉ có 1 người được phát biểu, những người khác lắng nghe và nhận thông điệp từ người nói nếu cần, không cần thì có thể bỏ ngoài tai hết, như vậy trong cuộc họp này có những người chỉ nói, có người chỉ nghe, có người vừa nghe vừa nói. Ví dụ nốt 1 có nhiệm vụ đọc vận tốc bánh xe ô tô và gửi dữ liệu vận tốc đi cứ 5s 1 lần, nốt này rõ ràng là nót chỉ nói, nốt 2 có nhiệm vụ điều khiển các đèn pha, đèn hậu, xi nhan ô tô, như vậy nốt này chỉ lắng nghe lệnh điều khiển từ nốt khác, nốt 3 có nhiệm vụ nhận dữ liệu nhiệt độ động cơ, cảm biến phanh,bàn điều khiển... để điều khiển đèn, còi,... rõ ràng nốt này vừa nghe vừa nói.
Mạng CAN truyền dữ liệu theo kiểu phát tán (Broastcasting) tức là bất cứ nốt nào cần là có thể lấy dữ liệu phát tán này.Mỗi nốt CAN truyền dữ liệu đi theo định dạng 1 khung truyền , có 2 định dạng khung truyền (format frame) là khung truyền dữ liệu ( data frame) và khung truyền điều khiển ( remote frame).
Khung truyền dữ liệu thì có ID và data trong khi khung truyền remote thì chỉ có ID mà không có data. Mỗi not CAN có thể nhận dữ liệu từ nhiều nốt khác và có thể truyền dữ liệu đến nhiều nốt khác tùy ý đồ của người lập trình. Khi 1 nốt truyền đi 1 khung truyền người ta gọi khung truyền này là 1 thông điệp (meassage), thông điệp này có nội dung là 1 số định danh ( identifier) và dữ liệu , nốt khác nhận được sẽ phát ra tín hiệu xác nhận để nốt phát biết quá trình truyền thành công,khi đấy nốt nhận sẽ xử lý dữ liệu và quyết định trả lời hay không. Khi 1 nốt nhận được 1 thông điệp remote frame thì nó buộc phải trả lời lại nốt đã phát ra remote frame.
Số định danh ID có 2 loại là ID chuẩn ( standard có 11 bít) và ID mở rộng ( extended ID có 29 bít) là căn cứ để các nốt CAN biết được nó có cần thông điệp này hay không. Giả sử mỗi nốt chỉ nhận thông điệp từ 1 ID khác nhau thì trên mạng CAN có ID chuẩn tồn tại tối đa 2^11 = 2048 nốt CAN, trong khi đó ID mở rộng có tối đa 2^29 = 536870912 nốt CAN
Ví du: nốt 1 phát thông điệp có ID = 0x15, data = 0xFF8 và nhận thông điệp có ID = 0x10 và 0x11

2. Tiva C123GXL và CAN:
Đứng trên quan điểm người sử dụng hay kỹ sư lập trình nhúng thì hiểu như trên là đủ để dùng CAN cho các ứng dụng , vì rằng chúng ta chỉ sử dụng chứ không nghiên cứu để tạo ra phiên bản CAN 3.0. Vậy sử dụng CAN như thế nào?
Để học CAN thì cách đơn giản và tiết kiệm nhất là dùng 1 kít Tiva C123 hay kít selarit lanchpad, hoặc sinh động hơn ta có thể dùng 2 kít selarit để giao tiếp CAN với nhau, hoặc 1 kít tiva c123 giao tiếp với 1 kít STM32F4.
cụ thể mình dùng 1 kít tiva C 123 và kích hoạt chế độ loopback để kiểm tra giao tiếp CAN, chế độ này kít tiva c sẽ gửi thông điệp CAN cho chính nó.
==Kít tiva C123 hỗ trợ nạp code và debug, nó hơn kít discovery của ST ở chỗ: giá rẻ, có cổng COM ảo để dùng UART thay cho LCD hay led hiển thị quá trình giao tiếp CAN. Sau đây là nội dung code:

===chọn thạch anh ngoài 16mhz làm xung nhịp chính với số chia tần số là 1
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
===cấp xung clock cho port B:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
===cấp clock cho modun CAN0:
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
====cài dặt chân PB4 và PB5 là chân CAN0
GPIOPinConfigure(GPIO_PB4_CAN0RX);
GPIOPinConfigure(GPIO_PB5_CAN0TX);
GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);
=== reset cài đặt CAN0:
CANInit(CAN0_BASE);
====Chọn xung nhịp và tốc độ truyền: 500 khz
CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 500000);
=== đăng ký tên hàm ngắt cho CAN0 :
CANIntRegister(CAN0_BASE, CANIntHandler); // if using dynamic vectors
=== cho phép ngắt master , ngắt lỗi, ngắt trạng thái:
CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
=== bật bít TST trong thanh ghi CAN_O_CTL của CAN0
HWREG( CAN0_BASE + CAN_O_CTL) |= CAN_CTL_TEST;
===kích hoạt chế dộ loopback:
HWREG( CAN0_BASE + CAN_O_TST) |= CAN_TST_LBACK ;
===Cho phép ngắt CAN0
IntEnable(INT_CAN0);
===cho CAN0 chạy:
CANEnable(CAN0_BASE);
anh ơi, anh xem giùm em đoạn code này với. Code giao tiếp I2c giữa tiva vưới DS1307 nhưng nó chạy không được. Anh xem và chỉ cho em với nha.
 

Đính kèm

huunho

Thạc sỹ
#6
anh ơi, anh xem giùm em đoạn code này với. Code giao tiếp I2c giữa tiva vưới DS1307 nhưng nó chạy không được. Anh xem và chỉ cho em với nha.
code này của em thấy lỗi phần khai báo thạch anh 25Mhz. thạch anh dùng trên kít là 16 cơ ma.
chủ để này nói về CAN, sao em ko tạo chủ đề mới?
Đây là code i2c của TI:
 

Đính kèm

Hoandt3

Học sinh phổ thông
#8
Chào các bạn!
Mình thấy bác huunho chia sẻ example ve CAN network, mình share cho các bạn tham khảo....
Hi Bạn, mình đang tìm hiểu về CAN, phiền bạn giải thích thêm về code bạn 1 chút đc k, như mục đích với các hàm trong chương trình, tks bạn
 

Quảng cáo Google