Arbitraż CAN odbywa się za pomocą identyfikatorów, a każdy węzeł na magistrali może przesyłać z dowolnym identyfikatorem (najlepiej nie powinien, ale może to zrobić nieprzyjemny węzeł).
Co jeśli dwa różne węzły podłączone do tej samej magistrali CAN przesyłają wiadomości o tych samych identyfikatorach, ale różnych bajtach danych?
Moje myślenie: generuje śmieci w autobusie. Ktokolwiek ma dominujące bity, tylko oni zostaną przekazani.
Odpowiedzi:
Sekcja 6.1 specyfikacji CAN :
Tak więc węzeł, który jako pierwszy przesyła „1”, gdy drugi przesyła „0”, odnotuje błąd bitowy, a następnie zasygnalizuje błąd w normalny sposób - przesyłając flagę błędu (patrz sekcja 3.1.3), jak opisano formalnie w sekcji 6.2.
Nieformalnie, jeśli ten węzeł jest aktywny (co powinno być zwykłym przypadkiem), wyśle flagę błędu 6 dominujących bitów, którą wszystkie inne węzły również wykryją (jako błąd rzeczy). Powoduje to całkowite zniszczenie tego komunikatu:
Każdy nadajnik będzie następnie próbował retransmitować - w zależności od dokładnego czasu retransmisji, jeden może wystartować wystarczająco wcześniej, a drugi kontrolę wzmocnienia magistrali. W przeciwnym razie ta sama sekwencja może się powtórzyć. (Lub inny komunikat o wyższym priorytecie może zniechęcić ich na chwilę!)
Rozszerzona odpowiedź inspirowana odpowiedzią @ clabbacchio poniżej.
Wspominasz o „paskudnych węzłach”, a clabbacchio słusznie wskazuje, że jeśli dwa węzły transmitują w różnych momentach, każdy odbiornik musi zdecydować, co zrobić z wieloma odbiornikami.
Zostało to wykazane przez włamanie w zeszłym roku . Artykuł omawia, w sekcji „Specyfika PSCM”, w jaki sposób atakujący może zsynchronizować się ze zwykłymi komunikatami w autobusie i odtworzyć swoją złą wiadomość tuż przed tą, którą „dobry” ECU ma zamiar wysłać. Odbierający ECU akceptuje wcześniejszy komunikat, aktualizuje swój licznik wiadomości, a następnie odrzuca „dobre” wiadomości jako błędne, ponieważ jego licznik wiadomości nie zwiększył się.
źródło
W swoim pytaniu stawiasz hipotezę:
Który zakłada, że dwa komunikaty są przesyłane dokładnie w tym samym czasie, co jest szczególnym przypadkiem bardziej ogólnego problemu. Prawidłowa odpowiedź Martina obejmuje ten konkretny problem, ale ignoruje (bardziej ogólny) przypadek, w którym dwa węzły transmitują w różnych momentach.
W takim przypadku na szynie będą krążyć dwie wiadomości o tym samym identyfikatorze, ale o różnej ładowności, i logika odbiorników zależy od rozróżnienia między tymi dwiema wiadomościami i podjęcia decyzji, czy jest to treść, którą należy odebrać. Jeśli nie rozróżnią dwóch komunikatów, mogą źle zinterpretować dane i powodować poważniejsze problemy niż tylko ramki błędów.
Powiedzmy na przykład, że jedna wiadomość zawiera odczyt czujnika temperatury, a druga zawiera pozycję docelową siłownika na tym samym bajcie (NIGDY NIE POWINIEN SIĘ STAĆ W PRAWDZIWYM ŻYCIU), może być tak, że siłownik dostanie to jako cel, nawet o tym nie wiedząc.
źródło
Jeśli pole danych komunikatów jest inne, (miejmy nadzieję!) Otrzymasz ramkę błędu na magistrali z powodu niewłaściwego CRC.
źródło