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]
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 |