Всем привет! Я начинающий разработчик и увлекся Embedded стороной вопроса. Лучший способ запомнить информацию — написать какой нибудь конспект и поделиться им. Ниже моя краткая выжимка о CAN шине и передаче данных через нее:
Шина CAN (Controller Area Network).
![](https://habrastorage.org/getpro/habr/upload_files/353/57b/e5e/35357be5ee8a2bc2662767eca6eb7d37.png)
Шина представляет из себя пару проводников, в нашем случае витую пару разделенную резисторами сопротивлением 120 Ом (Называется этот резистор Терминаторам). Состоит из линии высокого напряжения (H — high) и низкого напряжения (L-low).
Краткие характеристики:
Скорость 1 mb/s при длине шины до 40 метров (Автомобиль или комната).
Скорость 10 kb/s при длине шины до 1000 метров (здание).
Приемопередатчики равноправны в шине CAN.
![](https://habrastorage.org/getpro/habr/upload_files/686/5d1/e9f/6865d1e9fec5f2a0a32af0569962ce0e.png)
Когда никто не передает сигнал по шине и в 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. Передача данных когда устройство делится данными.
![](https://habrastorage.org/getpro/habr/upload_files/c6d/fb1/8e2/c6dfb18e2aae6efaf82efcb3d765346a.png)
S — стартовый бит — всегда Dominant bit. Все приемники синхронизируются по нему. На вход приемо передатчику приходит ноль и он подает напряжение на шину H создавая тем самым разницу.
ID — уникальный номер сообщения(команды). По нему приемники понимают нужно ли им это сообщение или оно адресовано кому то другому. В стандартном исполнении CAN 11 бит, в CAN2.0b — 29 бит.
D length — указывает какой длины в байтах будет блок данных.
Data — само сообщение от 0 до 8 байт.
CRC — контрольная сумма размером 2 байта.
![](https://habrastorage.org/getpro/habr/upload_files/021/8a2/b56/0218a2b565839558e31b363b23ed2f02.png)
ACK. После передачи CRC приемник получающий сообщение выставляет подтверждающий бит если сумма сходиться. Передатчик видит что приемник получил сообщение и далее выставляет 7 бит Reces сигнала — EOF.
Для всех кто увлекается Электроникой и Электротехникой — рекомендую канал Электротехника и электроника для программистов. Если что то не понятно или неправильно изложено — пишите поправлю. Собственно первоисточник статьи — лекция 403 CAN шина- введение.
Как ниже в коментариях справедливо заметили в Википедии конечно больше информации.
Ну и перепечатывать википедию смысла не вижу. Приложу тут ссылочку.
ссылка на оригинал статьи https://habr.com/ru/articles/726350/
Добавить комментарий