Как стать автором
Обновить

CAN шина

Время на прочтение3 мин
Количество просмотров24K

Всем привет! Я начинающий разработчик и увлекся Embedded стороной вопроса. Лучший способ запомнить информацию - написать какой нибудь конспект и поделиться им. Ниже моя краткая выжимка о CAN шине и передаче данных через нее:

Шина CAN (Controller Area Network).

Шина представляет из себя пару проводников, в нашем случае витую пару разделенную резисторами сопротивлением 120 Ом (Называется этот резистор Терминаторам). Состоит из линии высокого напряжения (H - high) и низкого напряжения (L-low).

Краткие характеристики:

Скорость 1 mb/s при длине шины до 40 метров (Автомобиль или комната).

Скорость 10 kb/s при длине шины до 1000 метров (здание).

Приемопередатчики равноправны в шине CAN. 

Когда никто не передает сигнал по шине и в H и в L по 2,5 вольта. Когда сигнал есть - на H 3,5V а на линии L - 1,5 В. По разнице между H и L  приемопередатчики понимают, что началась передача. Поэтому шина CAN не чувствительна к наводкам. Вольтаж на витой паре может быть другой - шина понимает о начале приема или передачи по разнице между L и H. 

Когда на вход передатчику приходит ноль - передатчик увеличивает на H напряжение. Все остальные приемопередатчики понимают, что началась передача сигнала. Кодирование выполняется в формате NRZ: 

Dominant bit - состояние когда на шине H>L - соответствует 1-це. 

Recess bit - состояние когда на линии нет сигнала воспринимается как ноль.

Смена бит происходит по частоте передатчика. Частота приемников может незначительно отличаться вследствие чего большая последовательность повторяющихся сигналов может привести к рассинхронизации. Поэтому применяется 

bit stuffing.

Bit stuffing - 5. Если идет 5 одинаковых бит - передатчик выставляет противоположный бит. Все приемники игнорируют этот бит. Если же приемники видят подряд 6 одинаковых бит - они понимают что произошла ошибка и игнорируют сообщение.

Collision Resolution (CR) - если два передатчика начинают одновременно передавать - приоритет получает тот кто передает больше единиц. Допустим два передатчика начали одновременно вещать. Оба передают 3 единицы, на 4 бите один из них не выставляет сигнал, но фиксирует что на шине есть перепад - таким образом он понимает, что сигнал вместе с ним кто то передает параллельно и замолкает. 

CR эффективнее Collision Detection в ethernet так как в CD в случае обнаружения двух передающих передатчиков замолкают оба и начинают передачу через какой то случайный промежуток времени. 

Протокол передачи информации DATA FRAME. Передача данных когда устройство делится данными.

S - стартовый бит - всегда Dominant bit. Все приемники синхронизируются по нему. На вход приемо передатчику приходит ноль и он подает напряжение на шину H создавая тем самым разницу.
ID - уникальный номер сообщения(команды). По нему приемники понимают нужно ли им это сообщение или оно адресовано кому то другому. В стандартном исполнении CAN 11 бит, в CAN2.0b - 29 бит. 

D length - указывает какой длины в байтах будет блок данных.
Data - само сообщение от 0 до 8 байт. 

CRC - контрольная сумма размером 2 байта. 

ACK. После передачи CRC приемник получающий сообщение выставляет подтверждающий бит если сумма сходиться. Передатчик видит что приемник получил сообщение и далее выставляет 7 бит Reces сигнала - EOF.

Для всех кто увлекается Электроникой и Электротехникой - рекомендую канал Электротехника и электроника для программистов. Если что то не понятно или неправильно изложено - пишите поправлю. Собственно первоисточник статьи - лекция 403 CAN шина- введение.

Как ниже в коментариях справедливо заметили в Википедии конечно больше информации.
Ну и перепечатывать википедию смысла не вижу. Приложу тут ссылочку.

Теги:
Хабы:
Всего голосов 26: ↑13 и ↓13+5
Комментарии8

Публикации

Ближайшие события

Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область