Jak odczytać coś z CAN’a?

Jednym z założeń projektu było zaimplementowanie obsługi obu magistrali CAN, jakie można spotkać w interesujących nas samochodach – silnika oraz komfortu. Część związaną z przygotowaniem prototypu sprzętowego interfejsu oraz uruchomienia kontrolera CAN w mikrokontrolerze STM32F407 mamy już dawno za sobą 🙂 Możemy nawet podejrzeć jakie dokładnie wiadomości (ang. datagrams) są wymieniane między poszczególnymi węzłami sieci.

Pewnie spora część z Was zastanawia się jak wydobyć coś sensownego z tego mrowia pozornie niezrozumiałych cyferek? Jak można zidentyfikować interesujące nas parametry czy pomiary?

Metod jest kilka:

  1. Część identyfikatorów została już wcześniej zdekodowana i można znaleźć informację na ich temat szperając w sieci,
  2. Obserwując zmieniającą się zawartość datagramów można korelować z różnymi akcjami: zwiększeniem obrotów, przyspieszeniem, naciśnięciem hamulca, włączeniem tempomatu, itd.
  3. Analiza długich logów, w poszukiwaniu wolno zmieniających się parametrów, np. temperatury zewnętrznej, poziomu paliwa, itp.

Oczywiście dwie pierwsze metody są najłatwiejsze, jednak aby wycisnąć maksimum dostępnych informacji musimy skorzystać ze wszystkich trzech sposobów.

Trochę praktyki

Spójrzmy na przykładowy zrzut okna wbudowanego analizatora magistrali CAN silnika. W ramach przypomnienia: każda wiadomość CAN jest opatrzona unikalnym identyfikatorem. Mówi nam on m.in. kto jest nadawcą i jakie dane zostały zawarte w datagramie. Maksymalnie wiadomość może nieść do 8 bajtów danych.

Załóżmy, że interesuje nas prędkość pojazdu. Kręcąc gałką potencjometru na naszym symulatorze, zmieniamy jej wartość i obserwujemy, które wartości na analizatorze zmieniają się wraz z nią. Najlepszym kandydatem okazuje się być wiadomość o ID 0x320, bajty 4. i 5.

Odczytana przez diagnostykę prędkość w tym momencie wynosiła 66km/h. Spójrzmy więc na zawartość obu “podejrzanych” bajtów. Możemy ją odczytać heksadecymalnie zarówno jako 0xCE33 oraz jako 0x33CE (little/big endian). W pierwszym przypadku wartość dziesiętna to 52787, w drugim – 13262.

Jak zgadnąć którą wybrać?

Bardzo łatwo! Niewielkie zwiększenie prędkości powinno spowodować zmianę tylko jednego, najmniej znaczącego bajtu, który w zapisie szesnastkowym znajduje się zawsze na końcu. W analizowanym przykładzie jest to bajt 0xCE, stąd uznajemy reprezentację 0x33CE(hex) lub 13262(dec) jako poprawną. Dla oblatanych w temacie – little endian 🙂

Ale jak z 13262 przejść do 66? Trochę czarno to widzę…

Rzecz ma się prościej, niż się spodziewamy – początek 132xx to dokładnie… 66 x 2. Spróbujmy więc podzielić: 13232 / 2 = 6631. Jak widać otrzymujemy ustawioną prędkość, pomnożoną przez 100 😀

Ślepy traf?

Ok, no to popatrzmy na kolejny przykład. Odczyt z diagnostyki pokazuje 36km/h.

Wartość odczytana z magistrali CAN to: 0x1CC2. Czyli dziesiętnie: 7362 / 2 = 3681. I znów trafiamy idealnie 🙂

Obserwując w ten sposób zawartość wiadomości CAN można wyczytać z nich na prawdę wiele ciekawych informacji 🙂 Nie tylko wartości pomiarów, ale również kody błędów, status poszczególnych urządzeń w samochodzie, itd. A czy właśnie nie to jest dla nas najbardziej interesujące?

Posted in Sto dni w kolorze.