Описание интерфейса CAN и обмена информацией по его шине.
Интерфейс CAN был разработан специально для применения в автомобилях для обеспечения обменом информацией между его электронными устройствами, в данное время CAN так же широко применяется и в промышленности. Основные критерии которые учитывали разработчики данного интерфейса это надежность как на физическом так и на программном уровне, высокая скорость передачи данных до 1 Мбит/с, передачи данных на большие расстояния и возможность подключения множество устройств к одной линии связи, к недостатку данного интерфейса я могу отнести последовательность шины( одновременно можно только передавать или получать данные).
Для подключения используются два информационных провода или витая пара обусловлено это дифференциальной передачи данных.
Каждый из устройств подсоединен к шине CAN посредством отдельного трансивера в котором имеется приемник сигналов, этот приемник представляет собою дифференциальный усилитель, установленный на входе трансивера. В дифференциальном усилителе производится обработка сигналов, поступающих по проводам CAN_H и CAN_L, обработанные сигналы направляются на вход схемы устройства или в нашем случае контроллера.
Дифференциальный усилитель формирует эти сигналы как разность между напряжениями на проводах CAN_H и CAN_L шины CAN, таким образом исключается влияние величины базового напряжения 2,5 В или другого какого либо напряжения вызванного например внешними помехами. Нахождение линии на базовом уровне говорит о рецессивном состоянии( ожидание активации линии от любого устройства или устройств), изменить её состояние на доминантное( одно из устройств активируют линию) может любое подключенное устройство. При переходе в доминантное состояние напряжение на проводе CAN_H повышается на определенную величину, которая в данном случае равна не менее 1 В в это же время напряжение на проводе CAN_L снижается также на определенную величину, которая в данном случае составляет не менее 1 В, таким образом при пере ходе шины CAN в активное состояние напряжение на проводе CAN_H достигает 3,5 В (2,5 В + 1 В = 3,5 В), а на проводе CAN_L оно понижается до 1,5 В (2,5 В 1 В = 1,5 В).
Принцип исключения помех при передаче данных этим способом проиллюстрирован расположенным ниже рисунком. Благодаря прокладке проводов шины CAN_H и CAN_L с перекручиванием между собой, вызывающий помеху импульс Х оказывает на них одинаковое воздействие который должен исключить из передачи дифференциальный усилитель.
Протокол CAN или фреймы.
Надеюсь что с физической частью шины CAN разобрались, теперь поговорим как происходит сам процесс передачи данных или протокол фреймов.
В CAN протоколе определены следующие типы фреймов: данных, удаленный, ошибки и перегрузки.
Фрейм данных-перемещает данные с передатчика на приемник или приемники, существует два типа стандартный( Standard Format) и расширенный( Extended Format).
Рассмотрим подробнее фрейм данных, он состоит из стартового поля SOF, поля арбитража Arbitration Field, управляющего поля Control Field, поля данных Data Field, поля контрольной суммы СRC,поля подтверждения ACK Field, поля конца фрейма EOF.
Поле SOF (Start of Frame) находится в начале фрейма данных и содержит один доминирующий бит.
Поле арбитража Arbitration Field содержит 11 битовый идентификатор и RTR бит, показывающий, является данный фрейм фреймом данных или удаленным фреймом. Идентификатор предназначен для адресации сообщений и используется механизмом арбитража.
Управляющее поле Control Field содержит 6 битов, из которых 4 бита (DLC0-DLC4) составляют поле Data Length Code, показывающее количество байтов данных, которое будет передаваться в поле данных, два других бита зарезервированы для следующих редакций протокола.
Поле данных Data Field содержит передаваемые данные, причем количество передаваемых байтов указывается в поле Control Field и не может превышать 8.
Поле СRC обеспечивает механизм избыточного контроля по четности передаваемых данных.
Поле подтверждения ACK Field содержит участки ACK Slot и ACK Delimiter и выполняет следующую функцию передающее устройство посылает по одному рецессивному биту на каждом из участков, а приемник, если он принял сообщение без сбоев, устанавливает на линии доминирующий бит в поле ACK Slot. При наложении рецессивного и доминирующего уровней на линии устанавливается доминирующий, и это событие сигнализирует передающему узлу о том, что передача прошла нормально и повтор не требуется.
Поле конца фрейма EOF содержится в фрейме данных и состоит из семи рецессивных битов.
Удаленный фрейм-инициация одним из устройств сети передачи в сеть данных другим устройством, такая схема позволяет уменьшить суммарный трафик сети. Устройство действующее как приемник некоторых данных, может инициировать передачу соответственных данных исходными устройствами, посылая кадр удаленного запроса данных. Кадр удаленного запроса данных существует и в стандартном формате и расширенном формате. В обоих случаях он состоит из шести битовых полей: начало кадра(Start of frame), поле арбитража(Arbitration field), управляющее поле(Control field), поле CRC(CRC field), поле подтверждения(ACK field), конец кадра(End of frame). В отличие от кадра данных, RTR бит кадра удаленного запроса данных единичный и не имеет поля данных, при этом значение кода длины данных может принимать любое значение в пределах допустимого диапазона 0-8.
Фрейм ошибки-выражает, какое устройство обнаружило ошибку шины/сети, передача такого сообщения приводит к тому, что все устройства сети регистрируют ошибку формата CAN протокола и в свою очередь автоматически передают в сеть Error Frame, результатом этого процесса является автоматическая повторная передача данных в сеть передающим устройством.
Фрейм ошибки состоит из двух различных полей: суперпозицией флагов( superposition of Error Flags) и разделитель ошибки( Error Delimiter).
Поле суперпозицией флагов ошибки содержит флаг ошибки который может быть двух вариантов: флаг активной ошибки и флаг пассивной ошибки.
Флаг активной ошибки-ошибка активная фиксируется, когда активное устройство обнаруживает одну из любых ошибок, он передает активный фрейм ошибки, который состоит из шести последовательных доминирующих битов. Эта передача отменит любую другую передачу, проходящую в то же самое время, и заставит все другие устройства обнаружить ошибку наполнения, которая, в свою очередь, заставляет их отбрасывать текущий фрейм. Когда устройство в состоянии активной ошибки обнаруживает проблему с передачей, он предотвращает получение всех других данных из пакета сообщений, передавая фрейм активной ошибки. Этот процесс выполняется независимо от того, был ли узел, обнаруживающий ошибку, получателем данных или нет.
Флаг пассивной ошибки-ошибка пассивная фиксируется, когда пассивное устройство обнаруживает одну из любых ошибок, он передает фрейм пассивной ошибки, который состоит из шести последовательных пассивных битов. Этот фрейм может быть наложен на передачу, которая ведется в то же самое время, при этом данные из передачи не теряются, если другие узлы не обнаруживают ошибку.
Возможные варианты ошибок:
а) Разрядная ошибка появляется, когда передатчик сравнивает уровень на шине с уровнем, который должен передаваться, и обнаруживает их неравенство. При этом обнаружение активного бита, когда передается пассивный бит, не выдает ошибку в течение передачи поля арбитража, поля ACK Slot или флажка пассивной ошибки.
б) Ошибка подтверждения возникает, когда передатчик определяет, что сообщение не было подтверждено. Слот подтверждения существует внутри фреймов данных и удаленных фреймов. Внутри этого слота все приемные узлы, независимо от того, являются они пунктом назначения или нет, должны подтвердить получение сообщения.
в) Ошибка заполнения появляется, когда узел обнаруживает шесть последовательных битов одного и того же значения. В процессе нормальной работы, когда передатчик обнаруживает, что он послал пять последовательных битов одного и того же значения, он заполняет следующий бит противоположным значением (это называется заполнением бита). Все приемники удаляют заполненные биты до вычисления CRC (контрольного кода). Таким образом, когда узел обнаруживает шесть последовательных битов того же значения, возникает ошибка заполнения.
г) CRC ошибка появляется когда CRC значение(контрольный код) не соответствует значению, с генерированному передатчиком. Каждый фрейм содержит поле контрольного кода, которое инициализировано передатчиком. Приемники вычисляют CRC и сравнивают его со значением, с генерированным передатчиком. Если эти два значения не тождественны, то имеет место CRC ошибка.
д) Ошибка формы возникает, когда недопустимое разрядное значение обнаружено в области, в которую должно быть передано предопределенное значение. В CAN протоколе существуют некоторые предопределенные разрядные значения, которые должны быть переданы в определенных местах. Если недопустимое разрядное значение обнаружено в одной из этих областей, имеет место ошибка формы.
Разделитель ошибки (Error Delimiter)-состоит из восьми рецессивных битов. После передачи флага ошибки каждый узел посылает рецессивные биты и проверяет шину, пока не обнаруживает рецессивный бит. Далее он начинает передачу еще семи рецессивных битов.
Фрейм перегрузки-обеспечивает задержку между передачей фреймов, чтобы управлять потоком данных. Фрейм перегрузки содержит два битовых поля: флаг перегрузки и разделитель перегрузки.
Есть условия, которые приводят к передаче флага перегрузки:
а) Внутреннее состояние приемника требует задержки следующего фрейма данных или удаленного запроса данных.
б) Обнаружение доминантного бита при передаче первого и второго битов перерыва.
в) Если узел обнаруживает доминантный бит на восьмом бите (последнем бите) разделителя ошибки или разделителя перегрузки, это повлечет передачу фрейма перегрузки (а не кадра ошибки), счетчики ошибок не будут инкрементированы.
Передачу фрейма перегрузки, обусловленного 1-м видом перегрузки, разрешено начинать в первом битовом интервале предусмотренного перерыва, в то время как фрейм перегрузки, обусловленный 2-м и 3-м видами перегрузки, начинает передаваться на один бит позже обнаружения доминантного бита. Не больше двух фреймов перегрузки может быть сгенерировано, чтобы задержать следующий фрейм данных или удаленного запроса данных.
Фрейм перегрузки состоит из двух различных полей: суперпозицией флагов( superposition of Overload Flags) и разделитель ошибки( Overload Delimiter).
Флаг перегрузки( Overload Flag)-состоит из шести доминантных битов. Полная форма соответствует флагу активной ошибки и нарушает фиксированную форму поля перерыва. Все другие узлы также обнаруживают условие перегрузки и в свою очередь начинают передачу флага перегрузки. В случае если обнаружен доминантного бит, во время 3-го бита перерыва, то этот бит интерпретируется как начало кадра.
Разделитель перегрузки (Overload Delimiter)-состоит из восьми рецессивных бит. Разделитель перегрузки имеет такую же форму, как и разделитель ошибки. После передачи флага перегрузки устройство контролирует шину, пока не обнаружит переход от доминантному бита к рецессивному биту. В этот момент времени каждый устройство заканчивает передачу флага перегрузки, и все узлы начинают передачу еще 7
рецессивных битов.
Межфреймовое пространство( Interframe Spacing)-фреймы данных и удаленного запроса данных отделяются от предшествующих фреймов любого типа( данных, удаленного запроса данных, ошибки, перегрузки) битовым полем, называемым межфреймовым пространством, в отличие от них, кадрам перегрузки и кадрам ошибки не предшествует межфреймовое пространство(кратные фреймы перегрузки также не отделяются интервалами).
Межфреймовое пространство содержит битовые поля Intermission( перерыв) и Bus Idle( простой шины), а для узла в состоянии пассивной ошибки, который был передатчиком предыдущего сообщения, еще и поле Suspend Transmission( приостановка передачи).
Intermission-состоит из трех рецессивных бита. В течение перерыва единственное действие, которое можно предпринять сообщить об условии перегрузки и никакое устройство не сможет начать передачу фрейма данных или удаленного запроса данных.
Bus Idle-период простоя шины может иметь произвольную длину. Шина свободна и любое устройство, которому нужно что-либо передать, может обращаться к шине. Сообщение, которое ждет передачи во время передачи другого сообщения, начинает передаваться в первом бите после перерыва. Обнаружение доминантного бита на шине интерпретируется как начало фрейма.
Suspend Transmission-после того, как устройство в состоянии пассивной ошибки передало сообщение, оно
посылает восемь рецессивных бита, после которых идет перерыв, перед передачей следующего сообщение или распознавания простоя шины. Если тем временем начинается передача, вызванная другим устройством, устройство становится приемником этого сообщения.
Средства управления доступом к шине в CAN протоколе и решение проблемы коллизий.
Передающие устройство в CAN протоколе слышат ВСЕ другие устройства в сети и подтверждают это. Всякий раз, когда шина свободна от передачи, устройство может начинать передавать. Если устройство передает, эта передача должна быть завершена прежде, чем другое устройство может пытаться передавать. Если два или больше устройства начинают передавать в одно и то же время, конфликт решается при помощи неразрушающего( non-destructive) поразрядного алгоритма арбитража, использующего поле арбитража.
Поле арбитража, включенное во все фреймы данных, состоит из 11-битового поля идентификатора, бита RTR( указывает, является ли фрейм фреймом данных или удаленным фреймом).
11-битовое поле идентификатора передается от старшего к младшему значащему биту. Доминирующий уровень логический 0, одновременная передача бита с доминирующим уровнем(логический 0) и бита с рецессивным уровнем (логическая 1) дает в результате уровень логического 0.
В течение передачи поля арбитража каждый передатчик контролирует текущий уровень на шине и сравнивает это с битом, который он должен передавать. Если значения равны, устройства продолжают передачу, но при передачи устройством бита с пассивным уровнем(логическая 1) а обнаружен активный бит(логический 0) на шине, то данное устройство теряет право передачи и должно прекратить передачу последующих данных. Устройство которое потеряло шину может сделать попытку передачи снова когда текущая передача будет завершена. Важно следующее: идентификатор с самым низким значением выигрывает арбитраж.
Из сказанного можно сделать следующие выводы. Приоритетным является не передающее или приемное устройство, а сообщение, имеющее меньшее значение идентификатора.
Если в сети одно из устройство(сервер) будет ответственным за принятие решений, то оно должно иметь наименьший адрес из задействованных. Вторая возможность, которую дает механизм арбитража, использована в сети верхнего уровня DeviceNet . В этой сети количество устройств ограничено 64 и для адресации отведены младшие разряды идентификатора, а старшие разряды предназначены для кодирования видов сообщений. Естественно, что сообщение, имеющее 0 в старшем бите, захватит шину первым, независимо от адреса узла приемника. Это, в свою очередь, обеспечивает передачу сообщений первого вида, например об аварии, по сети первыми, независимо от адресов приемных и передающих устройств.
Адресация в CAN протоколе.
CAN это протокол, ориентированный на использование в условиях помех. Различные сообщения, передающиеся по сети, имеют идентификатор, и каждая станция решает, основываясь на этом идентификаторе, получать или нет это сообщение. Этот идентификатор определен в поле идентификатора CAN фрейма. При этом адрес приемника устанавливается в самом приемнике путем настройки входных фильтров соответствующих микросхем.
Входные фильтры представляют собой решета, или идентификационные экраны. Любое сообщение, которое проходит через входные фильтры, должно быть обработано процессором обслуживания CAN контроллера. Чем большее количество единиц может быть отфильтровано, тем меньше нагрузка на процессор.
Микросхемы, поддерживающие CAN протокол, могут иметь одиночный фильтр или многократные фильтры, в зависимости от конкретной реализации.
Существуют следующие два типа входных фильтров:
Фиксированные фильтры, которые требуют, чтобы биты соответствовали точно один к одному (one for one).
Mask and Match(маскируемые) фильтры, которые применяют маску к полю идентификатора, прежде чем он сравнивается с приемным регистром кода.
Например, на рисунке справа регистр маски сконфигурирован так, что полученные биты 10-6 идентификатора должны соответствовать битам 10-6 в приемном регистре кода. В этом примере биты 10-6 идентификатора должны быть установлены в 11110, а остальные не имеют значения. Если биты 10-6 установлены в 11110, то эти сообщения принимаются независимо от значений битов 5-0. Если не понятно, единицы в маске говорят что нужно проверять в идентификаторе сообщения и фильтра, нули обозначают безразличие к значениям битов как в идентификаторе сообщения так и фильтра.
Типизация неисправностей.
Неисправный узел может быть в одном из трех состояний:
1) Активной ошибки (Error Active);
2) Пассивной ошибки (Error Passive);
3) Отключения от шины (Bus Off).
Узел в состоянии “активной ошибки” нормально присоединен к шине и посылает флаг активной ошибки при обнаружении ошибок.
Узел в состоянии “пассивной ошибки” не должен посылать флаг активной ошибки, он подключен к шине, но при обнаружении ошибок, посылает флаг пассивной ошибки. После передачи, узел в состоянии “пассивной ошибки” будет ждать инициализации
дальнейшей передачи.
Узел в состоянии “отключения от шины” не может работать с шиной.
Для типизации неисправностей в каждом узле есть два счетчика:
1) Счетчик ошибок передачи (Transmit Error Counter);
2) Счетчик ошибок приема (Receive Error Counter).
Эти счетчики увеличиваются или уменьшаются в соответствие с несколькими правилами. Сами правила управления счетчиками ошибок достаточно сложны, но сводятся к простому принципу, ошибка передачи приводит к увеличению Transmit Error
счетчика на 8, ошибка приема увеличивает счетчик Receive Error на 1, любая корректная передача/прием сообщения уменьшают соответствующий счетчик на 1. Эти правила приводят к тому, что счетчик ошибок передачи передающего узла увеличивается быстрее,
чем счетчик ошибок приема принимающих узлов, что соответствует предположению о большой вероятности того, что источником ошибок является передающий узел.
Когда, значение хотя бы одного из двух счетчиков ошибок превышает предел 127, узел переходит в состояние Error Passive, если значение хотя бы одного из двух счетчиков превышает предел 255, узел переходит в состояние Bus Off.
Литература использованная в статье.