RadioRadar - Радиоэлектроника, даташиты, схемы

https://www.radioradar.net/radiofan/motorcar_enthusiast/calculation_bit_synchronization_can_network.html

Расчёт битовой синхронизации сети CAN

При использовании интерфейса CAN большая проблема связана с установкой скорости передачи и приёма информацией в CAN-модуле микроконтроллера. В статье описываются общие основы этой установки согласно спецификации фирмы Bosch. В качестве примера приведены основные формулы для вычисления значений параметров, записываемых в управляющие регистры CAN-модулей микроконтроллеров ARM LPC23xx и STM32F103, а также рассмотрена разработанная автором программа, помогающая выбрать наилучший вариант.

Своё начало интерфейс CAN (controller area network - локальная сеть контроллера) получил в середине 80-х годов прошлого века от немецкой компании Robert Bosch Gmbh, которая создавала его в качестве экономичного средства для объединения в информационную сеть контроллеров, управляющих системами автомобиля. Дело в том, что по мере совершенствования автомобильной техники развивалась и электроника, управляющая двигателем, коробкой передач и другими механизмами. Это привело к тому, что к каждому электронному блоку в автомобиле стали тянуться десятки проводов от датчиков и исполнительных устройств, а также провода, связывающие между собой разные блоки. Всё это не только утяжеляло машину, но и сказывалось на её надёжности, безопасности, ремонтопригодности.

По мере распространения этого интерфейса подобные сети стали применять и в других областях, в частности, для автоматизации технологических процессов. Высокая надёжность защиты информации от искажения при работе в жёстких условиях и достаточно большая скорость её передачи (до 1 Мбит/с) дали возможность использовать cAn в отличных от её первоначального назначения местах. Надёжность сети обеспечивается наличием развитых механизмов обнаружения и исправления ошибок, самоизоляцией неисправных узлов, нечувствительностью к высокому уровню электромагнитных помех.

В основе идеологии CAN лежит семиуровневая модель OSI/ISO (если говорить упрощённо, то это виртуальное разделение процессов передачи и приёма информации на семь уровней). Углубляться в эту область нет смысла, так как она широко освещена во многих источниках, например в [1]. В настоящее время стандартизованы два уровня: физический (частично) и канальный.

Физическая среда передачи информации в спецификации CAN фирмы Bosch не определена, но обычно подразумевается, что это сеть типа "шина" с физическим уровнем в виде пары проводов согласно стандарту ISO 11898. Типы соединений и скорость передачи в настоящее время не стандартизированы, но обычно их задают в спецификациях вышележащих слоёв.

Все узлы сети присоединяются к двум проводам связывающей их линии (CAN_H и CAN_L) параллельно. На концах линии связи обязательно должны быть установлены терминаторы - резисторы сопротивлением 120 Ом. В отсутствие передачи напряжение на обоих проводах относительно корпуса автомобиля или общего провода технологической установки - 2,5 В. Логической единице (по принятой в CAN терминологии бит с таким значением называется рецессивным) соответствует состояние шины, при котором уровень напряжения на проводе CaN_H выше, чем на CAN_L. Логическому нулю (бит с таким значением называется доминантным) - наоборот. При одновременной работе нескольких передатчиков рецессивный бит в линии подавляется доминантным.

Принято, что пассивное состояние шины соответствует уровню логической единицы. В нём она находится, когда никакие сообщения не передаются. Передача сообщения всегда начинается с доминантного бита. Провода шины в CAN-модуле каждого узла соединены со специальной микросхемой - драйвером шины, выполняющим функции приёмопередатчика. Кроме того, драйвер может обеспечивать некоторые дополнительные функции:

- регулировку скорости нарастания сигнала путём изменения входного тока;

- защиту выходов передатчика от повреждения при возможных замыканиях проводов CAN_H и CAN_L с цепями питания с помощью встроенного узла ограничения тока, а также от кратковременного повышения напряжения на этих проводах;

- внутреннюю тепловую защиту;

- режим пониженного энергопотребления, в котором приёмник продолжает сообщать контроллеру о состоянии шины, чтобы при обнаружении её активности он мог перевести драйвер в нормальный режим работы.

Кодирование информации для передачи по шине происходит методом NRZ (Non Return to Zero - без возврата к нулю). Он имеет существенный недостаток: при передаче длинной последовательности единиц получается, что пауз между ними нет. Это приводит к тому, что приёмник не может отличить такую последовательность от паузы между сообщениями. Для решения этой проблемы используется так называемый битстаффинг (Bit Stuffing - вставка битов). Он заключается в том, что после пяти переданных подряд одинаковых битов в их поток вставляется дополнительный бит с противоположным значением. Приёмник, обнаружив пять одинаковых битов подряд, удаляет тот, который следует за ними, вставленный при передаче.

На канальном уровне определены два типа идентификаторов: Standard CAN (длиной 11 бит) и Extended CAN (29 бит). Они задают формат сообщений.

Среди высших уровней можно отметить спецификации CAL/CANopen, CAN Kingdom, DeviceNet и SDS (Smart Distributed System), подробнее можно посмотреть в Интернете [2].

По определению сеть CAN объединяет ограниченное число контроллеров, локально размещённых внутри одной установки, помещения или нескольких близкорасположенных помещений. Она не выходит за границы технологического объекта. Идеология сети построена на нескольких моментах. Во-первых, контроллер, осуществляющий передачу, непрерывно слушает свои же, передаваемые по сети сигналы. Это даёт возможность выполнять побитную проверку правильности передаваемой информации (check bit monitoring) несколькими узлами в отличие, например, от сетей Ethernet. Если принятый контроллером бит отличается от им же переданного, то передача останавливается и генерируется ошибка Bit Error.

При передаче идентификатора сообщения этот механизм используется для разрешения коллизий, а при передаче информации проверяется её корректность. Если в ней обнаружена ошибка, то передатчик прерывает своё сообщение и выдаёт на шину кадр Error Frame для оповещения остальных узлов сети об этом событии. Для подтверждения приёма сообщения в информационном кадре имеется поле ACK. В этом поле каждый узел, принявший переданное сообщение, подтверждает его источнику, что оно получено. Неподтверждённое сообщение передатчик посылает повторно, покаподтверждение не будет получено.

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

Сеть CAN децентрализована. Это можно считать большим плюсом, если немного отойти от привычной идеологии, согласно которой сеть обязательно должнаиметь управляющий ею ведущий узел и выполняющие его команды ведомые узлы. В децентрализованной сети узлы обладают большей интеллектуальностью. Она продолжает функционировать при выходе из строя любого из них.

 Информация передаётся сообщениями стандартного формата - кадрами Data Frame (передача информации), Remote Transmission Request Frame или просто Remote Frame (запрос информации), Error Frame (сообщение об ошибке), Overload Frame (сообщение о перегрузке контроллера).

Чаще всего используются кадры передачи информации. Их формат и содержимое показаны в табл. 1 для стандартного, а в табл. 2 для расширенного кадров. Кадр запроса информации отличается от информационного (стандартного или расширенного формата) только тем, что бит RTR всегда рецессивный, а поле информации отсутствует.

Таблица 1

Поле

Длина,

бит (байт)

Значение

Начало кадра

1

Должно быть доминантным (0)

Идентификатор

11

 

Запрос передачи (RTR)

1

Должно быть доминантным (0)

Признак расширения идентификатора (IDE)

1

Должно быть доминантным (0)

Зарезервировано (rО)

1

 

Длина поля информа­ции (DLC)

4

Задается в байтах

Поле информации

(0 - 8)

Передаваемая информация

Контрольная сумма (CRC)

15

Вычисляется по всему кадру

Разграничитель контрольной суммы

1

Должно быть рецессивным (1)

Промежуток подтвер­ждения (АСК)

1

Передатчик шлет рецессивный (1), приемник вставляет доминанту (0)

Разграничитель подтверждения

1

Должно быть рецессивным (1)

Конец кадра (EOF)

7

Должно быть рецессивным (1)

 

Таблица 2

Поле

Длина, бит (байт)

Значение

Начало кадра

1

Должно быть доминантным (0)

Идентификатор А

11

Первая часть идентификатора

Подмена запроса передачи (SRR)

1

Должно быть рецессивным (1)

Признак расширения идентификатора (IDE)

1

Должно быть рецессивным (1)

Идентификатор В

18

Вторая часть идентификатора

Запрос на передачу (RTR)

1

Должно быть доминантным (0)

Зарезервировано (r1 и r0)

2

 

Длина поля информа­ции (DLC)

4

Задаётся в байтах

Поле информации

(0 - 8)

Передаваемая информация

Контрольная сумма (СПС) всего кадра

15

Вычисляется по всему кадру

Разграничитель контрольной суммы

1

Должно быть рецессивным (1)

Подтверждение (АСК)

1

Передатчик шлет рецессивный, приемник вставляет доминанту

Разграничитель подтверждения

1

Должно быть рецессивным (1)

Конец кадра (EOF)

7

Должно быть рецессивным (1)

 

Кадр Error Frame состоит из поля Error Flag, которое содержит шесть битов одинакового значения (и таким образом нарушает правило битстаффинга), и поля Error Delimiter из восьми рецессивных битов. Его передача приводит к тому, что все узлы сети регистрируют ошибку формата и автоматически передают в сеть свои кадры Error Frame. Результат этого процесса - автоматическая повторная передача информации в сеть узлом, передававшим исходное сообщение.

Кадр Overload Frame повторяет структуру и логику работы Error Frame, но передаётся узлом, который в данный момент не может обработать поступающее сообщение и поэтому запрашивает повторную передачу. В настоящее время практически не используется.

В каждом узле сети имеются драйвер шины, CAN-контроллер (в обязанности которого входит взаимодействие с сетью, реализация протокола обмена) и микроконтроллер. Очень часто CAN-контроллер совмещают с микроконтроллером. В этом случае для создания узла сети CAN достаточно двух микросхем - микроконтроллера и драйвера шины.

Синхронизация в CAN тесно связана с самим способом передачи информации по сети. Пользователю предоставляется возможность программировать скорость передачи информации (от 1 Кбит/с до 1 Мбит/с), положение точки (момента) выборки бита в интервале его передачи и число выборок каждого бита. Благодаря этому сеть можно оптимизировать под конкретное приложение. Но это же создаёт и некоторые проблемы.

Любую передаваемую по последовательной шине информацию можно разбить на элементарные биты, от длительности передачи этого элементарного битаNBT (Nominal Bit Time) зависит скорость передачи информации NBR (Nominal Bit Rate) - число битов, передаваемых за секунду идеальным передатчиком без восстановления тактовых интервалов:

NBR = 1/NBT           (1)

Как показано на рис. 1, интервал NBT разделён на несколько не перекрывающихся сегментов, каждый из которых состоит из целого числа временных отрезков, называемых квантами времени (Time Quanta - TQ).

Рис. 1

 

Поскольку скорость передачи NBR у всех узлов сети должна быть одинаковой, с помощью формулы (1) обычно находят необходимое значение NBT и затем подбирают длительность каждого из образующих его сегментов:

NBT = TSyncSeg + TPropSeg + TPS1 + TPS2  ,         (2)

где TSyncSeg - длительность сегмента синхронизации; TPropSeg - длительность сегмента распространения; TPS1 - длительность сегмента фазы 1; TPS2 - длительность сегмента фазы 2.

Сегмент синхронизации (SyncSeg) - первый по порядку, используется для синхронизации узлов на шине. Приход начального перепада уровня будет ожидаться именно в пределах этого сегмента. Длительность его фиксирована и всегда равна 1TQ.

Сегмент распространения (PropSeg) служит для компенсации физических задержек сигнала между узлами. Его длительность зависит от времени распространения сигнала от передающего узла до принимающего и обратно, включая задержки, связанные с драйвером шины. Она может принимать значения от 1TQ до 8TQ.

Сегменты фаз 1 и 2 (PS1 и PS2) служат для компенсации искажений фазы перепадов на шине. Во время синхронизации с восстановлением тактовых интервалов приёмником может либо удлиняться PS1, либо укорачиваться PS2. Согласно первоначальной спецификации фирмы Bosch, длительность PS1 и PS2 может лежать в пределах от 1TQ до 8TQ, но для некоторых CAN-модулей эти значения могут быть другими.

Между сегментами PS1 и PS2 лежит момент, который называют точкой выборки бита. В ней производятся считывание и интерпретация логического уровня сигнала. В некоторых CAN-контроллерах бывает предусмотрен режим тройного чтения уровня сигнала каждого бита. Но даже в этом случае основной считается точка между PS1 и PS2, а две другие способствуют принятию правильного решения о значении бита по критерию большинства (двум или трём отсчётам одного уровня).

Какуже говорилось выше, номинальное время передачи бита состоит из целого числа квантов времени TQ. Длительность кванта зависит от частоты тактового генератора модуля Fosc и коэффициента её деления предварительным делителем BRP. Соотношения между TQ, Fosc и BRP различны для микроконтроллеров разных типов. Например, для МСР2510 справедлива формула

TQ = 2 · (BRP + 1)/Fosc .      (3)

Для микроконтроллеров STM32F и LPC23xx формула выглядит так:

TQ = (BRP + 1)/Fosc .       (4)

При подборе длительности сегментов удобнее пользоваться квантами времени TQ, а не стандартными единицами времени. Здесь и далее мы будем обозначать именем сегмента (например, PropSeg) и его длительность в квантах. Существуют несколько требований, которые необходимо соблюдать:

PropSeg +PS1 ≥ PS2;      (5)

PropSeg +PS1 ≥ Tprop;     (6)

PS2 > SJW.       (7)

Tprop в неравенстве (6) - задержка распространения сигнала в сети. Если предположить, что все узлы в сети имеют сходные внутренние задержки, то вычислить задержку распространения можно по формуле

Tprop = 2 · (Tbus + Tcmp + Tdrv),         (8)

где Tbus - время прохождения сигнала туда и обратно в физической среде шины; Tcmp - задержка во входном компараторе; Tdrv - задержка в выходном драйвере.

SJW (Synchronization Jump Width - ширина скачка синхронизации) в неравенстве (7) - длительность сегмента перехода синхронизации, дополнительно вводимого для корректировки длительности приёма бита по мере необходимости. Используется для синхронизации приёма с передаваемыми сообщениями. Кроме того, внешние помехи создают ситуации, когда номинальная скорость передачи, запланированная в сети, не соответствует реальной скорости. Для компенсации этого различия также используется этот дополнительный сегмент. Длительность SJW лежит в пределах 1TQ-4TQ.

Сегменты PS1 и PS2 вместе с SJW используются для компенсации ухода частоты тактового генератора узла. PS1 и PS2 могут удлиняться или укорачиваться в зависимости от необходимости. Синхронизация происходит по переходу от рецессивного (1) к доминантному (0) состоянию шины и управляет интервалом времени между этим переходом и точкой выборки бита. Переход синхронизирован, если он происходит в сегменте SyncSeg, иначе существует фазовая ошибка - интервал времени между переходом и окончанием SyncSeg, измеряемый во временных квантах TQ.

Существуют два типа синхронизации: аппаратная и повторная. Аппаратная выполняется только один раз при первом переходе от рецессивного состояния к доминантному, завершающем период покоя шины. Этот перепад указывает на начало кадра (SOF - Start of Frame). Аппаратная синхронизация устанавливает счётчик синхронизации в исходное состояние, заставляя перепад расположиться в пределах сегмента SyncSeg. В этот момент все приёмники синхронизированы с передатчиком.

Повторная синхронизация с восстановлением тактовых интервалов производится для того, чтобы поддержать начальную синхронизацию, которая была установлена аппаратно. Без восстановления тактовых интервалов приёмники могут выйти из синхронизма из-за ухода частоты тактовых генераторов в узлах сети. Эта синхронизация работает на основе цифровой фазовой автоподстройки (DPLL - Digital Phase Locked Loop), которая сравнивает фактическую позицию перехода рецессивного состояния в доминантное на шине с позицией ожидаемого перехода внутри SyncSeg и при необходимости корректирует время передачи бита.

Фазовая ошибка е определяется позицией перепада относительно сегмента SyncSeg, измеренной в TQ:

e = 0 - переход находится внутри сегмента SyncSeg;

e > 0 - переход находится перед точкой выборки, к PS1 прибавляются временные кванты TQ;

e < 0 - переход находится после точки выборки предыдущего бита, из PS2 вычитаются временные кванты TQ.

Повторная синхронизация с восстановлением тактовых интервалов не может происходить в начале кадра, так как там уже была выполнена аппаратная синхронизация.

Если абсолютное значение фазовой ошибки меньше или равно SJW, результат аппаратной и повторной синхронизации одинаков. Если фазовая ошибка больше SJW, повторная синхронизация не может скомпенсировать фазовую ошибку полностью.

Между двумя точками выборки допустима только одна синхронизация. Она поддерживает заданный интервал между перепадом уровня и точкой выборки, давая возможность уровню сигнала стабилизироваться и отфильтровывая его изменения, которые короче, чем PropSeg + PS1.

Синхронизация связана ещё и с арбитражем. Все узлы жёстко синхронизируются с тем, который начал передавать первым. Но сигнал другого узла, который начал передачу чуть позже, не может быть идеально синхронизирован. Однако первый передатчик не обязательно выиграет арбитраж, поэтому приёмники должны синхронизировать себя не с ним, а с тем, который его выиграл. То же самое происходит и в поле подтверждения ACK, где необходимо синхронизироваться с тем узлом, который первым начал передавать бит подтверждения. Всё это приводит к уменьшению допустимого взаимного ухода частоты тактовых генераторов, установленных в узлах шины.

Имеются несколько правил синхронизации:

- используются только переходы из рецессивного в доминантное состояние (из единицы в ноль);

- в пределах передачи бита разрешается только одна синхронизация;

- переход используется для синхронизации при условии, что логический уровень сигнала, прочитанный в предыдущей точке выборки, отличается от уровня, установленного на шине сразу после перехода;

- передающий узел не выполняет восстановление тактовых интервалов при положительной фазовой ошибке (е > 0), т. е. не подстраивается под своё же сообщение. Но приёмники выполняют синхронизацию как обычно;

- если абсолютное значение фазовой ошибки больше, чем скачок фазы SJW, то длительность соответствующего сегмента фазы (PS1 или PS2) изменяется до значения, равного SJW.

Вышесказанное приводит к тому, что физическая длина шины ограничена скоростью передачи информации по ней. Всем узлам шины нужно прочитать её состояния в пределах одного и того же интервала передачи бита. В итоге получается, что максимальная скорость передачи в 1 Мбит/с достижима лишь при длине шины не более 30 м.

Рассмотрим, как производится настройка контроллера CAN в конкретных микроконтроллерах.

В микроконтроллерах семейства LPC (например, серии LPC23xx) для установки скорости передачи по шине CAN предназначены регистры CANxBTR, где х - номер контроллера CAN (их может быть 1 или 2, в некоторых случаях - 4). Здесь задают следующие параметры (в квадратных скобках указаны интервалы номеров занятых ими разрядов регистра):

BRP (CANxBTR[9:0]) - значение коэффициента предварительного деления частоты шины APB для дальнейшего её использования контроллером CAN. От этого параметра зависит длительность временного кванта TQ, определяемая по формуле (4) при подстановке в неё Fosc=1/TAPB, где TAPB - период следования импульсов на системной шине APB микроконтроллера.

SJW (CANxBTR[15:14]) - ширина скачка синхронизации в квантах TQ на единицу больше указанного здесь значения.

TSEG1 (CANxBTR[19:16]) и TSEG2 (CANxBTR[20:22]) - длительность сегментов (соответственно PS1 и PS2) в квантах TQ на единицу больше указанных здесь значений.

SAM (CANxBTR[23]) - задаёт число считываний значения каждого бита: 0 - однократно, 1 - трёхкратно. Последний вариант используется, как правило, в низкоскоростных сетях.

При выборе этих параметров надо руководствоваться следующими правилами:

TPS2 ≥ 2 · TQ        (9)

TPS2 ≥ TSJW         (10)

TPS1 ≥ TPS2         (11)

В микроконтроллерах серии STM32F имеется аналогичный регистр и называется он CAN_BTR. В нём предусмотрены следующие поля:

BRP (CAN_BTR[9:0]), TS1 (CAN_ BTR[19:16]) и TS2 (CAN_BTR[22:20]) - совпадают по назначению и расположению в регистре с рассмотренными выше полями BPR, TSEG1 и TSEG2 регистра CANxBTR. При вычислении значения TQ в формулу (4) следует подставлять Fosc=1/TPCLK, где TPCLK - период повторения импульсов на шине VPB микроконтроллера.

SJW (CAN_BTR[25:24]) - отличается от одноимённого поля регистра CANxBTR лишь занимаемыми в регистре разрядами.

LBKM (CAN_BTR[30]) - единица в этом регистре устанавливает режим шлейфа, в котором передаваемое сообщение принимается собственным приёмником, но не отправляется в сеть.

SILM (CAN_BTR[31]) - единица в этом регистре устанавливает режим молчания, в котором контроллер принимает поступающие из сети сообщения, но ничего не передаёт.

Оба упомянутых режима используются для отладки.

Для рассматриваемых микроконтроллеров формула (2) упрощается за счёт отсутствия сегментов SyncSeg и PropSeg. Они заменены одним сегментом длительностью 1TQ. Формула для них выглядит так:

NBT = TQ + TPS1 + TPS2          (12)

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

NBR = (F/(BRP + 1)) · (1/(PS1 +PS2 +3))             (13)

где F - частота системной шины APB или VPB соответственно для STM32F или LPC23xx. Если параметр SJW не равен нулю, вычисляются максимальное

BRmax = (F/(BRP + 1)) · (1/(PS1 +PS2 - SJW + 2))         (14)

и минимальное

BRmin = (F/(BRP + 1)) · (1/(PS1 +PS2 + SJW + 4))        (15)

значения скорости передачи по шине CAN, в интервале между которыми обеспечивается синхронизация.

Окно программы CANTools показано на рис. 2. Исходными данными для неё служат тип микроконтроллера, требуемая скорость передачи информации и частота системной шины, от которой производится тактирование CAN-контроллера. Приступая к расчёту, следует, прежде всего, выбрать тип микроконтроллера. В рассматриваемой программе вариантов всего два - LPC23xx или STM32F103. Далее задают требуемую скорость передачи по шине CAN в килобитах в секунду. После этого можно задать частоту системной шины в мегагерцах. Остаётся только нажать на экранную кнопку "Расчёт" и получить результат.

Рис. 2

 

Работает программа следующим образом: в цикле от 0 до 512 изменяется значение BRP Вычисляются частота следования квантов времени и их число, содержащееся в интервале NBT при заданных частоте системной шины, значении BRP и скорости передачи. Число квантов должно быть целым и меньше 23 - максимального значения, которое может быть записано в регистры микроконтроллера. Потом выполняется перебор значений TSEG2 от 2 до 7 с соответствующим уменьшением значения TSEG1. Их сумма остаётся постоянной.

На экран выводятся частота следования квантов Fsc=1/TQ, через дробную черту - длительность кванта TQ, затем значение поля BRP соответствующего регистра. После этого каждая пара строк описывает результат одного из вариантов расчёта.

Параметры TSEG1 и TSEG2 в первой из строк пары соответствуют одноимённым полям регистра CANxBTR микроконтроллеров серии LPC23xx или полям TS1, TS2 регистра CAN_BTR микроконтроллера STM32F103. Приводятся их сумма, значение каждого из полей, а также значение поля SJW, если оно не нулевое. Последним в строке выводится шестнадцатеричное значение CANBTR, которое следует записать в регистр CANxBTR или CAN_BTR (соответственно типу микроконтроллера) для реализации рассчитанного варианта.

Во второй строке пары выводятся значения максимальной и минимальной скорости передачи информации по шине CAN (если SJW > 0) и положение точки выборки (sample point) битаотносительно начала его передачи в процентах от длительности интервала передачи.

Для некоторых значений BRP результаты расчёта не выводятся. Это означает, что частота следования квантов времени или скорость передачи по шине CAN, вычисленная по формуле (13), оказалась выражена дробным числом. Расчёт в таких случаях не производится.

Программа CANTools, автоматизируя процесс расчёта, не даёт рекомендаций, какие именно сочетания параметров лучше использовать в реальном приложении. Выбрать наилучший вариант из предложенных должен сам разработчик сети, опираясь на имеющиеся знания и опыт. Для тех, кто только начал осваивать CAN, автор может порекомендовать руководствоваться следующим правилом: интервал между началом бита и точкой его выборки должен находиться в пределах от 70 до 85 % длительности бита. Возможно, в реальности придётся практически опробовать несколько вариантов из числа предложенных программой.

Литература

1. Сетевая модель OSI. - <http://ru. wikipedia.org/wiki/Сетевая_модель_OSI>.

2. Controller Area Network. - <http://ru. wikipedia.org/wiki/Controller_Area_Net-work>.

Программу CANTools можно скачать здесь

Автор: А. Абрамович, г. Бикин, Хабаровского края