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

Рис. 1. Топология сети CAN.
CAN контроллеры соединяются с помощью дифференциальной шины, которая имеет две линии — CAN_H (can-high) и CAN_L (can-low), по которым передаются сигналы. Логический ноль регистрируется, когда на линии CAN_H сигнал выше, чем на линии CAN_L. Логическая единица — в случае когда сигналы CAN_H и CAN_L одинаковы (отличаются менее чем на 0.5 В). Использование такой дифференциальной схемы передачи делает возможным работу CAN сети в очень сложных внешних условиях. Логический ноль — называется доминантным битом, а логическая единица — рецессивным. Эти названия отражают приоритет логической единицы и нуля на шине CAN. При одновременной передаче в шину лог. нуля и единицы, на шине будет зарегестрирован только логический ноль (доминантный сигнал), а логическая единица будет подавлена (рецессивный сигнал).
Типы сообщений сети CAN.
Данные в CAN передаются короткими сообщениями-кадрами стандартного формата. В CAN существуют четыре типа сообщений:
- Data Frame
- Remote Frame
- Error Frame
- Overload Frame
Data Frame — это наиболее часто используемый тип сообщения. Он состоит из следующих основных частей:
- поле арбитража (arbitration field) определяет приоритет сообщения в случае, когда два или более узлов одновременно пытаются передать данные в сеть. Поле арбитража состоит в свою очередь из:
- для стандарта CAN-2.0A, 11-битного идентификатора + 1 бит RTR (retransmit)
- для стандарта CAN-2.0B, 29-битного идентификатора + 1 бит RTR (retransmit)
Следует отметить, что поле идентификатора, несмотря на свое название никак не идентифицирует само по себе ни узел в сети, ни содержимое поля данных. Для Data кадра бит RTR всегда выставлен в логический ноль (доминантный сигнал).

Рис. 2. Data frame стандарта CAN 2.0A.
Remote Frame — это Data Frame без поля данных и с выставленным битом RTR (1 — рецессивные бит). Основное предназначение Remote кадра — это инициация одним из узлов сети передачи в сеть данных другим узлом. Такая схема позволяет уменьшить суммарный трафик сети. Однако, на практике Remote Frame сейчас используется редко (например, в DeviceNet Remote Frame вовсе не используется).
Error Frame — это сообщение которое явно нарушает формат солобщения CAN. Передача такого сообщения приводит к тому, что все узлы сети регистрируют ошибку формата CAN-кадра, и в свою очередь автоматически передают в сеть Error Frame. Результатом этого процесса является автоматическая повторная передача данных в сеть передающим узлом. Error Frame состоит из поля Error Flag, которое состоит из 6 бит одинакового значения (и таким образом Error frame нарушает проверку Bit Stuffing, см. ниже), и поля Error Delimiter, состоящее из 8 рецессивных битов. Error Delimiter дает возможность другим узлам сети обнаружив Error Frame послать в сеть свой Error Flag.
Overload Frame — повторяет структуру и логику работы Error кадра, с той разницей, что он используется перегруженным узлом, который в данный момент не может обработать поступающее сообщение, и поэтому просит при помощи Overload-кадра о повторной передаче данных. В настоящее время Overload-кадр практически не используется.
Контроль доступа к среде передачи (побитовый арбитраж).
Поле арбитража CAN-кадра используется в CAN для разрешения коллизий доступа к шине методом не деструктивного арбитража. Суть метода не деструктивного арбитража заключается в следующем. В случае, когда несколько контроллеров начинают одновременную передачу CAN кадра в сеть, каждый из них сравнивает, бит, который собирается передать на шину с битом, который пытается передать на шину конкурирующий контроллер. Если значения этих битов равны, оба контроллера передают следующий бит. И так происходит до тех пор, пока значения передаваемых битов не окажутся различными. Теперь контроллер, который передавал логический ноль (более приоритетный сигнал) будет продолжать передачу, а другой (другие) контроллер прервёт свою передачу до того времени, пока шина вновь не освободится. Конечно, если шина в данный момент занята, то контроллер не начнет передачу до момента её освобождения.

Рис. 3. Побитовый арбитраж на шине CAN.
Методы обнаружения ошибок.
CAN протокол определяет пять способов обнаружения ошибок в сети:
- Bit monitoring
- Bit stuffing
- Frame check
- ACKnowledgement Check
- CRC Check
Bit monitoring — каждый узел во время передачи битов в сеть сравнивает значение передаваемого им бита со значением бита которое появляется на шине. Если эти значения не совпадают, то узел генерирует ошибку Bit Error. Естественно, что во время арбитража на шине (передача поля арбитража в шину) этот механизм проверки ошибок отключается.
Bit stuffing — когда узел передает последовательно в шину 5 бит с одинаковым значением, то он добавляет шестой бит с противоположным значением. Принимающие узлы этот дополнительный бит удаляют. Если узел обнаруживает на шине больше 5 последовательных бит с одинаковым значением, то он генерирует ошибку Stuff Error.
Frame Check — некоторые части CAN-сообщения имеют одинаковое значение во всех типах сообщений. Т.е. протокол CAN точно определяет какие уровни напряжения и когда должны появляться на шине. Если формат сообщений нарушается, то узлы генерируют ошибку Form Error.
ACKnowledgement Check — каждый узел получив правильное сообщение по сети посылает в сеть доминантный (0) бит. Если же этого не происходит, то передающий узел регистрирует ошибку Acknowledgement Error.
CRC Check — каждое сообщение CAN содержит CRC сумму, и каждый принимающий узел подсчитывает значение CRC для каждого полученного сообщения. Если подсчитанное значение CRC суммы, не совпадает со значением CRC в теле сообщения, принимающий узел генерирует ошибку CRC Error.
Механизм ограничения ошибок (Error confinement).
Каждый узел сети CAN, во время работы пытается обнаружить одну из пяти возможных ошибок. Если ошибка обнаружена, узел передает в сеть Error Frame, разрушая тем самым весь текущий трафик сети (передачу и прием текущего сообщения). Все остальные узлы обнаруживают Error Frame и принимают соответствующие действия (сбрасывают принятое сообщение). Кроме того, каждый узел ведет два счетчика ошибок: Transmit Error Counter (счетчик ошибок передачи) и Receive Error Counter (счетчик ошибок приема). Эти счетчики увеличиваются или уменьшаются в соответствие с несколькими правилами. Сами правила управления счетчиками ошибок достаточно сложны, но сводятся к простому принципу, ошибка передачи приводит к увеличению Transmit Error счетчика на 8, ошибка приема увеличивает счетчик Receive Error на 1, любая корректная передача/прием сообщения уменшают соответствующий счетчик на 1. Эти правила приводят к тому, что счетчик ошибок передачи передающего узла увеличивается быстрее, чем счетчик ошибок приема принимающих узлов. Это правило соответствует предположению о большой вероятности того, что источником ошибок является передающий узел.
Каждый узел CAN сети может находится в одном из трех состояний. Когда узел стартует он находится в состоянии Error Active. Когда, значение хотя бы одного из двух счетчиков ошибок превышает предел 127, узел переходит в состояние Error Passive. Когда значение хотя бы одного из двух счетчиков превышает предел 255, узел переходит в состояние Bus Off.
Узел находящийся в состоянии Error Active в случае обнаружения ошибки на шине передает в сеть Active Error Flags. Active Error Flags сотстоит из 6 доминантных бит, поэтому все узлы его регистрируют. Узел в состоянии Passive Error передает в сеть Passive Error Flags при обнаружении ошибки в сети. Passive Error Flags состоит из 6 рецессивных бит, поэтому остальные узлы сети его не замечают, и Passive Error Flags лишь приводит к увеличению Error счетчика узла. Узел в состоянии Bus Off ничего не передает в сеть (не только Error кадры, но вообще никакие другие).
Адресация и протоколы высокого уровня
В CAN не существует явной адресации сообщений и узлов. Протокол CAN нигде не указывает что поле арбитража (Identification field + RTR) должно использоваться как идентификатор сообщения или узла. Таким образом, идентификаторы сообщений и адреса узлов могут находится в любом поле сообщения (в поле арбитража или в поле данных, или присутствовать и там, и там). Точно также протокол не запрещает использовать поле арбитража для передачи данных.
Утилизация поля арбитража и поля данных, и распределение адресов узлов, идентификаторов сообщений и приоритетов в сети является предметом рассмотрений так называемых протоколов высокого уровня (HLP — Higher Layer Protocols). Название HLP отражает тот факт, что протокол CAN описывает только два нижних уровня эталонной сетевой модели ISO/OSI, а остальные уровни описываются протоколами HLP.

Рис. 4. Логическая структура протокола CAN.
Существует множество таких высокоуровневых протоколов. Наиболее распространенные из них это:
- DeviceNet
- CAL/CANopen
- SDS
- CanKingdom
Физичекий уровень протокола CAN
Физический уровень (Physical Layer) протокола CAN определяет сопротивление кабеля, уровень электрических сигналов в сети и т.п. Существует несколько физических уровней протокола CAN (ISO 11898, ISO 11519, SAE J2411).
В подавляющем большинстве случаев используется физический уровень CAN определенный в стандарте ISO 11898. ISO 11898 в качестве среды передачи определяет двухпроводную дифференциальную линию с импедансом (терминаторы) 120 Ом (допускается колебание импеданса в пределах от 108 Ом до 132 Ом. Физический уровень CAN реализован в специальных чипах — CAN приемо-передатчиках (transceivers), которые преобразуют обычные TTL уровни сигналов используемых CAN-контроллерами в уровни сигналов на шине CAN. Наиболее распространенный CAN приемо-передатчик — Phillips 82C250, который полностью соответствует стандарту ISO 11898.
Махимальная скорость сети CAN в соответствие с протоколом равна 1 Mbit/sec. При скорости в 1 Mbit/sec максимальная длина кабеля равна примерно 40 метрам. Ограничение на длину кабеля связано с конечной скоростью света и механизмом побитового арбитража (во время арбитража все узлы сети должны получать текущий бит передачи одновременно, те сигнал должен успеть распространится по всему кабелю за единичный отсчет времени в сети. Соотношение между скоростью передачи и максимальной длиной кабеля приведено в таблице:
скорость передачи максимальная длина сети 1000 Кбит/сек 40 метров 500 Кбит/сек 100 метров 250 Кбит/сек 200 метров 125 Кбит/сек 500 метров 10 Кбит/сек 6 километров Разъемы для сети CAN до сих пор НЕ СТАНДАРТИЗОВАНЫ. Каждый протокол высокого уровня обычно определяет свой тип разъемов для CAN-сети.
CAN – шина, CAN – интерфейс
В данной статье не будем полностью расписывать CAN протокол, а обратим внимание лишь на вещи, которые надо обязательно знать и понимать для использования или разработки электронных устройств с поддержкой CAN.
Протокол CAN был разработан для автомобильной промышленности и впоследствии стал стандартом в области создания бортовых сетей автомобилей, железнодорожного транспорта и т.д. CAN позволяет создавать сети с развитыми средствами контроля ошибок, скоростью передачи до 1Мбит/с и пакетами содержащими не более восьми байтов данных.
Канальный и физический уровни CAN
В протоколе CAN нет строгого определения физического уровня, поэтому для передачи сообщений может использоваться, например, витая пара или оптоволокно. По сути дела CAN реализует канальный уровень, т.е. осуществляет формирование пакетов сообщений, ограничение распространения ошибок, подтверждение приема и арбитража. Есть конечно и распространенные стандарты прикладного уровня например CANopen, но если нет необходимости обеспечивать взаимодействие между оборудованием различных производителей, то лучше использовать внутренний протокол.
Структура узла сети CAN
Рассматриваемый нами узел сети CAN состоит из микроконтроллера, CAN контроллера и приемопередатчика (рисунок 1). Чаще всего мы используем микроконтроллеры с встроенным CAN контроллером для упрощения схемы, но иногда используется автономный контроллер CAN с интерфейсом SPI (MCP2510). Далее приемопередатчик подключается к витой паре, на концах которой размещены согласующие резисторы (терминатор) с сопротивлением 120 Ом.

Рисунок 1 – Узел сети CAN
Для формирования логической единицы в витой паре, или свободной шине, на оба провода подается напряжение, равное половине разности напряжения между 0 или Vcc. Логическому нулю соответствует подача на провода линии дифференциального напряжения (рисунок 2).

Рисунок 2 – Логические уровни на CAN-шине
Шина CAN позволяет передавать данные со скоростью 1 Мбит/c при длине кабеля не более 40 м. В обучающей литературе написано, что при снижении скорости передачи до 10кбит/с можно добиться длины сети в 1.5км.
Пакет сообщения CAN
Формат сообщения CAN показан на рисунке 3.

Рисунок 3 – Пакет сообщения CAN
По факту пакет сообщения формируется CAN контроллером, а прикладное ПО только устанавливает идентификатор сообщения, длину сообщения и предоставляет байты данных, поэтому полностью рассматривать пакет не будем, а посмотрим на данные которые мы изменяем при работе с CAN шиной.
Идентификатор (11 – битный )
Или идентификатор (29 – битный)
от 0 до 8 байт данных в пакете
Идентификатор сообщения используется для идентификации данных, отправленных в этом пакете. Каждое отправленное сообщение принимается всеми узлами сети и в данном случае идентификатор позволяет понять конкретному устройству, необходимо ли обрабатывать данное сообщение. Максимальная длина сообщения 8 байт, но можно уменьшить это значение для сохранения пропускной способности шины CAN. Для примера ниже по тексту есть несколько скриншотов CAN сообщений из автомобильной сети.
Арбитраж на шине CAN
Если без подробностей, то первым по шине CAN всегда передается сообщение с наименьшим идентификатором.
Настройка скорости передачи данных по шине CAN
Скорость передачи данных по CAN шине настраивается за счет формирования квантов времени, а не как во многих других протоколах последовательной передачи данных за счет делителя скорости. В большинстве случаев используются скорости 10Кбит/c, 20Кбит/c, 50Кбит/c, 100Кбит/c, 125Кбит/c, 500Кбит/c, 800Кбит/c, 1MBaud и настройки для этих скоростей уже посчитаны. На рисунке 4 изображено окно выбора скорости в программе PcanView.

Рисунок 4 – Выбор скорости передачи данных в программе PcanView
Как мы видим при установке стандартной скорости настройки проставляются автоматически, но бывают случаи когда необходимо использовать другую скорость передачи данных. Например бортовой CAN автомобиля может работать со скоростью 83Кбит/c. В этом случае придется провести расчет настроек самостоятельно или поискать специализированный калькулятор скорости в интернете. Для самостоятельного расчета скорости необходимо понимать, что для передачи одного бита сообщения используется несколько квантов, а интервал передачи состоит из трех сегментов (рисунок 5).

Рисунок 5 – Время передачи одного бита
Первый сегмент всегда фиксирован и равняется одному кванту. Далее идет два сегмента Tseg1 и Tseg2 и количество квантов в каждом сегменте определяется пользователем и может быть равно от 8 до 25. Точка выборки находится между Tseg1 и Tseg2, т.е. в конце первого и в начале второго сегмента. Так же пользователь может определить ширину скачка синхронизации (Synchronization Jump Width — SJW) для подстройки битовой скорости принимающего устройства, который может быть в диапазоне 1 – 4 квантов времени.
Теперь приведем формулу расчета скорости (Пример расчета скорости для CAN контроллера SJA1000):
BTR = Pclk/(BRP * (1 + Tseg1 + Tseg2))
BTR – скорость передачи данных,
Pclk – частота работы CAN контроллера,
BRP – значение предделителя частоты генератора скорости передачи
Tseg1 – первый сегмент
Tseg2 – Второй сегмент
Для проверки возьмем уже посчитанную скорость 125Кбит/c и попробуем получить настройки вручную. Pclk возьмем 16 МГц.
BRP = 16МГц /(125K * (1 + Tseg1 + Tseg2))
Затем подбираем интервал передачи бита находящийся в диапазоне от 8 до 25 квантов времени, так что бы получилось целое значение BRP. В нашем случае если взять (1 + Tseg1 + Tseg2) = 16, то BRP будет равен 30.
Далее нужно подобрать соотношение между Tseg1 и Tseg2, которое даст нам желаемое положение точки выборки (Sample Point – SP).
SP = ((1 + Tseg1 + Tseg2) * 70)/100
Подставляем значения и получаем 16 * 0.7 = 11.2, что соответствует соотношению Tseg1 = 10, Tseg2 = 5, т.е. 1 + 10 + 5 = 16. Далее смотрим если Tseg2 >= 5, то SJW = 4, если Tseg2 < 5, то SJW = (Tseg2 – 1). В нашем случае SJW = 4.
Итого для получения скорости 125Кбит/c необходимо в параметрах указать, BRP = 30, Tseg1 = 10, Tseg2 = 5, SJW = 4.
P.S. Конфигурирование baud rate значительно отличается между старыми модулями USB-CANmodul (GW-001 и GW-002) с контроллером SJA1000 и новыми модулями sysWORXX с контроллером AT91SAM7A3. В статье описывающей работу с бортовым CAN автомобиля на скорости 83кбит/c приведен расчет скорости для контроллера AT91SAM7A3.
Пример получения и передачи данных по CAN-интерфейсу
В примере будем использовать CAN-адаптер с программой PcanView от SYSTEC и подключимся к салонному CAN автомобиля, работающему со скоростью 125Кбит/с. Рассматриваемый нами автомобиль оснащен креслами с электроприводом и поэтому исследуем данные отвечающие за положение кресел и постараемся изменить положение спинки подменив пакет с помощью компьютера .
Для начала на схеме автомобиля находим наиболее удобно расположенный разъем с линиями CANH и CANL и подключаем к нему наш адаптер. Если разъем и провода найти не получилось, то можно подлезть к блоку управления кресла, найти там два скрученных между собой провода и аккуратно надрезав провода подключить адаптер. Если после подключения и настройки адаптера сообщения не приходят, то в первую очередь попробуйте поменять между собой CANH CANL и проверить включено ли зажигание.
Далее запускаем программу PcanView, в открывшемся окне настроек устанавливаем Baudrate = 125Кбит/c и нажимаем ОК (рисунок 4). В следующем окне устанавливаем Message filter = Standard, диапазон адресов от 000 до 7FF и нажимаем ОК (рисунок 6).Рисунок 6 – Настройка CAN фильтра
Если все сделано правильно, то мы увидим сообщения от кресел (рисунок 7), а при нажатии кнопки наклона спинки на пульте управления мы увидим еще одно сообщение с адресом 1F4 идущее от пульта к креслу (рисунок 8).
Рисунок 7 – CAN сообщения от кресла с электроприводом
Рисунок 8 – CAN сообщения от кресла с электроприводом и сообщение от пульта управления к креслу
Теперь мы знаем какие должны быть адрес, длина и данные в CAN пакете для имитации нажатия кнопки изменения положения спинки. Во вкладке Transmit нажимаем NEW и в открывшемся окне создаем копию пакета 1F4, т.е. Length = 3, Data = 40 80 00. Period можно оставить 0 ms, тогда сообщения будут отправляться по факту нажатия кнопки пробел (рисунок 9).

Рисунок 9 – Создание CAN сообщения
На рисунке 10 отображено поле Transmit главного окна содержащее все отправляемые сообщения в CAN и информацию о них. При выделении сообщения и нажатии кнопки пробел произойдет отправка пакета в CAN сеть и кресло немного сдвинется в нужном направлении.
Рисунок 10 – Поле Transmit
Понятное дело, что добиться полноценного управления креслом в таком случае не получиться, т.к. мы не можем исключить из сети пакеты заводского пульта управления, но эта проблема вполне решаема.
Итог
Мы увидели как при определенных усилиях и навыках можно создавать собственные электронные системы с использованием высокотехнологичного протокола CAN и как можно подключаться, исследовать и управлять устройствами подключенными к автомобильной CAN шине.
Что такое CAN-шина
Усложнение автомобильного электрооборудование привело к логичному решению – внедрению единой линии, к которой подсоединены электронные устройства. Но не все так просто, как кажется! Давайте подробнее разберемся, что такое CAN-шина.
CAN-шина не имеет никакого отношения к автомобильным покрышкам. Дело в том, что в электронике «шиной» называют систему, по которой передаются данные. Это своего рода река с ручейками, если говорить проще. Что касается аббревиатуры, расшифровывающейся как Controller Area Network (сеть контроллеров), то за ней стоит стандарт промышленной сети для объединения в единую сеть различных исполнительных устройств и датчиков.
Немного истории
За создание CAN-шины следует благодарить компанию Robert Bosch GmbH, которая в середине восьмидесятые предложила стандарт микроконтроллерной связи, таким образом упростив жизнь специалистам по автомобильной электронике, инженерам, занятым в промышленной автоматизации, и разработчикам во многих других областях. В настоящее время Controller Area Network является стандартом в автомобилестроение.
Необходимость в появлении CAN-шины очевидна – по мере совершенствования и развития конструкции, усложнялись и бортовые сети автомобилей. Недра машин пронизывали сотни метров проводов и со временем инженеры пришли к логичному и оптимальному решению внедрить «магистраль», к которой будут подключены разные устройства, которые соединены параллельно.
Принцип работы CAN-шины
CAN-шина, будучи системой цифровой связи и управления электронными устройствами, позволяет осуществлять обмен информацией между блоками управления. Сеть имеет три основных режима работы – активный при включенном зажигании, спящий при выключенном зажигании и, наконец, режим пробуждения и засыпания, когда зажигание включают и выключают. CAN-шина выполняет ряд задач, среди которых ускорение передачи сигналов к разным системам, механизмам и устройствам, уменьшение количества проводов, упрощение подсоединения и работы дополнительных устройств.
Виды CAN-шин
Существует три основных вида. Силовые обеспечивают синхронизацию и обмен данными между ЭБУ двигателя и основными агрегатами и системами автомобиля – коробкой передач, зажиганием и другими. «Комфортные» нужны, соответственно, для работы опций комфорта. Например, климатической системы, электропривода зеркал и обогрева сидений.
Информационно-командные введены для обмена данными между ЭБУ и такими вспомогательными информационными комплексами как навигационная система.
Как передается информация
Итак, CAN-шина представляет собой сеть, по которой происходит обмен информацией между устройствами. На практике это означает следующее. Возьмем для примера блок управления двигателем – он имеет не только основной микроконтроллер, но и CAN-устройство, которое формирует и рассылает импульсы по шинам H (CAN-высокий) и L (CAN-низкий), которые называются витая пара.
Сигналы рассылаются по витой паре трансивером или приемопередатчиком. Он нужен для целого ряда задач – усиления сигналов, защиты линии в случае повреждения CAN-шины, создания условий помехозащищенности передаваемых импульсов и регулировки скорости их передачи. В автомобильной промышленности применяются передатчики двух типов с говорящими названиями High Speed и Fault Tolerant. Первый обеспечивает передачу данных на высокой скорости, до 1 мегабита в секунду. Второй не столь быстрый и передает в секунду до 120 килобит в секунду, но при этом он толерантен к ошибкам, то есть, допускает отклонение от параметров CAN-шины и не столь чувствителен к ее качеству.
Сфера влияния CAN-шины
Благодаря цифровой сети в современных автомобилях обеспечивается работоспособность разных агрегатов и систем. Вот некоторые из них: • Силовой агрегат (двигатель и коробка передач) • ABS (антиблокировочная система тормозов) • Подушки безопасности • Рулевой механизм • Датчики давления в колесах • Топливный насос высокого давления • Блоки парковочных датчиков и блокировки дверей • Блок управления стеклоочистителями • Мультимедийные модули
Сильные и слабые стороны CAN-шины
У данной системы, как и у любой другой, есть плюсы и минусы. Вот некоторые преимущества – скорость передачи сообщений и автоматическое распределение скорости трансляции, исходя из приоритетности узлов, простота канала обмена информацией, высокая совместимость с диагностическими устройствами и, соответственно, возможность быстрой диагностики. Кроме того, CAN-шина обеспечивает простоту установки противоугонной системы.
Что касается недостатков, то к ним можно отнести увеличение времени отклика при повышенной нагрузке на канал, что может встречаться у машин с многочисленными электронными устройствами. Кроме того, поломка одного из электронных управляющих блока может вывести из строя всю шину.
Проблемы с CAN-шиной и их устранение
Система для передачи данных, будучи включенной в сложную «анатомию» современных автомобилей задействована во многочисленных процессах, а, потому, ее неисправности хорошо заметны. О проблемах с CAN-шиной подскажут такие проявления как синхронно горящая индикация на панели приборов, скажем, Check Engine и ABS. Кроме того, отсутствие показания уровня топлива, «молчание» спидометра и тахометра. Удостовериться в проблемах именно с CAN-шиной можно посредством диагностики. Если она подтвердила проблемы именно с сетью, то требуется следующая последовательность действий. Найдите проводники витой пары, обычно имеющие черный и оранжево-коричневый цвет для высокого и низкого уровня соответственно. Включив зажигание, измерьте напряжение на проводниках – обычно это 4,5 В. Значения должны не находиться на нуле или превышать 11 Вольт. Затем выключите зажигание, снимите клемму с аккумулятора и повторите процедуру. Цифра на мультиметре стремится к нулю или к бесконечности? Значит, присутствует короткое зажигание или обрыв соответственно. Удостовериться, что проблема не вызвана неисправностью одного из управляющих блоков, вы можете, отключая их и отслеживая сопротивление в CAN-шине.
CAN шина

Одним из популярных сетевых интерфейсов в промышленности является Controller Area Network. Его специально придумали в BOSCH, чтобы плодить сети из контроллеров. Особенно он прижился в автопроме, где часто по автомобилю идет одна CAN шина и все на нее повешано. Причем сам стандарт не подразумевает физическую реализацию протокола. Она может быть по витой паре, оптике, радиоканалу. На чем угодно. Лишь бы можно было реализовать систему из рецессивного и доминантного бита. Т.е. два состояния одно из которых всегда подавляет другое.
Например, оптоволокно, в которое светят передатчики. Доминантное состояние это свет. Потому, что мы не можем включить темноту. Если будет хоть один передатчик светить, то светло будет всем. Если же брать проводную линию, то в линии с подтяжкой и схемой включения «монтажное И» будет доминантным состоянием низкий уровень. Т.к. если хоть кто-то подтянет линию к земле, то никто ее поднять не сможет.
▌Арбитраж
В CAN шине нет ни ведущих, ни ведомых. Все могут галдеть одновременно и обращаться кто к кому хочет. Чтобы не было коллизий существует механизм аппаратного арбитража. Основанный как раз на том самом доминантном и рецессивном состоянии. Т.е. когда два передатчика начинают вещать одновременно они выкатывают на шину бит и смотрят, не перебил ли его кто-то доминантным состоянием.Например, доминантное состояние это 0.
Передатчик 1: 101101010…
Передатчик 2: 10111хВторой передатчик, на пятом бите попытался выставить на шину 1, а первый в это время выкатил 0. 0 бьёт единицу. Поэтому второй передатчик затыкается и ждет когда шина освободится.
Это приводит к тому, что не теряется пропускная способность шины. Но с другой стороны, требует вдумчивого составления пакета данных. Так, чтобы более приоритетные данные имели больше доминантных бит в начале посылки. Чтобы чаще выигрывать арбитраж.
▌Адресация
Данные по шине летают в виде стандартных кадров, в несколько байт. Где есть различные служебные данные и, собственно, передаваемая информация. У каждого кадра в CAN шине есть идентификатор, адрес кому этот кадр предназначен. Причем это не адрес физического устройства как такового. А просто идентификатор. Все кадры принимаются всеми. Но дальше, уже внутри принявшего устройства, кадр фильтруется по нужным идентификаторам и софт уже сам решает что обрабатывать, а что отбрасывать. Адресация может быть от 11 или 29 бит, в зависимости от формата кадра (расширенный и стандартный).
А раз так, то на шине может быть очень много разных адресов под кучу применений. Например, в контроллере можно каждому выводу GPIO присвоить свой ID и спрашивать сразу его. Без посылки дополнительных уточнений на тему кому куда.▌Контроль ошибок и сбоев
CAN шина славится своей надежностью. Если данные приняты, то они, вероятней всего, корректны с огромной долей вероятности. На это работает куча механизмов.1. При передаче идет контроль того, что на самом деле выставилось на линии. Это происходит всегда, т.к. именно таким образом работает механизм арбитража.
2. Дополняющие биты (bit stuffing): после передачи пяти одинаковых битов подряд автоматически передаётся бит противоположного значения. Таким образом кодируются все поля кадров данных или запроса, кроме служебных разграничителей кадра.
3. Контрольная сумма кадра. Передатчик вычисляет ее и добавляет в передаваемый кадр данных. А приемник на лету считает контрольную сумму и если она совпала, то он дает доминантный бит ACK в в специально заготовленное место кадра, в конце, перед финальным битом окончания кадра.▌Дальнобойность
Дальность передачи зависит, в первую очередь, от реализации физического уровня интерфейса. Если это оптика, то тут могут быть огромные расстояния. А для обычной витой пары, что более распространено, все зависит от скорости передачи. Для самой быстрой, в 1 мегабит, это может быть около 50 метров. Если же скорость понижать, то на 10кбитах можно бросить и на 5км. Защита линии подобна RS485 и им подобным. Т.е. экранирование, разрядники, супрессоры.▌Аппаратная реализация
Ну точнее одна из. Физика процесса может быть разной. Я видел, например, на оптике. Но это все же редкость. Обычно витая пара.Часто встречается CAN интерфейс в разных микроконтроллерах, например в STM32F103 он входит в стандартный набор периферии. Но это только логический уровень. Тот что отвечает за работу всех этих фильтров, арбитражей, контрольных сумм. Аппаратно же нужна микросхема трансивер.
Типичные представители это:
- MCP2551. Напряжение питания 5 вольт. По входу CAN держит до +/-45 вольт. Имет выход опорного напряжения и токовый вход управления режимом работы передатчика.
- TJA1050 или A1050. Напряжение питания 5 вольт. По входу CAN держит до +40/-27 вольт. Имет выход опорного напряжения и вход перехода в тихий режим, когда трансивер только слушает линию, но никак на нее не влияет.
- SN65HVD230. Напряжение питания 3.3 вольт. По входу CAN держит +/-25 вольт. Дополнительных выводов не имеет
Имеют почти одинаковую распиновку, почти совместимую друг с другом. Разница заключается в двух свободных выводах, которые не обязательно использовать, но они имеют разную функцию у разных трансиверов. Я когда делаю устройство, то стараюсь заложить максимально возможное количество вариантов компонентов. Чтобы не попасть в ситуацию когда нужного трансивера нет, либо он стоит каких то невменяемых денег.

В качестве быстрого решения популярны трансиверы на TJA1050 которые за копейки продают на Али в виде модулей готовых. Правда у этого трансивера есть один прикол, он почему то не работает на низких скоростях. От 60kbaud и выше. От чего я выкинул парочку таких модулей, т.к. сначала заводил шину на низких скоростях, чтобы логический анализатор меньше тупил. И получил прикол, что один трансивер работает (он был MCP2551), а второй нет. Потом только в даташите, буквально случайно, увидел эту особенность.

Сеть выглядит следующим образом.
Обратите внимание на тип подключения к шине. Шлейфом. Без ответвлений. На высоких скоростях это может быть критичным. Отражения сигнала меньше. На малых скоростях можно и ответвления делать, но не желательно. Для других дифференциальных шин (вроде RS485) это тоже справедливо. На начальном и конечном устройстве должны стоять терминирующие резисторы на 120 ом.
Обратите внимание на обозначение выводов трансивера. Тут надо внимательно смотреть в устройство самого трансивера:

По нему видно, что RxD трансивера это ВЫХОД, т.е. он назван так потому, что идет на RxD контроллера. А TxD это, соответственно, вход. Идет с выхода TxD контроллера. Не перекрестите по привычке 🙂 Я так когда то с этой путаницей всаживал одно на другое, а потом дорожки приходилось резать и крест накрест сигнал посылать.
Еще важный момент. Видите, что тут, в отличии от ADM485 нет запрета работы входа при работе выхода. Т.е. все что попадает на выход дублируется эхом на вход одновременно. Собственно это нужно для арбитража.
▌Гальваническая развязка
Делается аналогично RS232 или RS485. Ставится какой нибудь оптопара H11L1 или что-то более удобное, двуканальное, вроде ISO7321/ADUM1201
Также есть изолированные трансиверы, вроде TJA1052i, но цена их кусается. Гораздо дешевле взять сборку на H11L1 или ADUM1201

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

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
8 thoughts on “CAN шина”
Всегда вопрос интересовал зачем на микросхемах физики CAN делают выход опорного напряжения. Негде его применения не видел в контексте CAN, в даташите вроде то же нечего особо не описано просто есть и всё.