Mikrokontrolery Infineon XMC4500 w praktyce, część 7. Obsługa magistrali CAN

W artykule przedstawiono opis interfejsu komunikacyjnego CAN (Controller Area Network) oraz pokazano jak za pomocą mikrokontrolera z rodziny XMC4000 realizować komunikację CAN.

Historię powstania, zasadę działania i teorię CAN…

…przedstawiamy w osobnym artykule.

 

CAN w mikrokontrolerach XMC4000

Interfejs CAN w mikrokontrolerze z rodziny XMC4000 realizowany jest przez blok peryferyjny o nazwie MultiCAN. Jest to samodzielny kontroler CAN, który jest w pełni zgodny ze specyfikacją CAN, umożliwiając realizację transmisji w obu standardach CAN (CAN 2.0 A z 11-bitowym identyfikatorem wiadomości i 2.0 B z 29-bitowym identyfikatorem wiadomości) z prędkością transmisji do 1 Mb/s włącznie. Zgodnie ze schematem blokowym przedstawionym na rysunku 1, MultiCAN składa się z następujących bloków: CAN Node, Message Controller, Interrupt Control Logic, Message RAM, List Control Logic oraz Address Decoder.

 

Rys. 1. Schemat blokowy modułu MultiCAN w mikrokontrolerze XMC4000 [5]

Rys. 1. Schemat blokowy modułu MultiCAN w mikrokontrolerze XMC4000 [5]

 

CAN Node to blok będący węzłem CAN. W kontrolerze MultiCAN może być do ośmiu jednostek CAN Node, jednakże firma Infineon zdecydowała się użyć w mikrokontrolerach z rodziny XMC4000 implementacji MultiCAN o konfiguracji z jednym, dwoma lub trzema (w zależności od modelu układu) blokami CAN Node. Jednostki CAN Node pracują niezależnie od siebie. Użytkownik może przykładowo każdy blok CAN Node podłączyć do innej magistrali CAN i ustawić inne parametry pracy np. prędkość transmisji. Bloki CAN Nodes odpowiadają za fizyczną realizację transmisji CAN, a więc wysyłanie i odbieranie wiadomości.

Message RAM to blok będący przestrzenią pamięci RAM, w której znajdują się tak zwane obiekty wiadomości (Message objects). Może ich być maksymalnie 64 i służą one do przechowywania wiadomości CAN. Każdy z obiektów wiadomości jest indywidualnie konfigurowany. Przykładowe parametry to między innymi: typ obiektu wiadomości (obiekt może służyć do przechowywania wiadomości wysyłanej na magistralę, bądź też odebranej z magistrali), przerwania i filtry (np. odbiór wiadomości o określonych identyfikatorach). Do jednego węzła CAN Node może być przyporządkowanych wiele obiektów wiadomości.

Obiekty wiadomości zarządzane są przez sterownik Message Controller. W procesie wysyłania Message Controller decyduje która wiadomość powinna zostać wysłana w pierwszej kolejności, a następnie przekazuje ją z obiektu wiadomości do węzła CAN. W procesie odbierania Message Controller decyduje do którego obiektu wiadomości ma trafić odebrana wiadomość, a następnie przekazuje ją z węzła CAN do obiektu wiadomości. Dodatkowo Message Controller pozwala tworzyć bufory FIFO (First In First Out), dzięki czemu wiadomości przekazywane są między węzłami w sposób automatyczny.

Każdy z węzłów CAN Node ma przyporządkowaną pewną grupę obiektów wiadomości Message objects. Są one zorganizowane w listę. Węzeł CAN Node może wysyłać wiadomości tylko z obiektów wiadomości ze swojej listy. Analogicznie węzeł CAN Node może odbierać wiadomości i przechowywać je tylko w obiektach wiadomości ze swojej listy. Za zarządzenie listami (dodawanie obiektów wiadomości do listy, usuwanie obiektów wiadomości z listy) odpowiada blok List Control Logic.

Rejestry sterujące peryferium MultiCAN podzielone zostały na trzy grupy: rejestry globalne, rejestry węzłów CAN oraz rejestry obiektów wiadomości. Oznaczenia rejestrów wraz z pełną ich nazwą przedstawiono w tabeli 1.

 

Tab. 1. Oznaczenia oraz nazwy rejestrów sterujących modułem MultiCAN [5]

Grupa rejestrów Rejestr Pełna nazwa rejestru
Rejestry globalne LISTi List Register i
MSPNDk Message Pending Register k
MSIDk Message Index Register k
MSIMASK Message Index Mask Register
PANCTR Panel Control Register
MCR Module Control Register
MITR Module Interrupt Trigger Register
Rejestry węzłów CAN NCRx Node x Control Register
NSRx Node x Status Register
NIPRx Node x Interrupt Pointer Reg.
NPCRx Node x Port Control Register
NBTRx Node x Bit Timing Register
NECNTx Node x Error Counter Register
NFCRx Node x Frame Counter Register
Rejestry obiektów wiadomości MOFCRn Message Object n Function Control Register
MOFGPRn Message Object n FIFO/Gateway Pointer Register
MOIPRn Message Object n Interrupt Pointer Register
MOAMRn Message Object n Acceptance Mask Register
MODATALn Message Object n Data Register Low
MODATAHn Message Object n Data Register High
MOARn Message Object n Arbitration Register
MOCTRn Message Object n Control Register
MOSTATn Message Object n Status Register

 

DAVE Apps przewidziane do obsługi interfejsu MultiCAN

Do sterowania modułem MultiCAN firma Infineon opracowała trzy komponenty oprogramowania DAVE App: CANGLOBAL, CAN001 i CAN002. CANGLOBAL służy do konfiguracji częstotliwości sygnału zegarowego, który taktować będzie moduł MultiCAN. CAN001 oraz CAN002 są komponentami oprogramowania udostępniającymi API do obsługi interfejsu CAN. CAN001 przeznaczony jest dla aplikacji nie wykorzystującej systemu operacyjnego, natomiast CAN002 dedykowany jest dla aplikacji z systemem operacyjnym. W tabeli 2 przedstawiono krótki opis funkcji i definicji tworzących API komponentów CANGLOBAL, CAN001 i CAN002. Kompletną dokumentację można znaleźć w systemie pomocy pakietu DAVE 3.

Tab. 2. Opis API komponentów DAVE App o nazwie CANGLOBAL, CAN001 i CAN002 [6]

Nazwa komponentu DAVE App

API (funkcje i definicje) komponentów DAVE Apps

Opis

CANGLOBAL CANGLOBAL_Init () Inicjalizacja kontrolera MultiCAN
CAN001 CAN001_GetMOFlagStatus() Odczytanie statusu wybranego obiektu wiadomości
CAN001_GetNodeFlagStatus() Odczytanie statusu wybranego węzła CAN
CAN001_GetMOPndRegisterBitStatus() Odczytanie bitu wskazującego na odebranie wiadomości w wybranym obiekcie wiadomości
CAN001_ClearMOFlagStatus() Wyzerowanie bitów statusowych w rejestrze MOSTATx obiektu wiadomości
CAN001_ClearNodeFlagStatus() Wyzerowanie bitów statusowych w rejestrze NSRx wybranego węzła CAN
CAN001_ClearMOPndRegisterBit() Wyzerowanie bitu wskazującego na odebranie wiadomości w wybranym obiekcie wiadomości
EnableNodeInterrupt() Włączenie wybranego przerwania dla wybranego węzła CAN
DisableNodeInterrupt() Wyłączenie wybranego przerwania dla wybranego węzła CAN
EnableMOInterrupt() Włączenie wybranego przerwania dla wybranego obiektu wiadomości
DisableMOInterrupt() Wyłączenie wybranego przerwania dla wybranego obiektu wiadomości
CAN001/ CAN002 CAN001_Init()

CAN002_Init()

Inicjalizacja węzłów CAN i obiektów wiadomości
CAN001_NodeDeInit()

CAN002_NodeDeInit()

Inicjalizacja wybranego węzła CAN z domyślnymi parametrami działania, usunięcie obiektów wiadomości z listy
CAN001_ConfigMsgObj()

CAN002_ConfigMsgObj()

Inicjalizacja obiektu wiadomości do pracy jako obiekt wysyłający wiadomości lub odbierający wiadomości oraz ustawienie parametrów powiązanych
CAN001_SendDataFrame()

CAN002_SendDataFrame()

Wysłanie ramki danych z wybranego obiektu wiadomości
CAN001_SendRemoteFrame()

CAN002_SendRemoteFrame()

Wysłanie ramki zdalnego wywołania z wybranego obiektu wiadomości
CAN001_ReadMsgObj()

CAN002_ReadMsgObj()

Odczytanie zawartości wybranego obiektu wiadomości
CAN001_UpdateMODataRegisters()

CAN002_UpdateMODataRegisters()

Nadpisanie pola danych obiektu wiadomości
CAN002 CAN002_SemaphoreInit() Inicjalizacja semafora w celu obsługi obiektów wiadomości
CAN002_CancelTransmitReq() Anulowanie wysłania ramki CAN z obiektu wiadomości
CAN002_ReadMOwithTimeout() Odczytanie zawartości wybranego obiektu wiadomości z oczekiwaniem na odebranie wiadomości przez określony czas
GET_NODE_ERROR_STATUS() Odczytanie statusu błędu węzła
CLEAR_NODE_ERROR_STATUS() Wyzerowanie statusu błędu węzła

 

Do pobrania

O autorze