начало — www.drive2.ru/b/2602560/
Двухпроводной последовательный интерфейс TWI / I2C
Двухпроводной последовательный интерфейс TWI (Two-wire Serial Interface) является полным аналогом базовой версии интерфейса I2C (двухпроводная двунаправленная шина) фирмы Philips. Этот интерфейс позволяет объединить вместе до 128 различных устройств с помощью двунаправленной шины, состоящей из линии тактового сигнала (SCL) и линии данных (SDA).
Двухпроводной интерфейс (TWI) — двунаправленная двухпроводная последовательная шина передачи данных, совместимая со стандартными шинами I2C и SMBus.
Устройство, подключенное к шине, должно быть либо ведущим, либо подчиненным. Ведущее устройство инициирует передачу данных путем передачи адреса подчиненного устройства и типа передачи: чтение или запись. Если к шине подключено несколько ведущих устройств и некоторая их часть одновременно инициировала передачу, применяется механизм арбитража, который учитывает приоритет этих устройств.
Модуль TWI микроконтроллеров может работать и в роли ведущего, и в роли подчиненного устройства. Ведущая и подчиненная работа полностью отделены друг от друга и предусматривают отдельное управление включением/отключением. Для этих функций также предусмотрены отдельные регистры управления и статуса, а также векторы прерываний. Потеря арбитража, ошибки, коллизии и удержание линии синхронизации обнаруживаются на аппаратном уровне и индицируются отдельными флагами статуса для ведущего и подчиненного режимов.
Ведущий модуль содержит программируемый генератор скорости связи. Даже при синхронизации системы низкими частотами, поддерживается возможность работы шины на частоте 100 и 400 кГц. При необходимости автоматического выполнения операций и снижения сложности программы могут быть разрешены команды QUICK и режим SMART.
В подчиненном модуле на аппаратном уровне реализована возможность распознавания 7-битного адреса и адреса общего вызова. Также поддерживается 10-битная адресация. Предусмотренный регистр маски адреса может выступать в роли второго регистра сравнения, если требуется обнаружение двух подчиненных адресов, или регистра маски, если требуется обнаружение адресов, принадлежащих заданному диапазону.
Логика подчиненного модуля продолжает работать во всех экономичных режимах работы МК, в т.ч. POWER DOWN. Благодаря этому, подчиненный модуль способен возобновить активную работу МК при обнаружении совпадения адреса. При необходимости программного слежения за адресами, аппаратную функцию обнаружения совпадения адреса можно отключить. Потребность в этом может возникнуть, когда необходимо обнаруживать несколько различных адресов и реагировать на них. При необходимости автоматического выполнения действий и снижения сложности программы можно задействовать режим SMART.
Модуль TWI содержит логику контроля состояния шины, которая накапливает информацию для обнаружения условий START и STOP, коллизий и ошибок шины. С её помощью можно определить состояние шины в ведущем режиме (IDLE, OWNER, BUSY или UNKNOWN).
При необходимости подключения к внешнему драйверу шины по 4-проводному интерфейсу, внутренние драйверы модуля TWI можно отключить.
Принцип действия шины TWI
Двухпроводной интерфейс (TWI) подключается к простой двухпроводной и двунаправленной шине, которая состоит из двух линий: линия синхронизации (SCL) и линия последовательной передачи данных (SDA). Источниками сигналов для обеих линий являются схемы с открытым коллектором в выходном каскаде (используется принцип "монтажного И"). Для создания высоких логических уровней на линиях шины, в т.ч. когда к шине не подключено ни одно устройство, необходимы подтягивающие к плюсу питания резисторы (Rp) — единственно необходимые внешние компоненты. Альтернативно, вместо подтягивающих резисторов могут использоваться источники тока.
Шина TWI является простым и эффективным средством соединения по последовательной шине нескольких устройств.
Устройство, подключенное к шине, может быть либо ведущим (master), либо подчиненным (slave). Чтобы передача по шине стала возможной, к ней должно быть подключено как минимум одно ведущее устройство.
Топологию шины TWI иллюстрирует рисунок 9.
CAN (Control Area Network) — последовательная магистраль, обеспечивающая увязку в сеть "интеллектуальных" устройств ввода/вывода, датчиков и исполнительных устройств некоторого механизма или даже предприятия. Характеризуется протоколом, обеспечивающим возможность нахождения на магистрали нескольких ведущих устройств, обеспечивающим передачу данных в реальном масштабе времени и коррекцию ошибок, высокой помехоустойчивостью. Система CAN обеспечена большим количеством микросхем, обеспечивающих работу подключенных к магистрали устройств, разработку которых начинала фирма BOSH для использования в автомобилях, и в настоящее время широко используемых в автоматизации промышленности.
Предназначен для организации высоконадежных недорогих каналов связи в распределенных системах управления. Интерфейс широко применяется в промышленности, энергетике и на транспорте. Позволяет строить как дешевые мультиплексные каналы, так и высокоскоростные сети.
Скорость передачи задается программно и может быть до 1 Мбит/с. Пользователь выбирает скорость, исходя из расстояний, числа абонентов и емкости линий передачи.
Максимальное число абонентов, подключенных к данному интерфейсу фактически определяется нагрузочной способностью примененных приемопередатчиков. Например, при использовании трансивера фирмы PHILIPS PCA82C250 она равна 110.
Протокол CAN использует оригинальную систему адресации сообщений. Каждое сообщение снабжается идентификатором, который определяет назначение передаваемых данных, но не адрес приемника. Любой приемник может реагировать как на один идентификатор, так и на несколько. На один идентификатор могут реагировать несколько приемников.
Протокол CAN обладает развитой системой обнаружения и сигнализации ошибок. Для этих целей используется поразрядный контроль, прямое заполнение битового потока, проверка пакета сообщения CRC-полиномом, контроль формы пакета сообщений, подтверждение правильного приема пакета данных. Хемминговый интервал d=6. Общая вероятность необнаруженной ошибки 4.7×10-11.
Система арбитража протокола CAN исключает потерю информации и времени при "столкновениях" на шине.
Интерфейс с применением протокола CAN легко адаптируется к физической среде передачи информации. Это может быть дифференциальный сигнал, оптоволокно, просто открытый коллектор и т.п. Несложно делается гальваническая развязка.
Элементная база, поддерживающая CAN, широко выпускается в индустриальном исполнении.
Полная спецификация СAN приведена здесь — www.gaw.ru/data/Interface/CAN_BUS.PDF
Описание интерфейса CAN
Интерфейс CAN предназначен для организации последовательных, высоконадёжных и недорогих каналов связи в распределённых системах управления. Он позволяет организовывать как мультиплексные каналы, так и высокоскоростные сети. Данный интерфейс имеет протокол, поддерживающий возможность нахождения на магистрали нескольких ведущих устройств и обеспечивает передачу данных в реальном масштабе времени.
Интерфейс обладает высокой помехоустойчивостью благодаря коррекции ошибок. Передача данных осуществляется кадрами, которые принимаются всеми устройствами сети. Кадр состоит из идентификатора длиной 11 бит для стандартного формата или 29 бит для расширенного формата и блока данных, содержащего от 0 до 8 байт. Идентификатор описывает содержимое пакета данных и служит для определения приоритета при по¬пытке одновременной передачи несколькими устройствами.
Скорость передачи данных выбирается исходя из расстояния, числа абонентов в сети и ёмкости линии связи. Она задаётся программно и может составлять от десятка Кбод до единиц Мбод.
Стандарт интерфейса CAN определяет передачу данных независимо от физического уровня, т.е. канал связи может быть каким угодно, например, радиоканалом или оптоволокном. Однако на практике под CAN-интерфейсом обычно подразумевается сеть с физическим каналом связи в виде дифференциальной пары проводов, определённым в стандарте ISO 11898. На рисунке 11 приведена схема подключения устройств к интерфейсу CAN.
Кадры и их форматы
Кроме рецессивного и доминантного битов, стандарт интерфейса CAN оперирует таким понятием, как кадр, который используется в протоколе обмена информацией между устройствами. Каждый кадр представляет собой единый набор нескольких служебных битов и байтов. Существуют следующие виды кадров:
• кадр данных (data frame) служит для передачи данных;
• кадр запроса передачи (remote frame) служит для запроса на передачу кадра данных с тем же идентификатором;
• кадр перегрузки (overload frame) обеспечивает промежуток между кадрами данных или кадрами запросов;
• кадр ошибки (error frame) передаётся узлом, обнаружившим ошибку.
В таблицах ниже представлены базовый формат и расширенный формат кадра данных.
Арбитраж доступа к шине
При наличии в сети нескольких устройств, которые могут формировать запросы, в ней могут возникать конфликтные ситуации, когда эти запросы выставляются одновременно. С целью устранения подобных коллизий в интерфейсе CAN предусмотрен механизм арбитража доступа к шине. Когда шина свободна, любое устройство может начинать передачу в любой момент. В случае одновременной передачи кадров двумя и более устройствами производится арбитраж: передавая биты идентификатора, устройство одновременно проверяет состояние шины. Если при передаче очередного бита на шине присутствует противоположный бит, считается, что другое устройство передаёт сообщение с более высоким приоритетом, и передача откладывается до освобождения шины.
Таким образом, в отличие, например, от сети Ethernet, в сети CAN не происходит непроизводительной потери пропускной способности канала при коллизиях. Однако при этом не исключена вероятность того, что сообщения с низким приоритетом никогда не будут переданы.
Защита информации от ошибок
Интерфейс CAN имеет несколько механизмов контроля и предотвращения ошибок. Благодаря арбитражу доступа к шине, производится контроль передачи информации, поскольку при передаче битовые уровни в сети сравниваются с передаваемыми битами
Кроме того, интерфейс CAN использует для защиты информации от ошибок контрольную сумму. Каждый раз при передаче информации, передающее устройство вычисляет контрольную сумму пакета данных и добавляет её в передаваемый кадр. Устройство, принимающее информацию, вычисляет контрольную сумму принимаемого кадра и сравнивает её с контрольной суммой принятого кадра. В случае совпадения контрольных сумм устройство передаёт доминантный бит в промежутке подтверждения.
После передачи пяти одинаковых битов подряд передаётся дополнительный бит противоположного значения — так называемый бит-вставка (bit stuffing), который позволяет защититься от сбоя синхронизации устройств при передаче данных, состоящих из одного и того же двоичного кода.
Упомянутые выше механизмы позволяют обеспечить передачу информации с вероятностью пропуска ошибки 4,7 х 10^-11.
Технические характеристики шины
Все устройства в сети CAN должны работать с одинаковой скоростью. Стандарт CAN не определяет скорость работы, но большинство как самостоятельных, так и встроенных в МК контроллеров CAN позволяют плавно изменять скорость в диапазоне от 20 Кбит/с до 1 Мбит/с. Существуют также решения, выходящие далеко за рамки данного диапазона.
Приведённые выше методы защиты информации от ошибок требуют, чтобы изменение бита при передаче успело распространиться по всей сети к моменту контроля его состояния передатчиком. Это приводит к обратной зависимости длины шины от скорости передачи: чем больше скорость пере¬дачи информации, тем меньше должна быть длина шины. Соотношения скорости передачи и длины шины для сетей стандарта ISO 11898 приведены в таблице.
В отличие от предыдущих стандартов физического уровня, в частности RS‑423, RS‑422 и RS‑232, появление RS‑485 стало поистине эволюционным этапом. Системы связи с поддержкой данного стандарта представляют собой многоточечную систему и имеют до 32 узлов в одиночной системе (с репитерами до 256).
Примерно в то же время, когда создавались упомянутые выше интерфейсы, используемые в таких приложениях, как компьютерные клавиатуры и мыши, принтеры и оборудование для промышленной автоматизации, интерфейс CANbus проектировался как автомобильная коммуникационная платформа, предложенная Робертом Бошем (Robert Bosch), владельцем компании Robert Bosch GmbH, для снижения стоимости производства авто. Эта шина стала альтернативой традиционным толстым многожильным автомобильным кабелям и упростила их прокладку благодаря применению многоузловых шин. Впервые представленный в модели BMW‑850 в 1986 году, автомобильный CAN-интерфейс сэкономил в ней более 2 км различных проводов! Кроме того, было значительно сокращено количество разъемов, а оценочная экономия веса машины составила 50 кг [1] . Так сложилось, что RS‑485 был предназначен для нужд промышленного рынка, а CAN — для автомобильного и транспортного сегмента, но постепенно он нашел место и в приложениях, скажем так, вне своей юрисдикции, то есть в автомобильной и аэрокосмической отраслях.
Благодаря своей высокой устойчивости при эксплуатации в непростых условиях, характерных для автомобильных приложений, возможностям защиты от сбоев и уникальной обработке сообщений CANbus теперь используется там, где прежде никогда не был распространен. Нынешние рыночные тенденции демонстрируют все более широкое внедрение CANbus, порой заменяющего RS‑485 в традиционных индустриальных программах.
Согласно рыночным отчетам, применение CANbus увеличивается в разы, что является исключительным фактом для рынка интерфейсов. И хотя отчеты не разделяют промышленные и автомобильные рынки, многие согласны с тем, что промышленные рынки составляют около 20–30% от общего объема выпускаемой продукции. Рост использования интерфейсов в автомобильной промышленности можно объяснить распространением электроники, установленной сегодня в автомобилях. Современные автомобили имеют сложные микропроцессорные системы, необходимые для таких функций, как резервные камеры, автоматическая парковка, информационно-развлекательные системы, распознавание слепых зон и многое другое. Появление данных подсистем связано с увеличением числа датчиков и микроконтроллеров в авто, требующихся для обработки информации от всех сложных систем, действующих внутри машины. Еще в 1990‑х годах многие автопроизводители начали переход от ручного переключения передач к автоматическим, а позже и к коробкам передач с электронным управлением, основанным на поступающих на микроконтроллер данных о скорости, положении дроссельной заслонки и информации от барометрических датчиков. Сегодня на одном транспортном средстве можно насчитать свыше 100 датчиков и микроконтроллеров, многие из которых общаются по шине CAN. Даже полностью электрический автомобиль Tesla S имеет внутри 65 микроконтроллеров [2].
На индустриальном рынке также наблюдается рост внедрения интерфейса CAN. Промышленные CAN-приложения имеют достаточно широкий охват и устанавливаются в самых разнообразных приложениях — от коммерческих беспилотных летательных аппаратов (дронов) до элементов управления лифтом и даже газонокосилками коммерческого назначения. Поставщики микросхем признают этот факт и разрабатывают продукты для удовлетворения все возрастающей потребности в CAN вне традиционного рынка автомобильной промышленности. Другой фактор, способствующий увеличению применения CAN в индустриальной сфере, — это переход многих инженеров‑автомобилестроителей в промышленный сегмент, где они, естественно, применили свой опыт работы с шиной CAN и ее уникальные преимущества. Еще одна причина внедрения интерфейса CAN на промышленном рынке связана с присущей ему отказоустойчивостью и способностью эффективно обрабатывать кадры сообщений на многоузловой шине.
Для того чтобы объяснить преимущества CAN по отношению к RS‑485, лучше всего оценить сходства и различия между двумя стандартами — ISO 11898-2-2016 [3] и TIA/EIA‑485 (сейчас действует ANSI TIA/EIA‑485‑A ) соответственно. Оба стандарта определяют уровни приемопередатчиков, которые представлены на диаграмме (рис. 1) для стороны передачи.
Оба протокола имеют дифференциальный выходной сигнал. Выход RS‑485 представляет собой классический дифференциальный сигнал, в котором один сигнал является инвертированным, или зеркальным отражением другого. Выход A — неинвертирующая линия, а выход B — инвертирующая линия. Дифференциальный диапазон +1,5…+5 В равен логической 1 или значению, а пределы –1,5…–5 В — логическому 0 или пробелу. Сигнал с уровнем, лежащим в диапазоне –1,5…+1,5 В, считается как неопределенный. Важно отметить, что когда RS‑485 не используется, то его выход пребывает в состоянии высокого импеданса.
У шины CAN выходной дифференциальный сигнал несколько иной. Так, здесь предусмотрено два выхода в виде CANH- и CANL-линий данных, которые являются отражением друг друга (рис. 1) и представляют собой инвертированную логику. В доминирующем состоянии (бит нуля, используемый для указания приоритета сообщения) CANH-CANL определяются как 0, когда напряжение на них составляет +1,5…+3 В. В рецессивном состоянии (1 бит и состоянии незанятой шины) сигнал драйвера определяется как логическая 1, когда дифференциальное напряжение находится в диапазоне –120…+12 мВ или в приближении к нулю.
Рис. 1. Сравнение допустимых уровней выходных дифференциальных сигналов драйверов RS 485 и CAN
Для стороны приемника стандарт RS‑485 определяет входной дифференциальный сигнал, когда он находится в пределах ±200 мВ…+5 В. Для CAN входной дифференциальный сигнал составляет +900 мВ…+3 В, а рецессивный режим находится в диапазоне –120…+500 мВ. Когда шина пребывает в режиме ожидания или когда не загружена и трансивер находится в рецессивном состоянии, напряжения на линиях CANH и CANL должны быть в рамках 2–3 В.
Как RS‑485, так и CAN имеют необходимый технологический запас по уровням распознавания для работы в приложениях, в которых сигнал может быть ослаблен из-за характеристик и качества используемого кабеля (экранированного или неэкранированного) и длины кабелей, что может сказаться на емкости подключения системы. Для сравнения допустимых уровней входных дифференциальных сигналов со стороны приемника RS‑485 и CAN следует обратиться к рис. 2.
Рис. 2. Сравнение допустимых уровней входных дифференциальных сигналов для RS 485 и CAN со стороны приемника
Кроме того, оба стандарта имеют нагрузочные согласующие резисторы с одинаковым значением 120 Ом, устанавливаемые на концах линии. Эти резисторы необходимы, чтобы обеспечить согласование линии связи по волновому сопротивлению линии передачи и тем самым избежать отражения сигнала. Другие технические характеристики, такие как скорость передачи данных и количество допустимых узлов, носят информационный характер, а не являются строгими требованиями, подлежащими обязательному выполнению. Для удовлетворения нужд рынка большинство выпускаемых RS‑485- и CAN-трансиверов превышает стандартную скорость передачи данных и допустимое количество узлов. Например, интегральный полудуплексный трансивер RS‑485 индустриального класса из микросхемы MAX22500E [4] от компании Maxim достиг скорости в 100 Мбит/с. А новый стандарт CAN-FD, ISO 11898-2:2016, хотя и определяет временные характеристики для скоростей 2 и 5 Мбит/с, но не ограничивает скорость передачи данных значением 5 Мбит/с. CAN-трансиверы превысят требования своего стандарта так же, как и приемопередатчики RS‑485. Что касается устойчивости к синфазному сигналу, параметр CMR (Common-Mode Range, диапазон синфазных напряжений) для RS‑485 составляет –7…+12 В и для CAN –2…+7 В.
Однако многим приложениям требуется более высокая производительность в части CMR, что относится к обоим типам рассматриваемых интерфейсов. Это связано с тем, что они в основном используются для многоузловых шин, а их узлы могут иметь источники питания с разными силовыми трансформаторами или кабели находиться в непосредственной близости к оборудованию с достаточно мощными переменными электромагнитными полями, способными повлиять на заземление между узлами системы. Таким образом, учитывая множество самых различных приложений, работающих в жестких условиях индустриальной среды, часто требуется более высокая устойчивость CMR, выходящая за пределы стандартных уровней –7…+12 В.
Для решения этой проблемы существуют приемопередатчики RS‑485 и CAN нового поколения, которые имеют значительно более широкий диапазон устойчивости к воздействию синфазной помехи, а именно до ±25 В. На диаграмме, приведенной на рис. 3, представлен флуктуирующий диапазон синфазного сигнала для приемопередатчика RS‑485. Несмотря на то, что сигнал синфазного напряжения растет вверх и вниз, пока уровень синфазного напряжения (VCM) находится в пределах допустимого диапазона, он не влияет на дифференциальный сигнал шины и приемник способен принимать и распознавать сигнал на линии без ошибок. Диаграмма на рис. 3 показывает допустимый диапазон изменения синфазного сигнала для RS‑485.
Рис. 3. Пояснение параметра CMR на примере трансивера RS 485
Еще одна особенность, присущая как приемопередатчикам CAN, так и RS‑485, — защита от сбоев. Устройства с защитой от ошибок имеют внутреннюю цепь защиты от воздействия повышенного напряжения на выходы драйвера входа приемника. Это необходимо, чтобы уберечь устройства от случайных коротких замыканий между локальным источником питания и линиями передачи. В данном направлении микросхемы компании Maxim занимают лидирующее положение в отрасли. Они, как, например, широко используемая и в настоящее время MAX13041, гарантируют уровни защиты от сбоев до ±80 В и даже с некоторым дополнительным запасом до полного пробоя и выхода цепи защиты из строя [5]. Причем важно то, что этот уровень защиты гарантируется независимо от того, подано питание на трансивер или он обесточен.
Среди основных причин того, почему в индустриальных приложениях предпочтение отдается CAN-, а не RS‑485‑трансиверам, следует назвать и способ обработки сообщений на шине. В мультиузловой системе, используемой для общения с микропроцессором RS‑485, могут быть случаи, когда несколько сообщений отправляются одновременно. Что иногда приводит к коллизиям, иначе известным как конкуренция. Если подобное происходит, состояние шины может оказаться неверным или неопределенным, что вызовет ошибки данных. Кроме того, такая конкуренция может повредить или ухудшить параметры производительности, когда несколько трансиверов RS‑485 на шине находятся в одном, а один приемопередатчик — в противоположном состоянии. Тогда от одиночного передатчика RS‑485 может потребоваться довольно значительный ток, который, вероятно, вызовет отключение микросхемы из-за превышения максимально допустимой температуры или даже приведет к необратимому повреждению системы. Здесь CANbus по сравнению с протоколом RS‑485 имеет большое преимущество. С помощью CANbus удается разрешить проблему передачи нескольких сообщений на линии путем ранжирования каждого из них.
Рис. 4. Формат кадра передачи данных CAN
Перед тем как приступить к работе по проектированию системы, инженеры назначают разные уровни задач. Ранее упоминалось, что CAN имеет доминантное и рецессивное состояние. Во время передачи сообщение с более высоким назначенным доминантным состоянием «выигрывает» конкуренцию и будет продолжать передачу, в то время как другие узлы с более низким приоритетом будут видеть доминирующий бит и прекратят передавать данные. Этот метод называется арбитражем, где сообщения приоритетны и принимаются в порядке их статуса. Узел, который проигрывает в результате более низкого назначенного приоритета, повторно отправит свое сообщение, когда его уровень окажется доминирующим. Это продолжается для всех узлов, пока они не выполнят передачу. На рис. 4 более подробно рассмотрен формат кадра данных сообщения в протоколе CAN. Эта временная диаграмма и таблица 1 наглядно демонстрируют, где и как происходит арбитраж.
Таблица 1. Формат кадра передачи данных в протоколе CAN
Этот вопрос мне пришлось задать себе лет десять назад или больше. Работа, которую надо было сделать, заключалась в дарении второй жизни диспетчерскому щиту. Это такая штука во всю стену, состоящая из лампочек и выключателей с переключателями. Думаю, не ошибусь, предположив, что щиты стали делать с тех пор, как появились лампочки, поскольку выключатели к тому времени, наверняка, уже были известны. А тяга к прекрасному, вообще, пришла к людям из далекой древности.
Сейчас многие предпочтут щитам дисплейные панели. Но будут ли любители дисплеев в большинстве, зависит от многого, нам неведомого. Но сейчас речь не об этом.
Каждый, кто может в течение пяти минут поддерживать разговор об электропроводке, сразу скажет мне, что щит состоит из плоских панелей, на которых размещены выключатели и лампочки, а также из ящика со множеством проводов. Ведь лампочка без проводов только для того и годится, чтобы ее или тупо разбить или, если подойти творчески и включить воображение, разместить у самого пытливого во рту и довольно быстро узнать, где находится травмпункт.
Все так и было, куча проводов, уходящих из ящика к выключателям и лампочкам, только лампочки — маленькие. Видимо, внучки знаменитой лампочки Ильича.
И вот, помнится, глянул за окно, а там 21-й век. Стало быть надо все делать заново и по-другому. Вместо лампочек — экономичные светодиоды. Вместо проводов — проводки. Вместо одного ящика — много-много маленьких ящичков, контроллеров, стало быть.
Оказалось, что если каждый контроллер сможет обслуживать четыре светодиода и два переключателя то это будет выглядеть оптимальненько. В смысле, не так ужасающе. А если через все контроллеры будет проходить шина питания и информационная шина, всего четыре провода, то появится некое изящество. Оказалось также, что контроллеров потребуется 104 штуки. По-хорошему, тут надо было бы поставить и решить задачу коммивояжера. И тогда, возможно, контроллеров потратили бы меньше. Но было не до хорошего.
К тому времени я уже знал, что такое CAN и уровень моего уважения к фирме Bosch был много выше, нежели у повара приличного ресторана или аккуратной домохозяйки. А производители автомобилей BMW, я уверен, даже ходили к инженерам Bosch в гости.
Controller Area Network, как сказали бы иностранцы, на мой взгляд, как техническое решение, возникло из желания сделать что-то, наконец, хорошо. Не скрою, все прелести результатов работы инженеров почувствуешь не сразу, как осилишь два тома стандарта, а значительно позже. Когда пообщаешься с очевидцами, опросишь свидетелей. Сейчас томов прибавилось, но, может быть, можно сразу начинать с третьего, поскольку, теперь оно называется CAN_FD. Однако, позвольте продолжить.
Еще до столкновения со щитом мне пришлось столкнуться с чужими инженерными решениями на тему использования CAN, а также наделать и своих ошибок. Ошибки обычно появляются в перерывах между чтением инструкций и изучением описаний. Хорошо, что только со второго раза они выглядят как грабли.
Теперь несколько тысяч слов для читателя, который терпимо относится к занудам и не считает их врагами.
CAN можно установить там, где раньше работал RS485 на витой паре. Витая пара — это не непременное условие, просто удобно сравнивать. Используя витую пару, по CAN, как и по RS485, можно передать сообщения от управляющего контроллера к подчиненному и получить ответ. Сходство бросается в глаза, но, давайте лучше остановимся на отличиях. Кое-какие из отличий могут нести знак минус для некоторых из читателей. Но им бы я посоветовал не огорчаться, а вспомнить закон Ломоносова.
Благодаря синхронной организации протокола разрешение коллизий на шине реализовано аппаратно, на лету, так сказать. Ниже отмечено, к чему это приводит и что это дает непоседливому инженеру.
Можно получить сообщение и без запроса.
Не надо ждать, когда ответ будет готов, можно спросить в это время еще кого-то.
Подчиненный контроллер тоже может спросить и получить ответ.
Из-за синхронной работы длина шины CAN обратно пропорциональна скорости передачи или типа того.
Максимальная скорость составляет 1 Мбод (10 — на подходе).
То, что сообщение не исказилось при передаче отправляющий знает сразу после последнего бита. Точнее, это знают все на шине.
Если сообщение исказилось для одного, попытка не засчитывается всеми.
Если сообщение удалось передать в шину, то абонент не получит его лишь при условии, что сломался.
Количество контроллеров на шине не должно превышать 127.
Сообщения ограничены по длине. Они состоят из идентификатора, указателя длины в байтах и блока данных, именно с таким количеством байт, как указано. Есть еще несколько служебных битов, но о них пока помолчим, поскольку сервис должен быть ненавязчивым. Идентификатор может быть размером 11 или 29 бит. Блок данных может содержать от 0 до 8 байт (64 — на подходе).
Для конкретики приведу немного цифр. Если хочется работать на скорости 1Мбод, то длина шины не должна быть больше 35 метров (некоторые предпочитают 40, то есть, погорячее). Если необходимо передать что-то на расстояние до 8 км, то скорость не должна превышать 5 Кбод. Кстати, читатель вправе спросить, почему килобод, а не килобит? Потому, что не все боды становятся битами. Как-то так.
Как можно распорядиться всеми этими совсем не секретными ингредиентами? Те, кто во всем видят игру в кубики, сразу вспомнят, что есть такая замечательная вещь, как CANopen и еще много красивых сочетаний и аббревиатур и нечего изобретать велосипед. Таким мне часто хочется ответить: «Разве не похожа на велосипед та яичница из двух яиц, которую многие готовят себе на завтрак? Почему бы не сходить в общепит и не взять себе омлет?». Но я лучше промолчу и продолжу, не отвлекаясь на выкрики из зала.
В те времена, когда 29 битовый идентификатора еще не успели придумать, существовал только 11 битовый. Одни его стали использовать, чтобы запихнуть туда название (номер) нужного вида данных. Другие использовали как адрес контроллера, к которому обращаются. И то и другое имело смысл. Например, можно спросить так:
- А подай-ка нам, милейший, шато тринадцатого года в литровой бумажной упаковке.
Заверните мне, пожалуйста, то, что спрятано у вас на самой нижней полке справа.
Кстати, в CAN может сработать и такая конструкция:
Всем лежать! А ты быстро складывай все с полок мне в сумку.
Но этой конструкцией часто не попользуешься, поскольку после придется какое-то время ждать.
Ждать пока все ответы не выстроятся один за другим и не поступят в распоряжение запрашивающего контроллера. Мы уже ушли от кино, если что.
Меня в моем случае устроил бы вариант идентификатора в качестве адреса. Из 11 бит требовалось 7 и еще 4 оставалось на то, чтобы сделать одни сообщения более срочными по сравнению с другими, а также пометить часть контроллеров как главные.
Некоторое неудобство перекочевало сюда из RS485, а именно, адреса надо было устанавливать вручную на каждом контроллере. Затем проверять и переустанавливать. И, возможно, вернуться к предыдущему шагу и повторить.
К счастью, к тому времени уже существовали два обстоятельства.
Первое — уже появился 29 битный идентификатор. А второе то, что многие производители микроконтроллеров стали считать хорошим тоном условие, чтобы каждый чип имел свой уникальный и довольно длинный номер.
Теперь в длинном идентификаторе можно было 24 бита смело отвести для уникального адреса. Еще 5 оставалось, для заботы о том, чтобы поезда различались срочностью, направлением (туда, обратно), наличием вагона-ресторана и вагонов с повышенным комфортом.
Если перестать дурачиться и сделаться серьезным, назвать подчиненных контроллеров агентами, а остальных боссами, то можно составить таблицу. Она будет показана немного позже.
Еще немного про адресацию. Уникальный номер чипа, как правило, занимает количество битов значительно превышающее 24, например, 96 у STM32FXXX. Поэтому необходимо как-то получить 24 из 96. Я выбрал операцию XOR. Вы можете выбрать что-то другое, но небольшая проблема останется. Это совпадения адресов после редуцирования.
Вероятность появления этой проблемы крайне мала, но она есть. Она решаема, но добавляет работы наладчикам. Здесь надо вспомнить, что сообщения CAN могут не содержать данных совсем. Это нам и пригодиться при решении. Оно состоит из следующих действий.
Управляющий контроллер (босс) отправляет широковещательный запрос, на который должны ответить все агенты (это запрос с нулевым адресом). Ответные сообщения с нулевой длиной данных и совпадающими адресами не испортят друг-друга, а достигнут босса в виде одного.
Теперь останется подсчитать сколько получено ответов и сколько их должно быть. Если эти два числа совпадают, значит все в порядке. Если ответов меньше чем контроллеров, то налицо совпадение адресов и наладчикам есть работа. А если ответов больше, нежели контроллеров, то надо подумать о диссертации, поскольку, вы — на пороге открытия.
Если изменение длины сообщения рассматривать как некоторые вариации его смысла, то можно получить дополнительные возможности, о которых позже расскажу, если мама не позовет кушать.
Еще из интересного, если использовать и короткие и длинные идентификаторы одновременно, то можно получить, например, адресацию групп или частично широковещательные запросы. Но не будем пока углубляться.
Вернемся к кодированию идентификатора.
Для целей адресации в расширенном идентификаторе отведено 24 бита, а в стандартном – шесть. Адрес со значением 0x000000 является широковещательным для расширенного идентификатора. Для стандартного идентификатора нулевой адрес (6 его бит) также считается широковещательным. Пять начальных (старших) битов в длинном и коротком идентификаторе, называются заголовком, влияют на смысл сообщения и обозначаются буквами NVADR:
Конечно, для диспетчерского щита потребовалось реализовать только часть этой схемы. В первом проекте со щитом (или на щите, как правильно?) использовались чипы Cortex от NXP, а в следующих проектах (были и такие) уже применялись M0 от STMicroelectronics.
Пару слов об использовании коротких идентификаторов. Те шесть бит, которые отводятся для адресации, адресуют не контроллер, а группу. Эта группа при старте сначала у всех нулевая. Далее производится конфигурирование агентов, после которого часть из них или все становятся принадлежащими своей группе. Теперь запросом к группе, мы получаем ответы тех агентов, которые мы собрали в эту группу.
Теперь, немного о том, что добавляется, если по-разному трактовать сообщения с различной длиной данных. Например, запрос с нулевой длиной хорошо помогает при отладке, как уже упоминалось выше. Запрос с длиной 3 обслуживает пространство байтовых переменных размером 16384. Запрос с длиной 4 делает то же самое, но предназначен для агента-шлюза, который обслуживает CAN шину второго уровня. Эта шина может состоять из одного-двух агентов, зато удаленных на пару километров.
Запрос с длиной 5 и 6, аналогично, предназначены для пространства двухбайтовых переменных размером 4194304. Два бита используются не для адресации. Один бит управляет записью-чтением. Другой сигнализирует об ошибке.
Далее 7 и 8 обслуживают четырех байтовые слова. Их тоже 4194304.
Эти пространства являются общими для всех агентов. Каждый из них, в зависимости от предназначения, использует только отрезок пространства переменных. Контроллер для измерения температуры в двух точках представлен на фото. Это для отладки и тестирования.
Соединяются контроллеры плоским шлейфом на 6 жил. На питание идут сдвоенные. Микросхема о двадцати ногах — это STM32F042.
С обратной стороны присутствует MAX3051, формирователь CAN в корпусе SOT23-8.
Ну вот, мама кушать зовет.