Хабрахабр

CAN или не CAN? Или зачем мне сеть микроконтроллеров?

Работа, которую надо было сделать, заключалась в дарении второй жизни диспетчерскому щиту. Этот вопрос мне пришлось задать себе лет десять назад или больше. Думаю, не ошибусь, предположив, что щиты стали делать с тех пор, как появились лампочки, поскольку выключатели к тому времени, наверняка, уже были известны. Это такая штука во всю стену, состоящая из лампочек и выключателей с переключателями. А тяга к прекрасному, вообще, пришла к людям из далекой древности.

Но будут ли любители дисплеев в большинстве, зависит от многого, нам неведомого. Сейчас многие предпочтут щитам дисплейные панели. Но сейчас речь не об этом.

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

Видимо, внучки знаменитой лампочки Ильича. Все так и было, куча проводов, уходящих из ящика к выключателям и лампочкам, только лампочки — маленькие.

Стало быть надо все делать заново и по-другому. И вот, помнится, глянул за окно, а там 21-й век. Вместо проводов — проводки. Вместо лампочек — экономичные светодиоды. Вместо одного ящика — много-много маленьких ящичков, контроллеров, стало быть.

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

А производители автомобилей BMW, я уверен, даже ходили к инженерам Bosch в гости. К тому времени я уже знал, что такое CAN и уровень моего уважения к фирме Bosch был много выше, нежели у повара приличного ресторана или аккуратной домохозяйки.

Не скрою, все прелести результатов работы инженеров почувствуешь не сразу, как осилишь два тома стандарта, а значительно позже. Controller Area Network, как сказали бы иностранцы, на мой взгляд, как техническое решение, возникло из желания сделать что-то, наконец, хорошо. Сейчас томов прибавилось, но, может быть, можно сразу начинать с третьего, поскольку, теперь оно называется CAN_FD. Когда пообщаешься с очевидцами, опросишь свидетелей. Однако, позвольте продолжить.

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

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

Витая пара — это не непременное условие, просто удобно сравнивать. CAN можно установить там, где раньше работал RS485 на витой паре. Сходство бросается в глаза, но, давайте лучше остановимся на отличиях. Используя витую пару, по CAN, как и по RS485, можно передать сообщения от управляющего контроллера к подчиненному и получить ответ. Но им бы я посоветовал не огорчаться, а вспомнить закон Ломоносова. Кое-какие из отличий могут нести знак минус для некоторых из читателей.

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

Точнее, это знают все на шине.
Если сообщение исказилось для одного, попытка не засчитывается всеми.
Если сообщение удалось передать в шину, то абонент не получит его лишь при условии, что сломался.
Количество контроллеров на шине не должно превышать 127. Можно получить сообщение и без запроса.
Не надо ждать, когда ответ будет готов, можно спросить в это время еще кого-то.
Подчиненный контроллер тоже может спросить и получить ответ.
Из-за синхронной работы длина шины CAN обратно пропорциональна скорости передачи или типа того.
Максимальная скорость составляет 1 Мбод (10 — на подходе).
То, что сообщение не исказилось при передаче отправляющий знает сразу после последнего бита.

Они состоят из идентификатора, указателя длины в байтах и блока данных, именно с таким количеством байт, как указано. Сообщения ограничены по длине. Идентификатор может быть размером 11 или 29 бит. Есть еще несколько служебных битов, но о них пока помолчим, поскольку сервис должен быть ненавязчивым. Блок данных может содержать от 0 до 8 байт (64 — на подходе).

Если хочется работать на скорости 1Мбод, то длина шины не должна быть больше 35 метров (некоторые предпочитают 40, то есть, погорячее). Для конкретики приведу немного цифр. Кстати, читатель вправе спросить, почему килобод, а не килобит? Если необходимо передать что-то на расстояние до 8 км, то скорость не должна превышать 5 Кбод. Как-то так. Потому, что не все боды становятся битами.

Те, кто во всем видят игру в кубики, сразу вспомнят, что есть такая замечательная вещь, как CANopen и еще много красивых сочетаний и аббревиатур и нечего изобретать велосипед. Как можно распорядиться всеми этими совсем не секретными ингредиентами? Почему бы не сходить в общепит и не взять себе омлет?». Таким мне часто хочется ответить: «Разве не похожа на велосипед та яичница из двух яиц, которую многие готовят себе на завтрак? Но я лучше промолчу и продолжу, не отвлекаясь на выкрики из зала.

Одни его стали использовать, чтобы запихнуть туда название (номер) нужного вида данных. В те времена, когда 29 битовый идентификатора еще не успели придумать, существовал только 11 битовый. И то и другое имело смысл. Другие использовали как адрес контроллера, к которому обращаются. Например, можно спросить так:

  • А подай-ка нам, милейший, шато тринадцатого года в литровой бумажной упаковке.

Или так:

  • Заверните мне, пожалуйста, то, что спрятано у вас на самой нижней полке справа.
    Кстати, в CAN может сработать и такая конструкция:
    -Всем лежать! А ты быстро складывай все с полок мне в сумку.
    Но этой конструкцией часто не попользуешься, поскольку после придется какое-то время ждать.
    Ждать пока все ответы не выстроятся один за другим и не поступят в распоряжение запрашивающего контроллера. Мы уже ушли от кино, если что.
    Меня в моем случае устроил бы вариант идентификатора в качестве адреса. Из 11 бит требовалось 7 и еще 4 оставалось на то, чтобы сделать одни сообщения более срочными по сравнению с другими, а также пометить часть контроллеров как главные.
    Некоторое неудобство перекочевало сюда из RS485, а именно, адреса надо было устанавливать вручную на каждом контроллере. Затем проверять и переустанавливать. И, возможно, вернуться к предыдущему шагу и повторить.
    К счастью, к тому времени уже существовали два обстоятельства.

А второе то, что многие производители микроконтроллеров стали считать хорошим тоном условие, чтобы каждый чип имел свой уникальный и довольно длинный номер. Первое — уже появился 29 битный идентификатор.

Еще 5 оставалось, для заботы о том, чтобы поезда различались срочностью, направлением (туда, обратно), наличием вагона-ресторана и вагонов с повышенным комфортом. Теперь в длинном идентификаторе можно было 24 бита смело отвести для уникального адреса.

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

Уникальный номер чипа, как правило, занимает количество битов значительно превышающее 24, например, 96 у STM32FXXX. Еще немного про адресацию. Я выбрал операцию XOR. Поэтому необходимо как-то получить 24 из 96. Это совпадения адресов после редуцирования. Вы можете выбрать что-то другое, но небольшая проблема останется.

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

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

Если эти два числа совпадают, значит все в порядке. Теперь останется подсчитать сколько получено ответов и сколько их должно быть. А если ответов больше, нежели контроллеров, то надо подумать о диссертации, поскольку, вы — на пороге открытия. Если ответов меньше чем контроллеров, то налицо совпадение адресов и наладчикам есть работа.

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

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

Вернемся к кодированию идентификатора.

Адрес со значением 0x000000 является широковещательным для расширенного идентификатора. Для целей адресации в расширенном идентификаторе отведено 24 бита, а в стандартном – шесть. Пять начальных (старших) битов в длинном и коротком идентификаторе, называются заголовком, влияют на смысл сообщения и обозначаются буквами NVADR: Для стандартного идентификатора нулевой адрес (6 его бит) также считается широковещательным.

В первом проекте со щитом (или на щите, как правильно?) использовались чипы Cortex от NXP, а в следующих проектах (были и такие) уже применялись M0 от STMicroelectronics. Конечно, для диспетчерского щита потребовалось реализовать только часть этой схемы.

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

Например, запрос с нулевой длиной хорошо помогает при отладке, как уже упоминалось выше. Теперь, немного о том, что добавляется, если по-разному трактовать сообщения с различной длиной данных. Запрос с длиной 4 делает то же самое, но предназначен для агента-шлюза, который обслуживает CAN шину второго уровня. Запрос с длиной 3 обслуживает пространство байтовых переменных размером 16384. Эта шина может состоять из одного-двух агентов, зато удаленных на пару километров.

Два бита используются не для адресации. Запрос с длиной 5 и 6, аналогично, предназначены для пространства двухбайтовых переменных размером 4194304. Другой сигнализирует об ошибке. Один бит управляет записью-чтением.

Их тоже 4194304. Далее 7 и 8 обслуживают четырех байтовые слова.

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

На питание идут сдвоенные. Соединяются контроллеры плоским шлейфом на 6 жил. Микросхема о двадцати ногах — это STM32F042.

С обратной стороны присутствует MAX3051, формирователь CAN в корпусе SOT23-8.
Ну вот, мама кушать зовет.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть