3.25. Основи шини CAN¶
CAN (Controller Area Network) був спочатку розроблений компанією Bosch у 1980-х роках для з’єднання всіх електронних блоків керування автомобіля в одну коротку спільну шину. Він і досі домінує у автомобільних джгутах проводів, але та сама надійність, поведінка в режимі реального часу та архітектура мульти-майстра роблять його стандартною польовою шиною в автоматизації, робототехніці, сільськогосподарському та промисловому обладнанні будь-якого типу.
CAN не має єдиного «контролера» і набору «периферійних пристроїв», як SPI та I2C. Кожен вузол на шині є рівноправним, і будь-який вузол може передавати дані, коли шина вільна. Масштабування забезпечується широкомовною архітектурою шини з арбітражем.
3.25.1. Широкомовлення з пріоритетним арбітражем¶
Кожне повідомлення на шині CAN несе ідентифікатор – 11 біт для класичного стандартного кадру, 29 біт для розширеного варіанту. Ідентифікатор – це не адреса; він позначає, про що повідомлення (оберти двигуна, положення педалі гальма, напруга акумулятора тощо). Коли вузол хоче надіслати значення, він передає його в широкомовному режимі з відповідним ідентифікатором, і кожен вузол на шині бачить це повідомлення. Кожен отримувач фільтрує шину апаратно, вибираючи лише ті ідентифікатори, які його цікавлять.
Якщо два вузли намагаються передавати одночасно, електрична конструкція шини дозволяє повідомленню з меншим числовим ідентифікатором перемогти без втрати будь-яких бітів.
Секрет полягає у двох електричних станах шини: домінантному (логічний 0) та рецесивному (логічна 1). Проводи CAN утримуються у високому стані (рецесивному) термінаційними резисторами, коли жоден вузол не говорить; будь-який вузол може потягнути проводи вниз (домінантний), пропускаючи струм через свій трансивер. Результат – це «дротяне І»: якщо хоча б один вузол переводить шину у домінантний стан, лінія зчитується як домінантна, і вона зчитується як рецесивна лише тоді, коли всі вузли її відпустили. Домінантний стан завжди перемагає. (У деяких джерелах та сама схема називається дротяним АБО, де «домінантний» розглядається як стверджений сигнал, а не як «І» рецесивних бітів – фізична поведінка однакова в обох випадках.)
Концептуальна схема «дротяного І». Реальний CAN реалізує ту саму логіку на диференціальній парі (CAN_H / CAN_L) з трансиверами та термінаційними резисторами на обох проводах, але правило на шині залишається тим самим: будь-який вузол може встановити домінантний стан, і лише коли всі вузли відпустили її, вона повертається до рецесивного стану.¶
Арбітраж безпосередньо використовує цю асиметрію. Кожен передавальний вузол надсилає свій ідентифікатор побітово, починаючи зі старшого біта, та одночасно спостерігає за шиною. Вузол, який виставляє рецесивний біт, але читає назад домінантний, розуміє, що інший вузол з меншим ідентифікатором передає в той самий момент і виграв цю бітову позицію. Він негайно припиняє керувати шиною та починає слухати. Вузол-переможець тим часом бачить, що його біти передаються без змін – з його точки зору нічого незвичайного не відбулося. Ідентифікатор з меншим номером виграє, оскільки його домінантні біти перекривають рецесивні біти, які інші ідентифікатори інакше надіслали б на тих самих позиціях.
Переможений вузол потім чекає, поки шина не звільниться, і автоматично повторює спробу. Немає колізій, немає втрачених повідомлень – лише детермінований пріоритетний порядок.
Це публікація/підписка, яка дає CAN можливість масштабуватись: будь-хто може говорити, будь-хто може слухати, а ідентифікатори роблять диспетчеризацію неявною.
3.25.2. Фізична шина¶
Контролер CAN мікроконтролера не керує шиною безпосередньо. Він надає лише два виводи 3,3 В CMOS – TX (біт, який він хоче надіслати) та RX (біт, який він бачить на шині) – і ці виводи підключаються до окремої мікросхеми, яка називається трансивером CAN або PHY. Трансивер знаходиться між контролером і фактичними проводами CAN; саме він вміє «розмовляти» з шиною.
Сама шина – це диференціальна пара 5 В:
CAN_H – «верхній» провід пари.
CAN_L – «нижній» провід.
У рецесивному стані обидва проводи знаходяться приблизно на рівні 2,5 В (середня точка живлення шини 5 В). У домінантному стані трансивер підтягує CAN_H приблизно до 3,5 В і CAN_L опускає приблизно до 1,5 В, створюючи диференціал близько 2 В між парою. Приймачі вимірюють різницю між двома проводами, що робить сигнал стійким до синфазних завад, що виникають на довгих кабельних трасах.
Двостороннє завдання трансивера:
На стороні TX він зчитує 3,3 В однополярний вивід TX контролера та або розводить CAN_H і CAN_L для домінантного стану, або відпускає обидва для рецесивного.
На стороні RX він зчитує диференціальну пару CAN_H / CAN_L та передає однополярний рівень 3,3 В на свій вивід RX назад до контролера.
Два термінаційних резистори по 120 Ом, по одному на кожному фізичному кінці кабелю, утримують шину на рецесивній середній точці, коли жоден вузол не керує нею, та гасять відбиття, які інакше спотворили б диференціальний сигнал на довгих лініях.
3.25.3. Кадр даних¶
Стандартний кадр даних CAN на дроті виглядає так:
Стандартний кадр даних CAN: поля SOF, ID, RTR, управління, дані, CRC, ACK та EOF.¶
Кожне поле виконує певну функцію:
SOF (початок кадру). Один домінантний біт, що сигналізує про початок нового кадру та синхронізує тактовий сигнал біта кожного вузла.
ID (ідентифікатор). 11-бітний ідентифікатор, за яким шина проводить арбітраж. Менший номер = вищий пріоритет.
RTR (запит на дистанційну передачу). Встановлюється для запиту даних, а не для їх доставки; приймачі з відповідним ідентифікатором відповідають надсиланням даних самостійно.
Управління. 6-бітне поле, що кодує довжину даних (
DLC) та кілька допоміжних бітів.Дані. Від 0 до 8 байт корисного навантаження (CAN Classic; CAN FD розширює це до 64 байт).
CRC. Всього 16 біт: 15-бітний CRC попередніх полів плюс 1-бітний роздільник CRC.
ACK. Всього 2 біти. У першому біті – слоті ACK – передавач відпускає лінію, і будь-який вузол, який правильно отримав кадр, тягне її вниз; другий біт – рецесивний роздільник. Відсутність ACK повідомляє передавачу, що жоден вузол не почув кадр, і він повинен повторити спробу.
EOF (кінець кадру). Сім рецесивних бітів, що закривають кадр.
Все це генерується та декодується контролером CAN апаратно; програмне забезпечення бачить лише ідентифікатор, дані та кілька прапорців.
3.25.4. Де знаходиться CAN¶
Проектні рішення CAN визначають його нішу:
Надійність. Диференціальна сигналізація на скрученій парі, вбудоване виявлення помилок, детермінований пріоритетний арбітраж та автоматичні повторні спроби дозволяють CAN виживати в електрично зашумлених середовищах, де UART та SPI пошкоджували б дані.
Мульти-майстер. Будь-який вузол може говорити в будь-який час. Центральний контролер не потрібен, і жоден вузол не є єдиною точкою відмови.
Обмежена пропускна здатність. Класичний CAN досягає максимуму приблизно
1 Mbit/s; CAN FD розширює це. CAN є правильною відповіддю, коли зв’язок здійснюється між платами або модулями, часто на відстані в метри кабелю, з надійністю як пріоритетом.Протоколи вищого рівня. Чиста шина CAN не визначає, що означає ідентифікатор або як розбити довге повідомлення на фрагменти. Протоколи прикладного рівня – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – накладають ці правила поверх. Окремо варто знати про файл DBC: спеціфічний для постачальника текстовий формат, що записує, які ідентифікатори несуть які сигнали на бітовому рівні у конкретному транспортному засобі або системі. Файли DBC – це формат метаданих, що описує розмітку повідомлень однієї шини, а не окремий протокол.
Драйвер у Шина CAN у коді обробляє кадр CAN на рівні проводів; відображення ідентифікаторів у значення – завдання програми.