Rozdział Biblioteka funkcji komunikacyjnych CAN Paweł MOROZ Politechnika Śląska, Instytut Informatyki pawel.moroz@polsl.pl Streszczenie W rozdziale zaprezentowano bibliotekę funkcji komunikacyjnych CAN, ułatwiającą tworzenie aplikacji. Opisano jej organizację, możliwości modyfikacji i przykłady wykorzystania. Pokrótce przedstawiono zasadę działania samej sieci i układu komunikacyjnego, dla którego ta biblioteka została napisana. 1. Wprowadzenie Controler Area Network (CAN) jest siecią przemysłową o transmisji szeregowej, asynchronicznej, bez węzła sterującego. Można się z nią zetknąć w instalacjach przemysłowych, budynkach użyteczności publicznej, samochodach oraz aparaturze medycznej. Podstawowymi jej zaletami są: wysoka prędkość transmisji, niezawodność, odporność na zakłócenia, a także możliwość tworzenia własnych protokołów wymiany informacji, których częścią będą warstwy protokołu CAN. 2. Protokół CAN Dokument ISO-11898-1, w którym opisano protokół CAN, obejmuje w głównej mierze warstwę łącza danych. Występuje w niej jednak również opis warstwy fizycznej, w tym: fizyczny format sygnałów przesyłanych magistralą, właściwości elektryczne oraz sposób synchronizacji zegarów taktujących nadajnika i odbiorników, niezbędny z powodu braku linii zegarowej. Wspomniany dokument nie zawiera informacji na temat medium transmisyjnego. Rozszerzenia standardu ISO 11898-1, uwzględniające również medium transmisyjne i typy złączy, zostały przygotowane i opublikowane przez CiA [1]. Standard ISO 11898-2 opisuje warstwę fizyczną sieci wykorzystywaną między innymi w pojazdach samochodowych, a 11898-3 w systemach automatyki przemysłowej. Transmisja w łączu odbywa się zależnie od standardu. Stosowana jest transmisja różnicowa, jednak możliwa jest również
2 P. Moroz transmisja po jednej linii danych. Wraz z wyborem rodzaju magistrali narzucone zostają takie parametry, jak jej długość i maksymalna prędkość transmisji. SOF Identifier RTR Control Data CRC ACK EOF 1 bit 11 bit / 29 bit 1 bit 6 bit 0 8 bajtów 16 bit 2 bit 7 bit Rysunek 1 Budowa ramki Rysunek 1 przedstawia budowę ramki, w skład której wchodzą następujące elementy: SOF (ang. Start Of Frame) sygnalizacja rozpoczęcia transmisji Identyfikator niezależny od nadajnika, w pierwszej wersji standardu identyfikator miał długość 11 bitów. Rozwinięcie standardu wprowadziło możliwość wykorzystania identyfikatora 11 (2.0A) lub 29 bitowego (2.0B). RTR (ang. Remote Transmition Request) flaga określająca rodzaj ramki (ramka zdalnego żądania lub ramka danych) Control informacja o ilości bajtów danych Data pole danych CRC (ang. Cyclic Redundancy Checksum) suma kontrolna ACK (ang. Acknowledgment) obszar, w którym sygnalizowane jest odebranie ramki. EOF (ang. End Of Frame) znacznik końca ramki Ze względu na równoprawny dostęp wszystkich węzłów do magistrali podczas transmisji mogą występować kolizje. Dla ich rozstrzygania został zaprojektowany algorytm CSMA/CD/CR (ang. Carrier Sense Multiple Access/Collision Detection/Colision Resolution). Jego zaletą jest to, że wiadomość nadawana przez zwycięzcę algorytmu nie zostaje zniszczona. Wykorzystuje się tu fizyczną cechę łącza tzw. sumę logiczną nadawanych sygnałów. Identyfikator określa priorytet wiadomości, który jest tym wyższy, im niższa jest wartość identyfikatora. Arbitraż w łączu trwa od bitu SOF do bitu RTR. Każdy węzeł nadający wiadomość prowadzi jednocześnie nasłuch i porównuje, czy wartość nadawanego bitu odpowiada stanowi łącza. W razie różnicy pomiędzy bitem nadawanym a odczytanym, węzeł wycofuje się z transmisji. Procedura ta trwa do momentu wyłonienia tylko jednego nadawcy, którym będzie węzeł wysyłający ramkę o najniższym identyfikatorze. 3. Wymagania sprzętowe Biblioteka została napisana dla układu CAN typu MCP2515, który pozwala na wykorzystanie zarówno ramek standardu 2.0 A jak i 2.0 B. Układ ten realizuje sprzętowo niektóre elementy protokołu: obliczanie sumy kontrolnej, weryfikację poprawności ramek, algorytm rozwiązywania kolizji, synchronizację transmisji itd. Użycie zewnętrznego modułu, w przeciwieństwie do procesorów z wbudowanym układem obsługi sieci CAN, daje możliwości wykorzystania zarówno tworzonego programu jak i biblioteki w węzłach o zróżnicowanych zastosowaniach.
Biblioteka funkcji komunikacyjnych CAN... 3 Procesor komunikuje się z układem MCP2515 poprzez magistralę szeregową SPI, złożoną z 4 linii: zegarowej (CLK), danych wysyłanych z procesora (OUTPUT), danych odbieranych z układu MCP2515 (INPUT), wyboru układu (CS). Prędkość transmisji może dochodzić do 10Mbit/s co w porównaniu z maksymalną prędkością magistrali CAN, która wynosi 1Mbit/s, zapewnia wystarczającą przepustowość. Dodatkowo układ MCP2515 umożliwia pracę z wykorzystaniem przerwań[3]. Do nadawania i odbierania ramek wyznaczone są odpowiednio 3 i 2 zestawy buforów oraz rejestrów. Dodatkowo do buforów odbiorczych dołączono rejestry filtrujące, w których definiowane są identyfikatory tych ramek, które mają być w tych buforach zapamiętane. [4] Procesor przy użyciu odpowiednich rozkazów może wykonać operacje na pamięci wewnętrznej układu MCP2515. Zbiór operacji na pamięci nie ogranicza się tylko do prostych operacji odczytu i zapisu wskazanej komórki pamięci, ale umożliwia także zapis lub odczyt całego bufora nadawczego lub jego obszaru danych, modyfikację poszczególnych bitów w komórce. Dostępne są również rozkazy inicjujące wykonanie określonej operacji np. wysyłania ramki ze wskazanego bufora. W każdym systemie CAN musi być układ zamieniający cyfrową postać ramki na odpowiedni przebieg w liniach transmisyjnych. Przykładem takiego układu jest MCP2551, mogący pracować z prędkością do 1 Mbit/s. Jest w pełni kompatybilny z ISO-11898-2. Ze względów elektrycznych występuje ograniczenie na ilość węzłów podłączonych do sieci w tym przypadku może maksymalnie występować do 112 urządzeń. 4. Biblioteka funkcji komunikacyjnych Podczas pisania programów dla mikroprocesorów, nie mamy nigdy do czynienia z tym samym środowiskiem sprzętowym (wykorzystywane są różnego rodzaju procesory oraz układy wejścia-wyjścia). Dlatego, aby biblioteka była użyteczna i funkcjonalna należy ją tak przygotować, aby dostosowanie jej do potrzeb konkretnego programu było proste i łatwe. Zostało to uzyskane poprzez rozbicie samej biblioteki na moduły kolejnych warstw, umieszczając każdą z warstw w osobnym pliku, co przedstawia rysunek 2. Każda warstwa grupuje w sobie zestaw funkcji realizujących określoną funkcjonalność. Np. moduł SPI zawiera funkcje obsługi interfejsu komunikacyjnego między procesorem a kontrolerem CAN. Dostępne są procesory ze sprzętowym sterownikiem SPI m.in. ATMega128. Jeżeli procesor takiego układu nie posiada, możliwa jest zamiana modułu wykorzystującego sprzętowe SPI na moduł, który funkcje interfejsu realizuje w sposób programowy.
4 P. Moroz Rysunek 2 - Schemat biblioteki Przykładem wykorzystania rozdzielenia biblioteki na 3 oddzielne części jest interfejs komunikacyjny pomiędzy procesorem a kontrolerem CAN. Dostępne są procesory z wbudowanym układem obsługi SPI, między innymi ATMega128, w których wykorzystanie układu programowego byłoby niepotrzebne. Gdy procesor nie obsługuje sprzętowo komunikacji po magistrali SPI, możliwe jest podmienienie modułu wykorzystującego sprzętowe SPI na jego programową realizację. Dzięki temu w prosty sposób można przystosować bibliotekę dla innego procesora. Pewne funkcjonalności są zdublowane w bibliotece wykonane jako funkcje i makra. Poprzez taką nadmiarowość użytkownik uzyskuje możliwość optymalizacji programu do swoich potrzeb: wykorzystanie funkcji zmniejsza zajętość pamięci; wykorzystanie makra przyspiesza działanie kodu. Kolejna warstwa zawiera funkcje obsługi układu MCP2515 realizowane bezpośrednio przez kontroler. Umożliwiają one: zapis/odczyt zarówno pojedynczych bajtów jak i bloków danych, modyfikację bitów w rejestrach modułu CAN, ustawienie wartości początkowych modułu CAN, zainicjowanie transmisji zawartości określonego bufora danych, odczyt stanów wybranych bitów rejestrów. Funkcje te są podstawą do tworzenia bardziej złożonych funkcji, umieszczonych w kolejnej warstwie Moduł ExtendedCAN. Funkcje najwyższej (Rysunek 2) warstwy korzystają z trzech zdefiniowanych struktur. Pierwszą z nich jest struktura zawierająca wszystkie informacje o nadawanej lub odbieranej ramce: 4 bajty identyfikatora ramki, 8 bajtów danych zapisanych w tablicy, liczba bajtów danych (odpowiednik pola DLC), znacznik określający typ ramki (0/1 2.0A/2.0B), znacznik określający rodzaj ramki (0/1 - danych/zdalna). Oprócz informacji niezbędnych do wypełnienia ramki dodano pole określające jej priorytet, gdyż w module jest możliwość zdefiniowania kolejności nadawania ramek poprzez dwubitową wartość. Specjalnie przygotowane funkcje dokonują
Biblioteka funkcji komunikacyjnych CAN... 5 przekształcenia danych do tablicy bajtów zdefiniowanej w bibliotece, skąd bezpośrednio można je zapisać do pamięci sterownika CAN. Druga ze struktur przechowuje konfiguracje, których modyfikacja może następować tylko w trybie konfiguracyjnym. W jej skład wchodzą: rejestry ustawiające prędkość transmisji, filtry i maski decydujące o przyjęciu wiadomości, konfiguracja niektórych wyprowadzeń z układu MCP2515. Celem stworzenia tej struktury była chęć przyspieszenia konfiguracji węzła, a zarazem zgrupowanie wszystkich parametrów konfiguracyjnych. Skrócenie czasu konfiguracji węzła uzyskuje się przy założeniu, że modyfikowane są wszystkie rejestry konfiguracyjne, bądź też znacząca ich większość. Uzyskuje się to poprzez redukcję przełączeń układu CAN pomiędzy trybami pracy a trybem konfiguracyjnym. Ostatnia ze struktur służy do czytelnego określenia identyfikatorów, z którymi mają być porównywane identyfikatory odbieranych wiadomości. Na ich podstawie MCP2515 podejmuje decyzje o przyjęciu lub zignorowaniu ramki. Zamianą zawartości struktury na reprezentację wykorzystywaną przez układ zajmują się odpowiednie funkcje. Większość funkcji dokonuje przekształceń danych wejściowych, aby następnie umieścić je bezpośrednio w pamięci układu MCP2515. Wyjątkiem jest funkcja wyznaczająca prędkość transmisji, którą określa się za pomocą tzw. kwantów. Kwantem nazywamy jednostkę czasu wykorzystywaną przez nadajnik sieci CAN, wyznaczaną za pomocą podzielnika (ang. Prescalera) zegara taktującego układ transmisji. Poza elastycznością, biblioteka miała ułatwiać tworzenie czytelnego i samokomentującego się kodu. Pomysłem na uzyskanie takiego efektu było stworzenie nazw funkcji długich, ale za to jednoznacznie wyjaśniających ich zadania danej funkcji (np. void CANTransmit0IntEnableNow(BYTE OnOff) natychmiastowe włączenie przerwania sygnalizującego nadanie wiadomości z bufora 0). Z tego samego powodu w bibliotece umieszczono plik nagłówkowy, w którym zdefiniowano stałe dla adresów poszczególnych rejestrów, numery końcówek, a także maski dla poszczególnych bitów lub ich grup. Nazwy stałych i zmiennych w bibliotece tworzone były wg następujących reguł: _r<nazwa> - adres rejestru o nazwie wykorzystywanej w dokumentacji, _p<nazwa> - pozycja bitu wymienionego w polu nazwa, _n<nazwa> - numer bitu wymienionego w polu nazwa, _m<nazwa grupy> - maska dla grupy bitów, _i<nazwa> - nazwa kodu instrukcji wykonywanego w sterowniku CAN, b<nazwa> - zmienna o rozmiarze 1 bajtu, t<nazwa> - zmienna tymczasowa.
6 P. Moroz 5. Przykłady implementacji Przykład 1 Niżej podano przykład użycia funkcji z modułu BasicCAN. Funkcja ta wypełnia cały bufor nadawczy, odpowiednio przygotowaną ramką (kolejnymi bajtami umieszczonymi w tabeli) BYTE CAN_WriteTx(_iTXB0SIDH, Frame, 12) Ten sam efekt można uzyskać za pomocą pętli. Jednak kod w tej postaci jest znacznie mniej zrozumiały. BYTE i; //rozpoczęcie transmisji przez ustawienie linii CS SPI w stan niski SPI_CS_On; //nadanie SPI_MasterTransiver(_iWRITETX btxcode); for (i = 0;i < 12; i++) SPI_MasterTransiver(pFrame[i]); SPI_CS_Off; return 0; } Czytelność obu rozwiązań poprawia wykorzystanie stałych. Zamiast trudnych do zapamiętania i wykorzystywania adresów rejestrów, pozycji poszczególnych bitów, kodów instrukcji, itd. lepiej wykorzystywać czytelne i łatwe do zapamiętania nazwy, występujące także w dokumentacji (tj. _iwritetx instrukcja zapisania bloku danych do bufora reprezentowana przez bajt 0x40). Przykład 2 wykorzystanie funkcji z modułu ExtendedCAN. CANSendMsgFull(1, Message, Yes) Powyższa funkcja wysyła do MCP2515 wiadomość i natychmiast po zakończeniu zapisywania rozpoczyna transmisję. Aby samodzielnie załadować ramkę należy wykonać następujące operacje SPI_CS_On //rozpoczęcie transmisji po SPI; Wysłanie_Bajtu (0x41); Wysłanie_Bajtu (Bajt_Ramki); Wysłanie_Bajtu (0x08 rozkaz danaj ramkę); SPI_CS_Off //zakończenie transmisji po SPI; 6. Podsumowanie W rozdziale przedstawiona została opracowana biblioteka komunikacyjna sieci CAN. Celem było uzyskanie zbioru funkcji umożliwiających przyspieszenie tworzenia aplikacji z wykorzystaniem sieci CAN, uproszczenie korzystania z protokołu i poprawienie czytelności kodu. W rozdziale zwrócono uwagę na modułową strukturę biblioteki zapewniającą łatwiejsze modyfikowanie wybranych elementów. LITERATURA 1. Kołodziejski J., Kalita W., P. Rz., Kamuda K.: Magistrala CAN. Struktura, właściwości i zastosowania Elektronika 2000
Biblioteka funkcji komunikacyjnych CAN... 7 2. Etschberger K.: Controler Area Network - Basics, Protocols, Chips and Applications. IXXAT Press, Weingarten/Niemcy 2001. 3. Microchip: DataSheet Stand-Alone CAN Controller With SPI Interface MCP2515 www.microchip.com 4. Microchip: DataSheet MCP2551 High-Speed CAN Transciever, www.microchip.com.