Если происходит принудительный доступ к шине или передается повторное условие START, в то время когда линия SDA заблокирована (подключена к низкому уровню), аппаратные средства выполняют действия, аналогичные вышеописанным.
Ошибка шины. Ошибка шины возникает в случае, если условия START или STOP устанавливаются в неправильной позиции по отношению к разрядной сетке. Неправильные позиции возникают во время последовательной передачи адресного байта, данных или бита подтверждения. Аппаратные средства I2C реагируют на ошибку шины только тогда, когда они участвуют в последовательной передаче в главном или в адресуемом подчиненном режимах. Когда детектируется ошибка шины, интерфейс сразу же переключается в неадресуемый подчиненный режим, освобождает линии SDA и SCL и устанавливает флаг прерывания. Далее производится попытка вновь повторить прерванную последовательную передачу.
Разработанный в середине 80-х гг. фирмой Bosch для систем управления узлами автомобиля протокол CAN (Controller Area Network – сеть контроллеров) является последовательным протоколом высокоскоростной и высоконадежной передачи данных в широковещательном (broadcast) режиме и мультимастерной среде. Удачное сочетание низкой стоимости подключения, простоты и надежности с проверкой временем и широкой доступностью элементной базы и инструментальных средств разработки – одни из основных достоинств CAN-технологии.
Положения, закрепленные в используемой на сегодня спецификации 2.0 А/В фирмы Bosch и международном стандарте ISO 11898, соответствуют двум начальным уровням (физическому и канальному) 7-уровневой модели взаимодействия открытых систем ISO/OSI. Ряд оригинальных технических решений, реализованных при разработке протокола, наилучшим образом позволили сориентировать его на решение задач контроля и управления.
Шинная топология, являющаяся основой CAN, требует наличия механизма адресации узлов, однако в CAN нет адресов как таковых: сообщение принимается всеми узлами. Любое передаваемое сообщение имеет определяющий его содержание уникальный идентификатор (ID), на основании которого каждый узел фильтрует "свои" сообщения и "решает" – реагировать или нет на сообщение, транслируемое в данный момент. Неоспоримыми преимуществами отсутствия адресации являются теоретически неограниченное количество узлов и простота их добавления и отключения.
Физическая среда передачи данных в CAN может быть самой разной – витая пара, плоский кабель, оптоволокно, а также радио и ИК каналы и даже линии электропередач. Основным ограничением протяженности шины является лишь предельно допустимая суммарная задержка распространения сигнала для заданной скорости передачи (в кабеле, трансиверах, входных цепях контроллеров и т.д.). В соответствии с рекомендациями ISO11898 при использовании стандартных трансиверов и быстродействующих оптопар (для гальванической развязки) максимальная протяженность сети при скорости передачи 1 Мбит/с ограничена девятью метрами. Предельная рекомендуемая протяженность сети в соответствии с тем же стандартом достигается при снижении скорости передачи до 50 кбит/с. А в документах промышленной CAN-группы CiA (CAN in Automation) приведены следующие полученные практическим путем соотношения скорость-протяженность для проводной сети без гальванической развязки: 1 Мбит/с – 30 м; 500 кбит/с – 100 м; 125 кбит/с – 500 м; 20 кбит/с – 2500 м; 10 кбит/с – 5000 м.
Сообщения, передаваемые по CAN-шине, именуются кадрами. В зависимости от инициатора передачи и ее цели, существует четыре типа кадров:
Data Frame – кадр данных;
Remote Frame – кадр запроса данных (Рис.17);
Error Frame – кадр ошибки;
Overload Frame – кадр перегрузки.
Рис.17 Кадры данных и запроса данных
Собственно для передачи данных используется Data Frame, в поле данных которого (Data Field) могут находиться от 0 до 8 байт данных.
Поле арбитража (Arbitration Field) кадра включает в себя идентификатор (ID), однозначно определяющий содержание и приоритет сообщения. Стандартным форматом сообщений (CAN Specification 2.0 А) предусмотрен 11-битный идентификатор, позволяющий различать до 2048 типов сообщений (на практике обычно до 2032), а расширенный (CAN Specification 2.0 В) – 29-битный (стандартный 11-битный с 18-битным расширением) с теоретически возможным числом типов сообщений более 536 млн. Кадры, соответствующие стандартному и расширенному форматам сообщений, приведены на рис. 18.
Несколько необычно решается проблема коллизий (столкновений в сети), присущая шинной топологии. В этом случае снова используется идентификатор сообщения в сочетании со схемой подключения к шине типа "монтажное ИЛИ", где узел, выставляющий на шину "0" – доминантный уровень, подавляет "1" – рецессивный уровень, выставленный другим узлом. Победителем в арбитраже является узел, имеющий идентификатор с наименьшим численным значением и, как следствие, наивысший приоритет. Только победивший узел продолжает передачу данных, остальные пытаются сделать это позже. Подобный режим доступа к шине известен как CSMA/CD+AMP (Carrier Sense Multiple Access with Collision Detection and Arbitration on Message Priority) – множественный доступ с контролем несущей, обнаружением коллизий и арбитражем на основе приоритета сообщений. Этот режим не позволяет поспорившим узлам устраивать столкновение на шине, а сразу выявляет победителя.
CAN-протокол, изначально разработанный специально для систем управления жизненно важными узлами автомобилей, критичных к уровню безопасности и степени достоверности передаваемых данных, обладает эффективными средствами обнаружения ошибок.
В отличие от других сетевых протоколов, в CAN не используются подтверждающие сообщения, а при обнаружении одной или более ошибок хотя бы одним узлом (в CAN все узлы принимают все сообщения и участвуют в проверке сообщения на наличие ошибок – вычисляют контрольную сумму и т.п.) текущая передача прерывается (при условии, что ошибку обнаружил как минимум один узел со статусом Error Active) генерацией кадра ошибки с флагом ошибки. Передатчик, сообщение которого было прервано, повторяет передачу.
В CAN обнаруживается три разновидности ошибок на уровне сообщений:
CRC Error. Ошибка контрольной суммы – несовпадение вычисленной и произведенной в поле CRC контрольной суммы сообщения;
Frame Error. Ошибка формата кадра – несоответствие форматов и размеров полей кадра стандартным;
Ack Error. Ошибка подтверждения – неполучение передатчиком подтверждения приема (доминантный уровень) в поле АСК.
А также два типа ошибок на битовом уровне:
Bit Error. Передающий узел обнаруживает (в любых полях, кроме полей арбитража и подтверждения) расхождение, например, из-за замыкания шины, между посланным в шину логическим уровнем и фактически на ней установленным (в CAN каждый передатчик имеет возможность контролировать свой собственный сигнал).
Stuff Error. Нарушение правил битстаффинга в сообщении наличие в поле сообщения, подлежащего битстаффингу, последовательности из шести бит с одинаковым значением.
В целях предотвращения блокирования сети неисправными узлами и повышения ее "живучести", "права доступа" к шине любого узла могут меняться в зависимости от числа зарегистрированных им ошибок. Каждый узел сети содержит два внутренних счетчика: ошибок приема и ошибок передачи. В зависимости от текущих значений этих счетчиков, узел будет переключать себя в одно из нижеприведенных состояний.
Error Active – узел принимает полноправное участие в обмене данными и при обнаружении ошибки выставит активный флаг ошибки, прервав любое ошибочное сообщение.
Error Passive – узел участвует в обмене данными, но в случае обнаружения ошибки выставляет лишь пассивный флаг ошибки и не может, таким образом, прервать любое ошибочное сообщение, за исключением своего собственного. Кроме этого, такой узел между своими последовательными передачами будет выдерживать паузу не менее 11 рецессивных бит (Suspend Transmission).
Bus Off – узел не принимает участия в обмене данными и не оказывает никакого влияния на сеть (выходные драйверы отключены).
В процессе работы узел может переходить из состояния Error Active в состояние Error Passive и обратно (например, при изменении помеховой обстановки). Выход из состояния Bus Off возможен только после программного или аппаратного сброса контроллера.
Рис.18 Стандартный и расширенный форматы кадров
Бит RTR (Remote Transmission Request – запрос передачи данных) для кадра должен иметь доминантный уровень. В расширенном формате кадра бит SRR (Substitute Remote Request) с рецессивным уровнем заменяет следующий (в стандартном формате) за 11-разрядным идентификатором бит RTR. Бит распознавания формата кадра IDE (ID Extension) имеет доминантный уровень для стандартного формата кадра и рецессивный – для расширенного. Биты r0 и r1 – резервные.
В поле управления (Control Field) содержится 4-разрядный код, задающий длину поля данных (0...8 байт), – DLC – Data Lenght Code. Поле контрольной суммы – CRC Field – включает в себя контрольную сумму сообщения (15 бит) и бит-разделитель. В поле подтверждения АСК (Acknowledgement) передающий узел всегда выставляет рецессивный уровень. В случае если передача прошла успешно, приемный узел сигнализирует об этом установкой в этом поле доминантного уровня.
Начинается кадр доминантным битом SOF (Start of Frame), служащим также для синхронизации битового потока, а заканчивается семью битами рецессивного уровня поля EOF (End of Frame) и 3-битным того же уровня промежутком между кадрами. Для исключения потери синхронизации при передаче длинной последовательности одинаковых битов в пределах полей начала кадра, арбитража, управления, данных и контрольной суммы используется битстаффинг – вставка дополнительного бита противоположного значения после подряд идущих пяти одинаковых. При приеме производится обратная операция (дебитстаффинг).
Для запроса данных от удаленного узла служит кадр запроса данных Remote Frame, также имеющий стандартный и расширенный форматы. Отличия кадра запроса данных от кадра данных – в отсутствии поля данных и рецессивном уровне бита RTR. При получении кадра запроса данных запрашиваемый узел отвечает передачей кадра данных.
Сигнализация об ошибках происходит посредством передачи кадра Error Frame. Он инициируется любым узлом (в CAN правильность передачи контролируется каждым узлом), обнаружившим ошибку.
Шесть доминантных бит флага ошибки (активный флаг ошибки) перекрывают остаток ошибочно переданного кадра и создают глобальную ошибку в сети – ошибку битстаффинга, которая воспринимается остальными узлами, если им не удалось обнаружить первоначальную (локальную) ошибку. Далее они выставляют свои флаги ошибки. Ввиду этого обстоятельства, последовательность доминантных бит (суперпозиция флагов ошибки) может иметь длину от 6 до 12 бит. Ненадежным или частично поврежденным узлам (см. ниже) при обнаружении ошибки разрешено посылать лишь пассивный флаг ошибки – последовательность шести рецессивных бит.
Для задержки передачи данных или посылки кадра запроса данных (при неготовности приемника или наличии доминантных бит в промежутке между кадрами) служит кадр перегрузки Overload Frame. В отличие от кадра ошибки он не влияет на счетчик ошибок (см. ниже) и не вызывает повторную передачу сообщения.