Всем привет! Я начинающий разработчик и увлекся 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 шина- введение.

Комментарии (7)


  1. devprodest
    00.00.0000 00:00
    +15

    На странице в википедии куда больше информации и куда лучше все это описано ????


  1. REPISOT
    00.00.0000 00:00
    +11

    первоисточник статьи — лекция 403 CAN шина- введение.
    Лектор допускает фактические ошибки.

    Автор статьи дополнительно искажает лекцию. Например, лектор говорит:
    приемопередатчики равноправны
    Автор пишет
    Приемники и передатчики равноправны

    Скачивайте спецификации и читайте их.


  1. kovserg
    00.00.0000 00:00
    +3

    Обычно не говорят самого главного, что шина CAN задумывалась для передачи значений датчиков. Добавил например термометр на шину и можно показывать температуру, добавил тахометр показываем обороты. И все эти датчики вешаются на одну линию, что бы не тянуть сотни проводов. И они сами могут с заданным темпом вываливать значения. Те что менее приоритетные имеют адрес побольше, по кадру или по адресу можно определять что это. Но на практике используют немного через… не так. Просто нарезают пакеты по 7 байт+номер пакета и передают блоками, как привыкли. В результате превращая хорошую идею в фигню. Так и живём.


    Еще с NRZ есть злобный баг. Если этот NRZ приходится на контрольную сумму, а еще лучше на на бит ACK. Тут у разных устройств начинаются разночтения. И такие избранные кадры не возможно передать между ними.


    ps: Еще есть возможность временно попросить все устройства не вещать, напихав в линию нулей.


    1. HardWrMan
      00.00.0000 00:00
      +2

      Обычно не говорят самого главного, что шина CAN задумывалась для передачи значений датчиков.

      Возможно, не все знают как расшифровывается CAN? Это Controller Area Network. Кстати, английское "can" в одном из распространённых значений "жестяная банка". Совпадение? - Да.

      Но на практике используют немного через… не так. Просто нарезают пакеты по 7 байт+номер пакета и передают блоками, как привыкли. В результате превращая хорошую идею в фигню.

      Ну, если вам не нравится KWP2000, то зачем вы пользуетесь TCP/IP? Ведь суть та же: придумали отличный вариант Ethernet, с удобными 1500 байтами. А тут на тебе, натянули сверху протоколов-оболочек, которые вынуждены фрагментировать сообщения да ещё и следить за их порядком... Это был сарказм, если что.

      Еще с NRZ есть злобный баг.

      Вероятно, вы спутали формат/код NRZ (Non Returnt to Zero) с процессом Bit Stuffing, суть которого во вставлении не информационных бит в общий поток для уменьшения постоянной составляющей в сигнале с кучей одинаковых бит. Это же позволяет не потерять синхронизацию приёмнику ведь NRZ не является самосинхронизирующимся кодом, в отличии от, например, манчестера.

      По стандарту, кстати, бит стаффинг есть во всех полях кадров данных или запроса, кроме разграничителя контрольной суммы, промежутка подтверждения и EOF. Но практика показывает, что всякие сторонние причины, такие как не полное соответствие стандарту и/или ошибки в реализации блока как раз и приводят к эффектам, описанным вами.


  1. HardWrMan
    00.00.0000 00:00
    +3

    Лучше бы в статье было про что-то новое, например про CAN FD (CAN Flexible Data-Rate).


  1. rsashka
    00.00.0000 00:00
    +3

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

    Это не так. Витая пара, это один из нескольких возможных физических уровней для шины CAN.


  1. antag0n
    00.00.0000 00:00
    +3

    Шина представляет из себя витую пару разделенную резисторами сопротивлением 120 Ом.

    Сразу неправильно. Витая пара, это только один из многих вариантов физического уровня для CAN шины.