Глава 9 РАСПРЕДЕЛЕННЫЕ СЕТИ С ИНТЕРФЕЙСОМ msCAN

ПОСЛЕ ИЗУЧЕНИЯ ГЛАВЫ ВЫ СМОЖЕТЕ:

• Рассказать о назначении информационных промышленных сетей;

• Описать протокол CAN;

• Рассказать об аппаратных средствах, необходимых для объединения в CAN сеть нескольких микропроцессорных контроллеров;

• Создать программу синхронизации контроллеров в CAN;

• Описать различия между модулем msCAN семейства HC12 и модулем msCAN семейства HCS12;

• Создать программу для модуля msCAN12, позволяющую осуществлять связь с другими узлами CAN сети;

• Кратко рассказать о работе контроллера последовательного обмена BDLC, также позволяющего объединять МК в информационную сеть, но более медленную и менее надежную, чем CAN.

В этой главе, мы изучим еще один тип контроллера последовательного обмена, который наряду с ранее рассмотренными модулями SPI и SCI, присутствует в составе МК семейства 68HC12/HCS12. Сначала мы кратко остановимся на информационных сетях из обычных компьютеров, рассмотрим проблемы, связанные с их организацией. Далее мы исследуем возможность создания распределенных систем на основе микроконтроллеров, изучим аппаратные средства и режимы работы специального сетевого интерфейса msCAN в составе МК 68HC12/HCS12, научимся составлять простые программы для обмена сообщениями между несколькими узлами распределенной системы управления с обменом по протоколу CAN.

9.1. Компьютерные сети

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

Существует множество различных типов компьютерных сетей. Глобальная сеть (WAN — Wide Area Network), такая, например, как Internet — это компьютерная сеть, которая охватывает большую область информационных ресурсов, включая компьютерные ресурсы многих государств, стран и целых континентов. Локальная сеть (LAN — Local Area Network) — это сеть, которая существует внутри учреждения, компании, или организации — например, сеть для вашей школы или вашей компании. Малая локальная сеть (SAN — Small Area Network) — это компьютерная сеть, созданная для небольшого офиса или для нескольких домашних компьютеров. При этом типе сети число компьютеров, связанных с сетью, обычно не превышает десяти.

9.2. Промышленные сети

В этой главе мы рассмотрим локальные промышленные сети, которые объединяют некоторое количество встраиваемых микропроцессорных систем. Поскольку встраиваемые системы в соответствие с их назначением принято также именовать именовать контроллерами (от слова control — управлять), то один из наиболее перспективных стандартов промышленных сетей назвали CAN (Controller Area Network). Сети CAN появились в середине 1980-ых в автомобильной промышленности, когда возникла необходимость связать несколько микроконтроллеров автомобиля с целью повышения эффективность управления. На рис. 9.1. приведен пример такой системы, в которой сеть CAN объединяет контроллер системы подачи топлива, контроллер, следящий за уровнями нескольких жидкостей в агрегатах автомобиля, контроллер антиблокировки тормозов, контроллер привода каждого из четырех колес, контроллер регулятора температуры, контроллер приборной панели и навигационный контроллер. Достаточно быстро концепция CAN вышла за пределы автомобильной промышленности. Сегодня мы можем обнаружить сети CAN в звуковых системах, домашних театрах, системах связи, военных системах и в ряде бытовых приборов.

Рис. 9.1. Простая локальная контроллерная сеть для автомобиля


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

9.3. Сети с протоколом CAN

В этом разделе мы подробно рассмотрим локальные контроллерные сети c протоколом CAN. В частности мы изучим принципы работы интерфейсного модуля msCAN12 в составе микроконтроллеров 68HC12/HCS12 и шаги, необходимые, чтобы конфигурировать и программировать модули msCAN12 для связи с другими такими же модулями CAN. В частности мы изучим принципы работы интерфейсного модуля msCAN12 в составе микроконтроллеров 68HC12/HCS12 и шаги, необходимые, чтобы конфигурировать и программировать модули msCAN12 для связи с другими такими же модулями при их совместной работе в сети. Но прежде чем начать обсуждение свойств периферийных модулей msCAN12, опишем протокол обмена, используемый в CAN сетях.

9.3.1. Протокол CAN

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

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

Часть В версии 2.0 протокола касается уровня передачи данных и физического уровня. Уровень передачи данных в свою очередь включает в себя подуровень управления логическими связями LLC (Logical Link Control) и подуровень управления доступом к среде MAC (Medium Access Control). Совокупность функций, выполняемых подуровнями LLC, MAC и физическим уровнем, соответствует функциям объектного уровня, уровня передачи и физического уровня для части A протокола CAN 2.0. На рис. 9.2 показаны части A и B протокола CAN 2.0. В дальнейшем мы будем в равной степени использовать термины из частей A и B протокола CAN 2.0.

Рис. 9.2. Соответствие терминов модели ISO/OSI для протоколов CAN 2.0 A/B


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

Данные в CAN передаются короткими сообщениями — кадрами стандартного формата. В CAN существуют четыре типа сообщений: кадр данных, кадр удаленного запроса, кадр ошибки и кадр перегрузки. Проведем короткий обзор этих типов кадров.

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

Рис. 9.3. Кадр данных CAN


Идентификатор содержит 11 для стандартного формата и 29 бит расширенного формата кадра данных. Поле арбитража также содержит бит удаленного запроса передачи (RTR), который используется, чтобы отличить кадр данных от кадра удаленного запроса. Для кадра данных этот бит должен быть доминантным (логический нуль), для кадра удаленного запроса — рецессивным (логическая 1).

Поле управления содержит четыре бита, которые определяют длину данных в байтах. Длина данных определяется четырьмя отдельными битами, позволяя устанавливать значение от одного до восьми байт. Поскольку рецессивный бит соответствует передаче логической 1, то четыре активных бита в этом поле информируют о длине поля данных, равной 0. Поле данных содержит фактическое сообщение кадра передачи. Старший бит каждого байта передается первым. Поле проверки данных содержит контрольное число, которое используется принимающим узлом для проверки отсутствия ошибок в принятом кадре. Контрольное число формируется по специальным правилам (CRC код), с которыми читатель может подробно ознакомиться в литературе, приведенной в конце главы. Поле подтверждения (ACK) содержит два бита. Передающий узел в поле подтверждения выставляет две 1. Если прием данных завершился успешно, то принимающий узел в первом бите выставляет на шину 0. Передающий узел в процессе передачи осуществляет считывание состояния шины. Поэтому наличие доминантного уровня 0 в первом бите поля подтверждения будет воспринято им как подтверждение приема данных. Первый бит поля подтверждения называется ACK-Slot, второй ACK-Delimiter. Поле конца кадра представляет собой последовательность из семи единичных битов, которые свидетельствуют об окончании кадра.

Кадр удаленного запроса используется принимающими узлами, чтобы запросить повторную передачу кадра данных. Кадр удаленного запроса идентичен кадру данных за исключением того, что он не содержит поля данных. Для того, чтобы принимающий узел мог отличить кадр удаленного запроса от кадра данных, в поле арбитража предусмотрен специальный бит RTR. Рецессивное состояние бита RTR (логическая 1) обозначает кадр удаленного запроса, а доминантное состояние (логический 0) — кадр данных.

Кадр ошибки, представленный на рис. 9.4, информирует узлы сети о том, что на шине CAN произошла ошибка. Каждый кадр ошибки состоит из поля признака ошибки и поля разделителя ошибки. Поле признака ошибки содержит либо активные флаги ошибки (шесть доминантных бит), либо пассивные флаги ошибки (шесть рецессивных бит). Мы дадим определение понятиям активных и пассивных ошибок в разделе обработки ошибок. Следует заметить, что в системах с многочисленными узлами на шине CAN число доминантных бит в признаке ошибки может увеличиваться до 12. Это необходимо, чтобы все компоненты системы могли использовать флаги ошибки. Поле разделителя ошибки состоит из восьми рецессивных бит.

Рис. 9.4. Кадр ошибки CAN


Кадр перегрузки, как показано в рис. 9.5, имеет тот же формат, что и кадр ошибки. Флаг перегрузки составлен из шести доминантных бит. Биты флага перегрузки устанавливаются, когда:

• принимающий узел не может обработать корректные кадры за выделенное время, и требует задержки;

• на интервале паузы появился доминантный бит.

Рис. 9.5. Кадр перегрузки CAN


Кадры данных и удаленного запроса на шине CAN отделяются от других кадров интервалами паузы, которые состоят, по крайней мере, из трех рецессивных бит. Разделитель перегрузки составлен из восьми рецессивных бит.

Обработка ошибок. Во время передачи сообщения по CAN шине могут происходить ошибки. Когда активным (передающим сообщение) или пассивным (принимающим) узлом системы обнаружена ошибка, соответствующий узел выставляет на шину кадр ошибки, рассмотренный выше. Если активный узел передает кадр ошибки, флаг ошибки называется активным флагом ошибки; если ошибка зафиксирована в пассивном узле, то и флаг называется пассивным. Имеются пять типов ошибок, которые могут вызывать передачу кадра ошибки: ошибка разряда (1), ошибка заполнения (2), ошибка избыточности (3), ошибка формы (4) и ошибка подтверждения (5).

Ошибка разряда происходит, когда передающий узел обнаруживает несоответствие выставляемого на шину бита и реального состояния шины в тот же момент времени. Флаг ошибки заполнения устанавливается, когда контроллер CAN обнаруживает в передаваемом кадре шесть последовательных доминантных или шесть последовательных рецессивных бит. Ошибка контроля происходит, когда значение контрольного числа CRC, вычисленное приемником, не соответствует контрольному числу CRC, полученному в конце передачи. Ошибка формы фиксируется, когда в одном из полей кадра содержатся недопустимые биты. И наконец, ошибка подтверждения происходит, когда отсутствует доминантный бит в поле ACK-Slot.

Синхронизация бита. На рис. 9.6 показано, что интервал времени передачи одного бита по шине CAN разбивается на четыре временных сегмента: сегмент синхронизации, сегмент распространения, сегмент буфера фазы 1 и сегмент буфера фазы 2. На интервале первого сегмента появляется фронт, который используется, чтобы синхронизировать узлы, подключенные к шине. Выборка логического состояния бита производится после окончания сегмента буфера фазы 1 (точка выборки). Сегмент времени распространения учитывает задержку передатчика и приемника и время распространения сигнала по шине. Сегменты фазы 1 и 2 могут увеличиваться или уменьшаться по длительности посредством программных уставок при инициализации. Такое решение позволяет увеличить надежность передачи данных по шине.

Рис. 9.6. Номинальные сегменты времени передачи бита

9.3.2. Модуль контроллера последовательного обмена msCAN12

Микроконтроллеры 68HC912BC32, 68HC912D60, 68HC912DG128 и 68HC912DT128 имеют в своем составе один или несколько встроенных контроллеров последовательного обмена в стандарте CAN. Эти контроллеры принято называть модулями msCAN (Motorola Scalable Controller Area Network). Семейство 68HC12/HCS12 отличается тем, что модели МК, входящие в его состав, оснащены сразу несколькими модулями msCAN. Например, МК 68HC912BC32 и 68HC912D60 имеют в своем составе один модуль msCAN, 68HC912DG128 — 2 модуля, 68HC912DT128 — 3 модуля, а в семействе HCS12 возможен даже вариант МК с 5 модулями «на борту».

Модули msCAN в составе разных МК полностью идентичны, работают в соответствии с протоколом CAN версии 2.0 A/B. Далее мы подробно рассмотрим, как работает один из них, в составе МК MC9S12DP256.

Каждый модуль msCAN связывается с внешним миром, используя выход TxCAN, подключенный к передатчику, и вход RxCAN, связанный с приемником. Названные входы/выходы МК через схему преобразования уровней, называемую трансивером CAN, подключены к CAN шине. Каждый модуль msCAN состоит трех подсистем: блока передатчика, блока приемника и блока прерывания. Мы опишем каждую из этих подсистем в следующих разделах.

Режимы работы CAN. Прежде, чем перейти к рассмотрению каждой из подсистем, входящих в состав модуля контроллера msCAN, сравним нормальный режим работы контроллера msCAN12 с его работой в режиме энергосбережения. Когда модуль CAN неактивен (т.е. не производит обмена с другим устройством по CAN шине), пользователь заинтересован в том, чтобы уменьшить мощность потребления самого модуля msCAN12. Для этого необходимо перевести модуль msCAN12 в энергосберегающий режим. Каждый модуль msCAN12 может работать не только в нормальном, но и в трех энергосберегающих режимах: спящем режиме, режиме программного сброса и режиме отключения.

Выбор одного из трех энергосберегающих режимов выполняется путем соответствующей конфигурации msCAN12 посредством изменения состояния регистра управления CMCR0, формат которого показан на рис. 9.7.

Рис. 9.7. Формат регистра управления CMCR0


Пятый бит этого регистра CSWAI (CAN-Stops-in-Wait) представляет собой бит выбора режима останова или режима ожидания. Если этот бит очищен, модуль переходит в режим ожидания. Если бит CSWAI =1, модуль не получает сигналов синхронизации, т.е останавливается. Четвертый бит — бит синхронизации SYNCH — указывает, готов ли модуль CAN к связи с другими узлами сети. Когда этот бит очищен, msCAN12 не синхронизирован с шиной CAN, когда же бит установлен, то msCAN12 и шина CAN синхронизированы. Третий бит TLNKEN представляет собой бит состояния входа таймера. Когда этот бит очищен, то вход таймера связан с соответствующим портом. Если же установлен, это указывает, что на вход таймера подается выходной сигнал msCAN12.

Второй бит SLPAK является флагом спящего режима. Он показывает, находится или нет контроллер msCAN12 в спящем режиме: логический 0 указывает, что msCAN12 не находится в спящем режиме, в то время, как логическая 1, показывает что этот режим установлен. Бит запроса спящего режима SLPRQ используется, чтобы запросить перевод модуля msCAN12 в спящий режим: установка этого бита заставляет модуль функционировать в рабочем режиме, очистка — переводит модуль в спящий режим.

И наконец, бит SFTRES используется центральным процессором, чтобы немедленно перевести модуль msCAN12 в состояние сброса. Когда этот бит установлен, любая текущая передача информации прерывается и прекращается синхронизация контроллера CAN с шиной CAN. Когда этот бит очищен, msCAN12 работает в нормальном режиме.

Флаги SFTRES, SLPAK и CSWAI регистра CMCR0 используются, чтобы выбрать один из четырех режимов работы msCAN12 (нормальный, программного сброса, спящий и выключения). Мы обсудим эти режимы в следующих трех разделах. Поскольку ЦП микроконтроллера 68HC12 может работать в трех режимах (рабочем, ожидания и останова), имеются 12 возможных комбинаций режимов функционирования ЦП и модуля msCAN12. Четыре из этих 12 комбинаций не могут быть реализованы.

Когда ЦП функционирует в рабочем режиме, модуль msCAN12 может функционировать в спящем режиме, режиме программного сброса или в нормальном режиме. Режим выключения не допускается. ЦП может выбрать один из режимов msCAN12, конфигурируя три бита регистра CMCR0 следующим образом:

• Спящий режим: CSWAI = 0 или 1, SLPAK = 1 и SFTRES = 0;

• Режим программного сброса: CSWAI = 0 или 1, SLPAK = 0 и SFTRES = 1;

• Нормальный режим: CSWAI = 0 или 1, SLPAK = 0 и SFTRES = 0.

Обратите внимание, что бит SLPAK предназначен только для чтения и не может быть изменен под управлением программы. Чтобы установить или очистить бит SLPAK, Вы должны установить или очистить бит SLPRQ (бит 1) регистра CMCR0.

Когда ЦП функционирует в режиме ожидания, модуль msCAN12 может функционировать в любом из четырех режимов. Следующие конфигурации из трех битов в регистре CMCR0 используются, чтобы назначить один из нижеперечисленных режимов:

• Режим выключения: CSWAI = 1, SLPAK = 0 или 1 и SFTRES = 0 или 1,

• Спящий режим: CSWAI = 0, SLPAK = 1 и SFTRES = 0,

• Режим программного сброса: CSWAI = 0, SLPAK = 0, и SFTRES = 1,

• Нормальный режим: CSWAI = 0, SLPAK = 0 и SFTRES = 0.

И наконец, когда ЦП функционирует в режиме останова, контроллер msCAN12 может находиться только в выключенном режиме. Когда ЦП вводит режим останова, то независимо от состояния битов CSWAI, SLPAK, и SFTRES регистра CMCR0, модуль msCAN12 вынужден перейти в режим выключения. Все другие режимы для модуля msCAN12 при этом невозможны.

Спящий режим msCAN12. Когда 68HC12 не вовлечен в активный обмен информацией с другими узлами сети, а ЦП функционирует в активном режиме либо в режиме ожидания, модуль msCAN12 может находиться в спящем режиме, переводя бит SLPAK в состояние логической 1. Еще раз повторим, что бит SLPAK устанавливается или очищается, битом SLPRQ регистра CMCR0. При этом внутренний таймер модуля msCAN12 останавливается. Модуль MsCAN12 переходит в спящий режим немедленно после того, как установлен бит SLPAK. Исключение составляют два следующих случая:

• когда при установке бита SLPAK модуль msCAN12 передает данные, он переходит в спящий режим только после того, как передача данных заканчивается;

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

Модуль msCAN12 выходит из спящего режима, если происходит одно из трех следующих событий:

• выполняется команда ЦП очистить бит SPLPRQ, вызывающая сброс бита SLPAK;

• выполняется команда ЦП установить бит SFTRES;

• на шине CAN появляются данные, предназначенные для соответствующего контроллера.

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

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

Модуль входит в режим отключения либо при переходе ЦП в режим останова, либо при установке бита CSWAI, в то время как ЦП работает в режиме ожидания.

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

Подсистема передатчика. Как только ЦП микроконтроллера 68HC12 создаст сообщение, передатчик модуля msCAN12 должен корректно переслать его в сеть CAN. Рассмотрим структуру подсистемы передатчика.

Адрес Имя Регистра
0150 Регистр идентификатора 0
0151 Регистр идентификатора 1
0152 Регистр идентификатора 2
0153 Регистр идентификатора 3
0154 Регистр сегмента данных 0
0155 Регистр сегмента данных 1
0156 Регистр сегмента данных 2
0157 Регистр сегмента данных 3
0158 Регистр сегмента данных 4
0159 Регистр сегмента данных 5
015A Регистр сегмента данных 6
015B Регистр сегмента данных 7
015C Регистр длины данных

Передающий буфер 0

Адрес Имя Регистра
0160 Регистр идентификатора 0
0161 Регистр идентификатора 1
0162 Регистр идентификатора 2
0163 Регистр идентификатора 3
0164 Регистр сегмента данных 0
0165 Регистр сегмента данных 1
0166 Регистр сегмента данных 2
0167 Регистр сегмента данных 3
0168 Регистр сегмента данных 4
0169 Регистр сегмента данных 5
016A Регистр сегмента данных 6
016B Регистр сегмента данных 7
016C Регистр длины данных

Передающий буфер 1

Адрес Имя Регистра
0170 Регистр идентификатора 0
0171 Регистр идентификатора 1
0172 Регистр идентификатора 2
0173 Регистр идентификатора 3
0174 Регистр сегмента данных 0
0175 Регистр сегмента данных 1
0176 Регистр сегмента данных 2
0177 Регистр сегмента данных 3
0178 Регистр сегмента данных 4
0179 Регистр сегмента данных 5
017A Регистр сегмента данных 6
017B Регистр сегмента данных 7
017C Регистр длины данных

Передающий буфер 2

Рис. 9.8. Структура буферов передачи модуля msCAN12


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

а)

б)

Рис. 9.9. Формат регистров идентификатора IDR0, IDR1, IDR2, и IDR3

а) при использовании протокола CAN 2.0A

б) при использовании протокола CAN 2.0B


Рассмотрим каждый регистр передающего буфера. Четырехбайтовый регистр идентификатора определяет, соответствует ли сообщение протоколу Bosch CAN 2.0A или Bosch CAN 2.0B. Первый из них требует 11-разрядного идентификатора, (стандартный формат), последний — 28-разрядного идентификатора (расширенный формат). На рис. 9.9a показано назначение каждого бита для четырех регистров идентификатора при использовании стандартного формата, на рис. 9.9б — то же для регистров расширенного формата.

Значения регистра идентификатора присваивают каждому сообщению номер, который другие модули сети CAN используют, чтобы распознать предназначенные для них сообщения. Флаг удаленного запроса передачи RTR (бит 4 IDR1 для стандартного формата или бит 0 IDR3 для расширенного формата) дает информацию о том, содержит ли буфер, посылающий данные другим модулям CAN, фактические сообщения или это просто запрос к другому модулю CAN, чтобы снова повторить сообщение. Если этот флаг сброшен, значит буфер содержит фактическое сообщение, если же установлен, то буфер используется, чтобы просто запросить повторную передачу сообщения. Контроллер CAN принимающего узла может использовать этот флаг, чтобы отличить данные от запроса.

Идентификатор расширенного формата IDE (бит 3 IDR1) определяет, использует ли передающий буфер стандартный или расширенный формат: логический 0 соответствует стандартный формату (11 бит), а логическая 1 — расширенному формату (29 бит). И наконец, флаг удаленного запроса SRR (бит 4 регистра IDR1) для расширенного формата должен всегда быть логической 1.

Восьмибайтовые регистры данных содержат фактические данные для пересылки. Передается содержимое регистра данных 0, затем содержимое регистра данных 1, регистра 2, и т.д, пока число байтов данных, не достигнет значения, записанного в регистре длины данных. Для каждого регистра сегмента данных, сначала передается бит 7. Регистр длины данных определяет число байтов данных, содержащихся в буфере передачи. На рис. 9.10 показан каждый бит регистра длины данных. Мы используем биты 0, 1, 2 и 3, чтобы обозначить число байтов данных. Для этого достаточно использовать только четыре бита, так как максимальное число байтов данных установлено равным восьми, в соответствии с числом регистров сегмента данных. Мы определяем число байтов данных как двоичное число при использовании бита 3 в качестве старшего бита. Например, если число байтов данных составляет 5, мы задаем следующие значения четырех битов: DLC3 = 0, DLC2 = 1, DLC1 = 0 и DLC0 = 1. Если мы используем все восемь байтов качестве данных, необходимо установить другие значения битов: DLC3 = 1, DLC2 = 0, DLC1 = 0 и DLC0 = 0.

Рис. 9.10. Формат регистра длины данных

Биты DLC3, DLC2, DLC1 и DLC0 используются, чтобы указать число байтов, содержащихся в регистрах сегмента данных


Чтобы загрузить регистры, показанные на рис. 9.8, желаемыми значениями прежде, чем осуществить любую передачу, должны быть выполнены соответствующие команды 68HC12. Например, следующий фрагмент программы на Си загружает передающий буфер 0 идентификатором $4D43 (представляющим собой символы «MC» в ASCII коде, поскольку используется контроллер фирмы Motorola) и сообщением $12345678, используя расширенный формат.

char *buffer;

buffer = 0x0150;

*buffer = 0x4D; /*загрузить IDR0 кодом символа M */

*(buffer+1) = 0x58; /* загрузить IDR1, установить SRR = 1 и IDE=1 */

*(buffer+2) = 0xC0; /* загрузить IDR2 кодом символа С */

*(buffer+3) = 0x00; /* биты от ID20 до ID13 ,чтобы представить С */

*(buffer+4) = 0x12; /* загрузить */

*(buffer+5) = 0x34;

*(buffer+6) = 0x56;

*(buffer+7) = 0x78;

*(buffer+8) = 0x00;

*(buffer+9) = 0x00;

*(buffer+10) = 0x00;

*(buffer+11) = 0x00;

*(buffer+12) = 0x04; /* данные длиной в 4 байта */

*(buffer+13) = 0x00; /* установить наивысший приоритет */

Так как имеется три передающих буфера, модуль msCAN12 должен иметь некоторые средства, чтобы передавать записанную в них информацию в порядке, определяемом ее важностью. Упорядочение трех буферов осуществляется с помощью регистра приоритета буферов передачи (рис. 9.11). Регистр приоритета буферов передачи, также как и 13-байтовый буфер, связан с каждым из передающих буферов. Контроллер msCAN12 оценивает значение приоритета для трех передавших буферных регистров, и определяет порядок передачи информации из каждого регистра. Чем меньше значение, записанное в регистре приоритета, тем выше приоритет, соответствующего буфера. В случаях, когда значения приоритетов равны, буфер с самым низким индексом получает наиболее высокий приоритет.

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


Рассмотрим теперь три специальных регистра передающего модуля: регистр флагов CTFLG передатчика, регистр управления передатчика CTCR и регистр счетчика ошибок CTXERR. Формат регистра CTFLG показан на рис. 9.12. Биты 2, 1 и 0 являются флагами пустого буфера передачи, которые указывают, пуст или заполнен соответствующий буфер передачи. Логическая 1 указывает, что данный буфер передачи пуст и готов к новому использованию. Мы должны очистить этот флаг (записать 1 в соответствующий бит) после загрузки передающего буфера. Флаг также устанавливается в случае успешного выполнения запроса на аварийное прекращение работы передатчика. Биты 7 и 3 этого регистра не используются.

Рис. 9.12. Формат регистра CTFLG


Биты от 6 до 4 представляют собой флаги аварийного прекращения работы, показывающие, что выполнен запрос на аварийное прекращение работы. Логическая 1 показывает, что данное сообщение не было прервано; логический 0 свидетельствует, что сообщение было успешно прервано. Флаги запроса аварийного прекращения работы автоматически очищаются, когда сбрасываются флаги пустого буфера передачи.

Запрос на аварийное прекращение работы может быть сделан при изменении состояния регистра другого модуля передачи, названного регистром управления передатчиком CTCR. Формат регистра CTCR показан на рис. 9.13. В этом регистре также не используются биты 7 и 3. Программист может разработать программу, позволяющую запросить аварийное прекращение передачи с помощью битов 4, 5 и 6 этого регистра. Логический 0 соответствует отсутствию запроса, а логическая 1 показывает, что появился запрос. Когда сообщение успешно прерывается, соответствующий флаг TXE и флаг ABTAK устанавливается в CTFLG. Программист не может непосредственно очистить биты ABTRQ, но они очищаются при установке соответствующих TXE флагов в регистре CTFLG.

Рис. 9.13. Формат регистра управления передатчиком msCAN12


Биты 2, 1 и 0 — это флаги разрешения на локальное прерывание, связанные с флагами пустого буфера в регистре CTFLG. Логическая 1 указывает, что соответствующий буфер передачи пуст (установлен флаг TXE в регистре CTFLG), вызвано прерывание из-за пустого передающего буфера. Логический нуль выключает систему прерывания.

Последним регистром, связанным с подсистемой передатчика модуля msCAN12, является регистр счетчика ошибок CTXERR. Как показывает его название, этот регистр подсчитывает число ошибок передачи. Когда контроллер msCAN12 находится в спящем режиме или в режиме программного сброса, регистр счетчика ошибок доступен только для чтения. Формат регистра счетчика ошибок показан на рис. 9.14.

Рис. 9.14. Счетчик ошибок передачи msCAN


Подсистема приемника. Приемный модуль контролера msCAN12 состоит из двух 13-байтовых буферов, восьми регистров идентификаторов приема CIDAR0…CIDAR7, восьми маскируемых фильтров идентификаторов приема CIDMR0…CIDMR7, регистра флагов приемника CRFLG, регистра разрешения прерываний приемника CRIER, регистра управления идентификаторами приема CIDAC и одного счетчика ошибок приемника CRXERR. В этом разделе, мы рассмотрим каждый из этих компонентов приемного модуля msCAN12.

Естественно, два 13-байтовых буфера используют тот же формат, что и буфер передачи msCAN12, показанный на рис. 9.8. Сообщения, посылаемые устройством, подключенным к сети CAN, принимаются другими устройствами сети через эти буферы. Первым из приемных буферов, является так называемый предварительный буфер приема RxBG. Именно в него поступают сначала внешние сообщения. Второй приемный буфер, называемым основным буфером RxFG, доступен для ЦП 68HC12. Два буфера физически различны, но RxBG отображается в RxFG с помощью механизма, который мы рассмотрим далее в этом разделе, что заставляет буферы содержать одни и те же адреса. RxFG занимает физические адреса от $0140 до $014C.

Когда в сети появляется сообщение, оно сначала записывается в буфер RxBG. Параллельно с этим, сообщение проходит также через ряд фильтров, позволяющих определить, должно ли быть принято данное сообщение, и предназначено ли оно для данного устройства. Процесс фильтрации программируется с помощью регистра управления идентификаторами приема CIDAC, восьми регистров идентификаторов приема CIDAR0…CIDAR7 и восьми маскируемых фильтров идентификаторов приема CIDMR0…CIDMR7. Рассмотрим функции этих регистров.

Регистр CIDAC управляет типом фильтрации входящих сообщений. Кроме того, регистр содержит флаги, которые показывают, что получены сообщения с корректными идентификаторами, которые готовы к прочтению их ЦП 68HC12. На рис. 9.15 показан формат регистра CIDAC. Все биты за исключением битов 5 и 4 (IDAM1:IDAM0) предназначены только для чтения. Информация в биты IDAM1:IDAM0 может быть записана только, если при инициализации установлен бит SFTRES в регистре CMCR0. Биты 7, 6 и 3 не используются.

Рис. 9.15. Формат регистра CIDAC


Следующие комбинации битов IDAM1:IDAM0 определяют число фильтров и размер каждого фильтра, необходимые чтобы установить режим принятия идентификатора.

• IDAM1=0 и IDAM0=0: используется два 32-разрядных фильтра приема

• IDAM1=0 и IDAM0=1: используется четыре 16-разрядных фильтра приема

• IDAM1=1 и IDAM0=0:используется восемь 8-разрядных фильтров приема

• IDAM1=1 и IDAM0=1: не используется никаких фильтров приема (фильтры закрыты)

Когда IDAM1 и IDAM0 равны 1, все сообщения игнорируются, и не записываются в основной буфер RxFG. Биты IDHIT2, IDHIT1, и IDHIT0 указывают на совпадения идентификаторов приема. Эти флаги устанавливаются, когда фильтры указывают, что обнаружены совпадения и буфер RxFG модифицирован. Состояния этих трех битов соответствуют следующем событиям:

• IDHIT2 = 0, IDHIT1 = 0 и IDHIT0 = 0: совпадение с фильтром 0

• IDHIT2 = 0, IDHIT1 = 0 и IDHIT0 = 1: совпадение с фильтром 1

• IDHIT2 = 0, IDHIT1 = 1 и IDHIT0 = 0: совпадение с фильтром 2

• IDHIT2 = 0, IDHIT1 = 1 и IDHIT0 = 1: совпадение с фильтром 3

• IDHIT2 = 1, IDHIT1 = 0 и IDHIT0 = 0: совпадение с фильтром 4

• IDHIT2 = 1, IDHIT1 = 0 и IDHIT0 = 1: совпадение с фильтром 5

• IDHIT2 = 1, IDHIT1 = 1 и IDHIT0 = 0: совпадение с фильтром 6

• IDHIT2 = 1, IDHIT1 = 1 и IDHIT0 = 1: совпадение с фильтром 7

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

Пропустит или не пропустит данный фильтр сообщение, определяется состоянием регистров идентификаторов приема CIDAR0…CIDAR7 и регистров идентификаторов маскирования CIDMR0…CIDMR7. Функции этих регистров изменяются в зависимости от состояния битов IDAM1 и IDAM0 регистра CIDAC. Когда эти биты инициализируют режим двух 32-разрядных фильтров, каждый из этих фильтров сравнивает поразрядно часть регистра идентификатора с четырьмя байтами входного сообщения. Регистры маскирования идентификатора затем определяют, принимается или не принимается сообщение. На рис. 9.16 показаны восемь регистров идентификаторов приемников, на рис. 9.17 восемь регистров маскирования идентификаторов.

Рис. 9.16. Формат регистров идентификаторов приемников CIDAR0…CIDAR7


Рис. 9.17. Формат регистров маскирования идентификаторов CIDMR0…CIDMR7


Данные в регистры CIDAR0–CIDAR7 и CIDMR0–CIDMR7 заносятся только в том случае, когда при инициализации в CMCR0 установлен бит SFTRES. Для регистров CIDMR, логическая 1 сообщает, чтобы фильтры игнорировали данный бит кода идентификатора, в то время как логический 0 указывает, что должно быть установлено соответствие для данного бита. На рис. 9.18 показан случай, когда программируется режим двух 32-разрядных фильтров приема. На рисунке приведен как случай соответствия фильтру 0, так и случай соответствия фильтру 1 и отображены процессы при использовании стандартного формата идентификаторов (Bosch CAN, 2.0A) и расширенного формата (Bosch CAN 2.0B). Напомним еще раз, что стандартный формат использует только 11-разрядные идентификаторы, а расширенный — 29-разрядные идентификаторы.

а)

б)

Рис. 9.18. Процесс идентификации приемников: режим с двумя 32-разрядными фильтрами


Когда состояние битов IDAM1 и IDAM0 регистра CIDAC соответствует режиму четырех 16-разрядных приемных фильтров, могут использоваться только 11-разрядные идентификаторы и биты RTR (в регистрах IDR0 и IDR1) согласуются с сообщениями формата CAN 2.0A. Сообщениям в формате CAN 2.0B сопоставляются 14 значащих разрядов идентификатора. На рис. 9.19 показан процесс идентификации приемников для режима с четырьмя 16-разрядными фильтрами.

Рис. 9.19. Процесс идентификации приемников: режим с четырьмя 16-разрядными фильтрами


И наконец, когда биты IDAM1 и IDAM0 программируют работу в режиме восьми 8-разрядных фильтров, только восемь старших битов используются, чтобы пропустить или заблокировать входящие сообщения как в формате CAN 2.0A, так и в формате CAN 2.0B. На рис. 9.20 показан процесс идентификации для режима с восемью 8-разрядными фильтрами.

Рис. 9.20. Процесс идентификации приемников: режим с восемью 8-разрядными фильтрами


Обсудим теперь еще два регистра, связанные с приемным модулем. Первый из них — регистр флагов приемника CRFLG (рис. 9.21). Каждый бит этого регистра, кроме RXF, может быть очищен посредством записи в него логической 1. За исключением флага полного буфера RXF, все другие флаги используются, чтобы вызывать ряд прерываний. Флаг прерывания по событию пробуждения WUPIF (бит 7) используется, чтобы обнаружить воздействие сети CAN, когда контроллер msCAN12 находится в спящем режиме: логический 0 в этом бите указывает, что не имеется никакого воздействия шины, логическая 1 показывает, что на вход приемника контроллера msCAN12 пришел запрос на прерывание спящего состояния. Флаг аварийного прерывания приема RWRNIF устанавливается, когда одновременно происходят следующие события: число ошибок превышает 96; флаг пассивного прерывания по ошибке приемника RERRIF сброшен; флаг пассивного прерывания по ошибке передатчика TERRIF сброшен; флаг прерывания «шина отключена» BOFFIF также сброшен. Низкое логическое состояние показывает, что нет аварийной ситуации на всех приемниках. Высокое логическое состояние показывает, что приемник msCAN12 находится в аварийном состоянии.

Рис. 9.21. Формат регистра флагов приемников CRFLG


Флаг TWRNIF (бит 5) используется, чтобы проверить, аварийное состояние передатчика. Логическая единица, соответствующая аварийному состоянию, появляется, когда одновременно происходят следующие четыре события:

• число ошибок передачи превышает 96;

• бит RERRIF находится в состоянии нуля;

• бит TERRIF находится в состоянии нуля;

• бит BOFFIF находится в состоянии нуля.

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

Флаг RERRIF (бит 4) используется, чтобы указать, находится или нет модуль msCAN12 в состоянии пассивной ошибки. Этот флаг устанавливается, когда число полученных ошибок находится в диапазоне от 128 до 255, и бит BOFFIF равен нулю. Установка бита RERRIF в 1 показывает, что модуль msCAN12 вошел в состояние пассивной ошибки приемника, в то время как очистка бита показывает, что модуль msCAN12 не находится в этом состоянии. Точно так же установка флага TERRIF (бит 3) показывает, что модуль msCAN12 вошел в состояние пассивной ошибки передатчика. Модуль входит в это состояние, когда число ошибок передачи находится в диапазоне от 128 до 255 и флаг BOFFIF сброшен.

И, наконец, флаг заполнения приемного буфера RXF (бит 0) устанавливается, когда модуль msCAN12 желает «сообщить» процессорному ядру МК, что получено новое непрочтенное сообщение. ЦПУ сбрасывает этот флаг, чтобы перегрузить новое сообщение с предварительного буфера в основной. Логическая 1 указывает, что имеется готовое сообщение, а логический 0, что новых сообщений нет.

Последним регистром, связанным с приемным модулем, является регистр счетчика ошибок приемника CRXERR (рис. 9.22). Этот регистр подсчитывает число ошибок приема и предназначен только для чтения.

Рис. 9.22. Формат регистра счетчика ошибок приемника CRXERR


Мы заканчиваем этот раздел фрагментом программы, позволяющим конфигурировать приемный модуль для приема определенного набора сообщений. Текст программного фрагмента предполагает, что все имена используемых регистров были правильно определены в файле заголовка А мы лишь устанавливаем модуль приемника в режим 16-разрядного фильтра, чтобы получить данные со значением идентификатора $28E при использовании стандартного формата. Кроме того, мы программируем это, чтобы искать соответствие только по фильтру 0.

   :

   :

   :  /*включить модуль msCAN, инициализировать его */

   :  /*ввести режим программного сброса: установить SFTRES =1*/

   :  /*конфигурировать 16-разрядный режим приемного */

     /* фильтра: установить IDAM1 = 1, IDAM0 = 0*/

line i  CIDAC = $10;

line i+1 CIDMR0 = $00;

     /*задать значения первых 11 бит, RTR и IDE бит*/

line i+2 CIDMR1 = $07;

   :  /*установить все другие CIDMRx регистры to have*/

     /*$00: игнорировать остальные биты*/

line j  CIDAR0 = $51;

     /*%01010001 bits 10 - 3 of ID*/

line j+1 CIDAR1 = $C0;

     /*%11000000 bits 2 - 0 of ID, RTR = 0, и */

     /*IDE =0*/

   :

   :  /*ввести рабочий режим : установить SFTRES = 0 */

   :

   :  /*дождаться установки флага приема и просмотреть */

      /*соответствие фильтру 0, чтобы считать данные*/

Подсистема прерывания контроллера msCAN12.

Модуль msCAN12 имеет четыре типа прерываний: прерывание пробуждения (1), прерывания по ошибкам (6), прерывание при заполнении буфера приема (1) и прерывания при пустом буфере передатчика (3). В скобках указано число возможных прерываний, связанных с каждым из классифицированных типов.

Прерывание пробуждения допускается, когда установлен флаг WUPIE (бит 7) в регистре CRIER разрешения прерываний приемника msCAN12 (рис. 9.23). Если обнаружена активность шины, прерывание, связанное с пробуждением, инициализируется сразу после установки флага WUPIE.

Рис. 9.23. Формат регистр разрешения прерывания приема CRIER


Контроллер msCAN12 имеет шесть различных прерываний по ошибкам. Первое из эти шести — аварийное прерывание приема, которое допускается, когда в регистре CRIER установлен бит RWRNIE (бит 6). Если при этом обнаружено событие, вызывающее состояние аварийного прерывания приема, то устанавливается связанный с этим флаг RWRNIF в регистре CRFLG и выполняется соответствующая пользовательская программа обработки прерывания. Когда установлен бит TRWNIE (бит 5) регистра CRIER, состояние аварийного прерывания передачи устанавливает флаг TWRNIF в регистре CRFLG, и выполняется другая пользовательская программа обработки прерывания.

Третье и четвертое прерывания ошибки связаны с состояниями пассивной ошибки приемника и передатчика. Биты RERRIE и TERRIE в регистре CRIER — это локальные биты маскирования, которые разрешают пассивное прерывание по ошибке приемника и передатчика, соответственно. Запросы на прерывания генерируются флагами RERRIF и TERRIF регистра CRFLG.

Пятое прерывание ошибки связано с состоянием отключения от шины. Это прерывание, разрешаемое битом BOFFIE регистра CRIER, возникает, когда обнаружено, что подсистема приемника контроллера msCAN12 обнаружила отключение от CAN шины и установила бит BOFFIF в регистре CRFLG.

Последнее прерывание ошибки связано с потерей данных, которая происходит, когда в момент поступления значимого сообщения заполнены и предварительный и основной буферы приема. Прерывание разрешается битом OVRIF в регистре CRIER, ему соответствует флаг OVRIF в регистре CRFLG.

Прерывание по событию приема сообщения разрешается установкой бита RXFIE в регистре CRIER. Запрос на прерывание генерируется, когда приемником модуля msCAN12 получены достоверные данные, готовые для чтения ЦПУ МК. Это событие отмечается установкой флага заполнения приемного буфера RXF регистра CRFLG.

Три прерывания, создаваемые при пустых передающих буферах, разрешаются битами TXEIE0, TXEIE1, и TXEIE2 регистра управления передатчиком CRCR для буферов передатчиков 0, 1 и 2, соответственно. Когда буфер передатчика освобожден для нового сообщения (пуст), устанавливается соответствующий флаг TXE0, TXE1 или TXE2 регистра CTFLG, и, если соответствующее прерывание разрешено, то выполняется соответствующая пользовательская программа обслуживания прерывания.

9.3.3. Проблемы синхронизации

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

Модуль msCAN12 рассчитан передачу информации по шине CAN со скоростью от 10 000 до 1 000 000 бит/с. Программист самостоятельно выбирает соответствующий источник синхронизации контроллера CAN с помощью бита CLKSRC в регистре управления CMCR1 (рис. 9.24).

Рис. 9.24. Формат регистра управления CMCR1


Информация в регистр CMCR1 может быть записана только после установки бита SFTRES в регистре CMCR0 в состояние логической 1. Объясним вкратце назначение трех битов регистра CMCR1 прежде, чем продолжить обсуждение. Бит циклического режима самопроверки (LOOPB, бит 2) используется, чтобы конфигурировать msCAN12 контроллер для самопроверки функций шины CAN для данного контроллера CAN. Если этот бит очищен, CAN контроллер работает как узел сети CAN, подключенный к шине. Если этот бит установлен, активизируется цикл, самопроверки, вызывая передачу последовательности битов на приемник самого контроллера. В этом режиме логическое состояние на входе RxCAN игнорируется, а логическое состояние на выходе TxCAN устанавливается в 1 (рецессивное состояние). Все прерывания CAN могут происходить в этом режиме. Любой бит, посланный в течение ACK-Slot поля подтверждения кадра, игнорируется.

Флаг режима пробуждения WUPM (бит 1) регистра CMCR1 позволяет программисту устанавливать тип пробуждения, которое контроллер msCAN12 должен обнаружить перед выводом ЦП из спящего режима. Когда этот бит установлен, контроллер msCAN12 выведет ЦП из спящего режима только при появлении на шине CAN импульса определенной длительности. Бит WUPM устанавливается, чтобы предотвратить выход из спящего режима при любых сбоях или шумах, появившихся на CAN шине. Когда этот бит очищен, контроллер msCAN12 выводит ЦП из спящего режима при любом переходе шины из рецессивного в доминантное состояние.

Бит CLKSRC используется для выбора источника синхронизации контроллера msCAN12. Если этот бит сброшен, используется внешний тактовый генератор. Если этот бит установлен, в качестве источника синхронизации контроллера msCAN12 назначается внутренняя импульсная последовательность, частота которой вдвое превышает частоту ECLK (см. система тактирования).

Регистр CBTR0 определяет число периодов тактовой частоты msCAN12, из которого будет состоять квант времени синхронизации. На рис. 9.25 показано содержимое CBTR0. Назначение битов 7 и 6 мы рассмотрим ниже. Остальные биты в регистре, BRP5-BRP0, используются для масштабирования источника синхронизации msCAN12, чтобы генерировать желательный квант времени синхронизации. Снова напомним, что регистр может быть установлен только тогда, когда установлен бит SFTRES в CMCR0. Таблица 9.1 показывает как могут быть конфигурированы биты BRP5-BRP0, чтобы установить желательный масштаб.

Рис. 9.25. Формат регистра синхронизации шины CBTR0


BRP5 BRP4 BRP3 BRP2 BRP1 BRP0 Значение масштаба (P)
0 0 0 0 0 0 1
0 0 0 0 0 1 2
0 0 0 0 1 0 3
0 0 0 0 1 1 4
1 1 1 1 1 1 64

Таблица 9.1. Конфигурация системы масштабирования кванта времени


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

sync_seg
,
prop_seg
,
phase_seg1
и
phase_seg2
. В msCAN12 эти четыре сегмента отображены тремя сегментами:
sync_seg
,
time segment 1
и
time segment 2
. При этом
sync_seg
протокола CAN непосредственно отображается в
sync_seg
msCAN12,
prop_seg
и
phase_seg1
протокола CAN отображается в
time segment 1
, а
phase_seg2
протокола CAN отображается в
time segment 2
контроллера msCAN12.

Сегмент

sync_seg
используется, чтобы синхронизировать узлы CAN сети. Сегмент имеет длину, равную одному кванту времени. В течение этого периода контроллер msCAN12 ожидает фронт сигнала. Длительность
time segment 1
может составлять от 4 до 16 квантов времени, что определяется состоянием битов 0…3 регистра синхронизации шины CBTR1 (рис. 9.26). Длительность этого сегмента должна программироваться в соответствии с задержкой распространения передатчика и приемника, а также фазовой ошибкой фронта сигнала. Продолжительность сегмента
time segment 2
составляет от 2 до 8 квантов времени, и может также программироваться, с помощью битов 4, 5 и 6 регистра CBTR1. Таким образом, продолжительность времени передачи одного бита может составлять от 7 до 25 квантов времени в зависимости от установки битов в регистре CBTR1.

Рис. 9.26. Формат регистра CBTR1


Биты от 0 до 3 (TSEG13, TSEG12, TSEG11, и TSEG10) используются, чтобы установить длительность

time segment 1
, в соответствии с табл. 9.2. Биты от 4 до 6 (TSEG22, TSEG21 и TSEG20) используются, чтобы конфигурировать время
time segment 2
, как показано в табл. 9.3. Бит SAMP определяет, будет ли использоваться одна или три выборки, чтобы измерить принимаемый бит сообщения. Если бит SAMP установлен, используются три выборки, если он очищен, то только одна. Регистр CBTR1 может изменяться только при установленном бите SFTRES в регистре CMCR0.

TSEG13 TSEG12 TSEG11 TSEG10 time segment 1
0 0 0 0 1 квант времени
0 0 0 1 2 кванта времени
0 0 1 0 3 кванта времени
0 0 1 1 4 кванта времени
1 1 1 1 16 квантов времени

Таблица 9.2. Конфигурация длительности time segment 1


TSEG22 TSEG21 TSEG20 time segment 2
0 0 0 1 квант времени
0 0 1 2 кванта времени
0 1 0 3 кванта времени
0 1 1 4 кванта времени
1 1 1 8 квантов времени

Таблица 9.3. Конфигурация длительности time segment 2


Вернемся теперь к битам 7 и 6 регистра CBTR0. При синхронизации битов на шине, используются биты скачка ресинхронизации (SJW1:SJW0), позволяющие уменьшить или увеличить ширину скачка ресинхронизации (число квантов времени). Таблица 9.4 показывает ширину скачка ресинхронизации, соответствующую различным значениям SJW1:SJW0.

SJW1 SJW0 Ширина скачка ресинхронизации
0 0 1 квант времени
0 1 2 кванта времени
1 0 3 кванта времени
1 1 4 кванта времени

Таблица 9.4. Выбор ширины скачка ресинхронизации


В заключение покажем дополнительную аппаратную возможность контроллера msCAN12 контроллера. Когда контроллер принял или передал корректное сообщение, генерируется импульс с длительностью, равной времени передачи одного бита. Этот импульс может быть послан на встроенный модуль таймерного интерфейса (TIM). Чтобы установить эту внутреннюю связь, используется бит TLNKEN в регистре CMCR0. Такое решение обеспечивает программисту необходимую гибкость. Модуль таймерного интерфейса может быть запрограммирован на определенное действие при появлении любого кадра приема или передачи, например, для каждого кадра может создаваться своя собственная метка времени.

9.3.4. Конфигурирование модуля msCAN12 для работы в сети

В этом разделе мы объединим три подсистемы контроллера msCAN12 в единое целое и покажем последовательность действий по его инициализации.

До начала нашего обсуждения конфигурации сети, отметим, что шесть из восьми выводов физического порта CAN могут использоваться как универсальные входы/выходы порта общего назначения PORTCAN. На рис. 9.27 показано использование порта CAN для таких целей. Когда выводы со 2 по 7 находятся в режиме универсальных линий ввода/вывода, следующие три регистра используются для записи и чтения данных с порта PORTCAN: регистр данных PORTCAN, регистр направления передачи DDRCAN, регистр управления PCTLCAN.

Рис. 9.27. CAN портовая конфигурация


Регистр DDRCAN используется, чтобы программировать соответствующие выводы как входные или выходные. На рис. 9.28 показано назначение каждого бита регистра. Обратите внимание, что биты 0 и 1 зарезервированы как биты передачи и приема контроллера CAN и не могут быть использованы как универсальные выводы входов/выходов. Установка бита направления передачи данных в состояние логической 1 конфигурирует соответствующий вывод как выходной; установка его в состояние логического нуля — как входной. Регистр PCTLCAN, формат которого представлен на рис. 9.29, используется, чтобы разрешать или запрещать перевод выводов от 2 до 7 порта CAN в режим драйверов высокого или низкого уровня. Бит PUECAN используется, разрешать (при переводе в состояние логической 1) или запрещать (при переводе в состояние логического 0) режим драйвера высокого уровня. Бит RDPCAN выбирает конфигурацию, разрешающую (при переводе в состояние логической 1) или запрещающую (при переводе в состояние логического 0) режим драйвера низкого уровня.

Рис. 9.28. Формат регистра направления передачи DDRCAN


Рис. 9.29. Формат регистра управления PCTLCAN


И наконец, регистр PORTCAN содержит фактические данные (логические уровни) посылаемые или получаемые физическими выводами порта CAN. На рис. 9.30 показано содержимое регистра. В соответствии с установками в регистре DDRCAN, каждый бит используется передачи или приема данных из внешней среды. Обратите внимание, что, даже если модуль CAN конфигурирован для связи с сетью CAN, этот регистр будет передавать или принимать данные, в зависимости от состояния битов 1 и 0 этого регистра.

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

Два физических внешних вывода, RxCAN и TxCAN, используются для связи с сетью. Выводы RxCAN и TxCAN соответствуют битам 0 и 1 регистра PORTCAN. Приемопередатчик CAN, который используется, чтобы управлять логическими состояниями на сетевой шине, должен быть связан с двумя выводами и должен в свою очередь быть подключен к сети CAN. Типичными примерами таких приемопередатчиков являются микросхема MC33388 или PCA82C250.

После того, как 68HC12 будет правильно подключен к сети CAN, необходимо обеспечить правильную процедуру инициализации, позволяющую установить модуль msCAN12. Обсудим эту процедуру. Прежде, чем предпринять любые шаги по инициализации, модуль msCAN12 должен быть помещен в состояние мягкого сброса, путем установки в состояние логической 1 бита SFTRES (бит 0 регистра CMCR0). Как только бит SFTRES установлен, ЦП может задать рабочую конфигурацию msCAN12, с помощью следующих регистров, связанных с CAN:

• При сбросе значение по умолчанию в регистре CMCR0 равно $21, при этом устанавливаются биты CSWAI и SFTRES. По умолчанию также очищаются биты TLNKEN и SLPRQ. Модуль msCAN12 находится в состоянии мягкого сброса и готов к работе в нормальном режиме. Вход таймера связан с портом и модуль конфигурирован таким образом, чтобы в режиме ожидания отсутствовали импульсы синхронизации.

• Значение по умолчанию в регистре CMCR1 равно $00. Если не используется внешний генератор синхронизации, то бит CLKSRC должен быть переведен в состояние логической 1. Если применяется низкочастотный фильтр для подавления помех, которые могут восприниматься как фронты, должен быть установлен бит WUPM (бит1). Для самопроверки должен быть установлен бит LOOPB (бит2).

• Значение по умолчанию в регистре CBTR0 равно $00. Биты, устанавливающие скорость передачи в бодах и биты ширины скачка ресинхронизации должны программироваться согласно требованиям конкретного применения.

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

• Если используется прерывание, то должны быть установлены соответствующие биты прерывания в регистре CRIER или в регистре CTCR и написаны соответствующая программы обработки прерываний.

• Конфигурация фильтров идентификаторов должна быть запрограммирована с помощью регистра CIDAC.

• Соответствующие значения фильтров идентификаторов должны быть запрограммированы с помощью регистров CIDAR0–CIDAR7 и CIDMR0–CIDMR7.

Сразу после окончания процесса инициализации msCAN12 будет готов к связи. Если все прерывания запрещены, то один, два или все три буфера передатчиков должны быть заполнены перед тем, как начать передачу сообщения в сеть. Перед тем, как передать в сеть дополнительные сообщения должны быть проверены флаги TXE2, TXE1 и TXE0. Флаг RxF в регистре CRFLG должен быть опрошен, чтобы узнать, не получено ли допустимое сообщение.

В большинстве случаев, используется большое число прерываний CAN. Как минимум, для связи в сетях CAN должно использоваться прерывание передачи и прерывание приема. Чтобы разрешить прерывание передачи, должны быть установлены биты TXEIE2, TXEIE1, TXEIE0 в регистре CTCR, а соответствующие сервисные программы должны снова наполнить передающие буферы и очистить биты TXE2, TXE1, и TXE0 в регистре CTFLG. Прерывание приема разрешается при установке бита RXFIE (Receiver Full Interrupt Enable) в регистре CRIER. Соответствующая сервисная программа должна очистить бит RxF в регистре CRFLG и обработать полученные данные. Еще раз повторим, что для осуществления любого допустимого прерывания бит I в регистре CCR должен быть очищен.

9.4. Различия между контроллерами msCAN в составе 68HC12 и HCS12

Одним из наиболее популярных вариантов микроконтроллеров семейства HCS12 является MC9S12DP256. В этом разделе мы опишем дополнительные свойства модуля контроллера msCAN12 в составе MC9S12DP256.

Основные изменения обсуждаемого модуля по сравнению с ранее рассмотренным состоят в следующем:

• число буферов в приемном модуле увеличивается с двух до пяти;

• осуществляется более жесткое программное управление передачей из трех передающих буферов;

• увеличивается число управляющих регистров;

• добавлен режим «только прослушивание»;

• добавлена возможность установки временных меток для сообщений;

• удалена функция совмещения линий универсального порта с линиями входа/выхода контроллера CAN;

• уменьшено пространство памяти, используемое модулем msCAN (от 128 до 64 однобайтовых ячеек памяти).

Рассмотрим кратко каждое из перечисленных изменений. Двухбуферная структура контроллера CAN в HC12 часто вызывает запаздывание реакции сетевых узлов, когда от шины поступают несколько сообщений. Чтобы исправить этот недостаток, модуль msCAN12 в составе MC9S12DP256 дополнили пятью структурами данных типа очереди (FIFO — «первым пришел, первым вышел»).

Число передающих буферов (3), не изменилось, но появилась дополнительная управляющая структура. В новых контроллерах msCAN12 один передающий буфер из трех выбирается посредством установки бита передачи TXi в регистре выбора передающего буфера (i — номер желательного буфера). Напомним, что ранее рассмотренном контроллере msCAN12 передающий буфер выбирается на основе информации о приоритете. Это изменение уменьшило физическое адресное пространство, выделенное для передающего буфера и упростило доступ к буферам передач.

В дополнение к функциональным изменениям в существующих девяти регистрах управления, контроллер MC9S12DP256 msCAN содержит три дополнительных регистра: регистр выбора передающего буфера msCAN (CANTBSEL), регистры старшего байта и младшего байта временной метки (TSRH:TSRL).

Режим «только для прослушивания» (LISTEN) позволяет программисту устанавливать контроллер CAN в рецессивное состояние на все время пока принимаются достоверные данные и кадры удаленного запроса. Контроллер CAN может быть запрограммирован на работу в таком режиме путем установки бита LISTEN в регистре управления 1 msCAN12. Дополнительная возможность присваивать временную метку каждому сообщению, упомянутая в предыдущем параграфе, позволяет программисту легко отслеживать передаваемые и получаемые сообщения. Исключение порта регистров CAN не позволяет использовать его для создания универсального порта входов–выходов (I/O). Однако исключение этого порта делает контроллер CAN более компактным, а для создания порта входов/выходов можно использовать другие порты контроллера MC9S12DP256.

В результате изменений, которые мы перечислили, карта памяти, контроллера msCAN12 в микроконтроллера MC9S12DP256 изменится в соответствии с рис. 9.31.

Рис. 9.31. Карты памяти для контроллеров CAN в HC12 и MC9S12DP256

9.5. Пример программирования контроллера msCAN Схема включения аппаратных средств для двух отладочных плат Axiom

Рис. 9.32.


В этом разделе, мы рассмотрим простое применение, в котором два МК семейства 68HC12 объединяются в CAN сеть при помощи своих встроенных модулей msCAN12. Сначала мы покажем используемые в примере аппаратные средства (рис. 9.32), а затем представим программы, необходимые для работы обоих контроллеров. Для этого применения, мы выбрали отладочную плату Axiom CMD912 с микроконтроллером MC9S12DP256. Специальная плата была выбрана, чтобы воспользоваться преимуществами трансивера CAN, встроенного в ИС PCA82C259 компании Philips. Каждая плата должна выполнять собственную программу, чтобы реализовать простую связь между двумя msCAN модулями. Первая из программ, показанных ниже, является файлом заголовков (header file) 68hc9s12dp256.h, который содержит описания адресов регистров. Показан только фрагмент этого файла, относящийся к нашим программам CAN.

#define _REG_BASE 0

#define P(off) *(unsigned char volatile *)(_REG_BASE + off)

#define COPCTL _P(0x3C) /*управление сторожевым таймером */

#define CAN0CTL0 _P(0x0140) /*управляющий регистр 0 */

#define CAN0CTL1 _P(0x0141) /*CAN0 регистр управления 1 */

#define CAN0BTR0 _P(0x0142) /*CAN0 регистр синхронизации 0 */

#define CAN0BTR1 _P(0x0143) /*CAN0 регистр синхронизации 1 */

#define CAN0RFLG _P(0x0144) /*CAN0 флаги приема */

#define CAN0TFLG _P(0x0146) /*CAN0 флаги передачи */

#define CAN0TBEL _P(0x014A) /*CAN0 выбор передающего буфера */

#define CAN01DM0 _P(0x0154) /*CAN0 регистр маскирования идентификаторов 0*/

#define CAN01DM1 _P(0x0155) /*CAN0 регистр маскирования идентификаторов 1*/

#define CAN01DM2 _P(0x0156) /*CAN0 регистр маскирования идентификаторов 2*/

#define CAN0IDM3 _P(0x0157) /*CAN0 регистр маскирования идентификаторов 3*/

#define CAN0IDM4 _P(0x015C) /*CAN0 регистр маскирования идентификаторов 4*/ 

#define CAN0IDM5 _P(0x015D) /*CAN0 регистр маскирования идентификаторов 5*/ 

#define CAN0IDM6 _P(0x015E) /*CAN0 регистр маскирования идентификаторов 6*/ 

#define CAN0IDM7 _P(0x015F) /*CAN0 регистр маскирования идентификаторов 7*/ 

#define CAHORXFG0 _P(0x0160) /*основной буфер RX CAN0 */

#define CAN0RXFG1 _P(0x0161) /*основной буфер RX CAN0 */

#define CAN0RXFG2 _P(0x0162) /*основной буфер RX CAN0 */

#define CAN0RXFG3 _P(0x0163) /*основной буфер RX CAN0 */

#define CAN0RXFG4 _P(0x0164) /*основной буфер RX CAN0 */

#define CAN0RXFG5 _P(0x0165) /*основной буфер RX CAN0 */

#define CAN0RXFG6 _P(0x0166) /*основной буфер RX CAN0 */

#define CAN0RXFG7 _P(0x0167) /*основной буфер RX CAN0 */

#define CAN0RXFG8 _P(0x0168) /*основной буфер RX CAN0 */

#define CAN0RXFG9 _P(0x0169) /*основной буфер RX CAN0 */

#define CAN0RXFGA _P(0x016A) /*основной буфер RX CAN0 */

#define CAM0RXFGB _P(0x016B) /*основной буфер RX CAN0 */

#define CAN0RXFGC _P(0x016C) /*основной буфер RX CAN0 */

#define CAN0RXFGD _P(0x016D) /*основной буфер RX CAN0 */

#define CAN0RXFGE _P(0x016E) /*основной буфер RX CAN0 */

#define CAN0RXFGF _P(0x016F) /*основной буфер RX CAN0 */

#define CAN0TXFG0 _P(0x0170) /*основной буфер TX CAN0 */

#define CAN0TXFG1 _P(0x0171) /*основной буфер TX CAN0 */

#define CAN0TXFG2 _P(0x0172) /*основной буфер TX CAN0 */

#define CAN0TXFG3 _P(0x0173) /*основной буфер TX CAN0 */

#define CAN0TXFG4 _P(0x0174) /*основной буфер TX CAN0 */

#define CAN0TXFG5 _P(0x0175) /*основной буфер TX CAN0 */

#define CAN0TXFG6 _P(0x0176) /*основной буфер TX CAN0 */

#define CAN0TXFG7 _P(0x0177) /*основной буфер TX CAN0 */

#define CAM0TXFG8 _P(0x0178) /*основной буфер TX CAN0 */

#define CAN0TXFG9 _P(0x0179) /*основной буфер TX CAN0 */

#define CAN0TXFGA _P(0x017A) /*основной буфер TX CAN0 */

#define CAN0TXFGB _P(0x017B) /*основной буфер TX CAN0 */

#define CAN0TXFGC _P(0x017C) /*основной буфер TX CAN0 */

#define CAN0TXFGD _P(0x017D) /*основной буфер TX CAN0 */

#define CAN0TXFGE _P(0x017E) /*основной буфер TX CAN0 */

#define CAN0TXFGF _P(0x017F) /*основной буфер TX CAN0 */

/********************************************************************/

Следующая программа выполняется контроллером первой платы, показанной в верхней части рис. 9.32. Эта программа инициализирует связь, а затем непрерывно посылает в сеть 8-байтовый блок данных ($01, $02, $03, $04, $05, $06, $07, и $08).

/********************************************************************/

/* CANONE.C Эта программа запускает плату 68HC12 и связывает ее с другой*/

/* платой 68HC12 с помощью контроллера CAN              */

/* Авторы: Даниэль Пак и Стив Барретт                */

/* Дата создания: 29 июля 2004                    */

/********************************************************************/

line 0  #include "68HC12DP256.h"

line 1  void main()

line 2  {

line 3   COPCTL=0x00; /*Выключить сторожевой таймер COP*/

line 4   /*установить модуль CAN */

line 5   CAN0CTL1 = CAN0CTL1 | 0x80; /*разрешение для модуля CAN */

line 6  CAN0CTL1 = CAN0CTL1 & 0xEF; /*выключение режима LISTEN*/

line 7  while ((CAN0CTL1 | 0x01) == 0) /*режим инициализации CAN*/

line 8  {

line 9   CAN0CTL0 = CAN0CTL0 | 0x01;

line 10  }

line 11 CAN0BTR0 = 0xC1; /*установка бит синхронизации CAN*/

line 12  CAN0BTR1 = 0xF7;

line 13  CANOCTL0 = CAN0CTL0 & 0xFE;/*выход CAN из режима инициализации*/

line 14  while ((CAN0CTL0 & 0x10) == 0){} /*ожидание синхронизации*/

line 15  CAN0TBEL = 0x01; /*выбор передающего буфера 0 */

line 16  /*установка передающего буфера */

line 17  CAN0TXFG0 = 0xFF;

line 18  CAN0TXFG1 = 0xFF;

line 19  CAN0TXFG2 = 0xFF;

line 20  CAN0TXFG3 = 0xFE; /*RTR = 0 для кадра данных */

line 21  CAN0TXFG4 = 0x01; /*сообщение */

line 22  CAN0TXFG5 = 0x02;

line 23  CAN0TXFG6 = 0x03;

line 24  CAN0TXFG7 = 0x04;

line 25  CAN0TXFG8 = 0x05;

line 26  CAN0TXFG9 = 0x06;

line 27  CAN0TXFGA = 0x07;

line 28  CAN0TXFGB = 0x08;

line 29  CAN0TXFGC = 0x08; /*спецификатор длины данных */

line 30  CAN0TXFGD = 0x00;

line 31  while(1)

line 32  {

line 33  while ((CAN0TFLG & 0x01) == 0) /*ожидание флага окончания передачи */

line 34   CAN0TFLG = CAN0TFLG | 0x01; /*очистка флага */

line 35  }

line36  } /* конец основной программы */

/********************************************************************/

Команда на строке 3 выключает функцию сторожевого таймера COP контроллера. Команды на строках от 4 до 20 инициализируют контроллер msCAN12. Сначала, команда по строке 5 включает CAN контроллер. Команда на строке 6 выключает режим LISTEN, используемый для контроллеров, которые только прослушивают данные сетевого трафика, не передавая никаких сообщения. Команды в строках с 7 по 10 используются, чтобы перевести контроллер CAN в режим инициализации. Сразу после инициализации, используются команды на строках 11 и 12, чтобы установить бит синхронизации CAN. Команда на строке 13 подготавливает контроллер CAN к работе с сетевым трафиком. Команда на строке 14 необходима, чтобы синхронизировать контроллер CAN с сетевым трафиком. Команда на строке 15 выбирает передающий буфер 0 для передачи информации, а команды на строках с 16-й по 30-ю готовят содержимое для передающего буфера. Отметим, что мы установили флаги SRR и IDE, выбрав тем самым расширенный формат, и, кроме того, очистили бит RTR, показав, что текущий буфер загружен кадром данных. Начиная со строки 31 до конца программы продолжается передача данных в сеть.

Ниже приведена программа, которая определяет работу второго МК, показанного в нижней части рис. 9.32.

/**********************************************************************/

/* CANTWO.C Эта программа запускает плату 68HC12 и связывает ее с другой */

/* платой 68HC12 с помощью контроллера CAN               */

/* Авторы: Даниэль Пак и Стив Барретт                 */

/* Дата создания: 29 июля 2004                    */

/**********************************************************************/

line 0  #include "68HC12DP256.h"

line 1  void main()

line 2  {

line 3  COPCTL=0x00; /*Выключить сторожевой таймер COP */

line 4        /*установить модуль CAN */

line 5  CAN0CTL1 = CAN0CTL1 | 0x80; /*разрешение для модуля CAN */

line 6  CAN0CTL1 = CAN0CTL1 & 0xEF; /*выключение режима LISTEN */

line 7  while ((CAN0CTL1 | 0x01) == 0) /*режим инициализации CAN */

line 8  {

line 9   CAN0CTL0 = CAN0CTL0 | 0x01

line 10  }

line 11  CANOBTR0 = 0xC1; /*установка бита синхронизации CAN*/

line 12  CAN0BTR1 = 0xF7;

line 13  CAN01DM0 = 0xFF; /*прием всех сообщений */

line 14  CAN01DM1 = 0xFF;

line 15  CAN01DM2 = 0xFF;

line 16  CAN01DM3 = 0xFF;

line 17  CAN01DM4 = 0xFF;

line 18  CAN01DM5 = 0xFF;

line 19  CAN01DM6 = 0xFF;

line 20  CAN01DM7 = 0xFF;

line 21  CAN0CTL0 = CAN0CTL0 & 0xFE; /*выход CAN из режима инициализации */

line 22  while ((CAN0CTL0 & 0x10) == 0){} /*ожидание синхронизации */

line 23  /*ожидание сообщения */

line 24  while ((CAN0RFLG & 0x01) == 0){} /*ожидание флага сообщения */

line 25  CAN0RFLG = CAN0RFLG | 0x01; /*очистка флага */

line 26  asm("swi");

line 27 } /* конец основной программы */

Мы видим, что первое отличие этой программы от предыдущей — это спецификация для регистров маскирования приемника в строках с 13-й до 20-ю. Команды устанавливают все биты маскирования в состояние логической 1, игнорируя весь код, поступающий на соответствующие приемные регистры. Таким образом все сообщения с любым содержанием для четырех регистров идентификатора будут приняты CAN контроллером.

Основное различие между двумя программами начинается в строке 23. По команде в строке 24 МК ожидает заполнения приемного буфера, команда в строке 25 очищает флаг приемника. Команда в последней строке останавливает программу, после чего МК мы можем проверить получение данных, рассматривая содержание приемного буфера, размещенного в ячейках от $0160 до $016F.

Приведенные прикладные программы показывают простейший сценарий, в котором действуют только два узла CAN сети. Мы предельно упростили пример, чтобы помочь Вам освоить начальное программирование CAN контроллеров в составе 68HC12. Для простоты мы избегали использования любых прерываний и запрограммировали контроллеры CAN таким образом, чтобы они могли принимать сообщения с любыми идентификаторами битами.

9.6. Контроллер последовательного обмена BDLC

Ранние версии 68HC12, например MC68HC912B32 и MC68HC12BE32, не имеют модулей CAN. Вместо этого, контроллеры содержат другой модуль сетевой связи — контроллер связи байтов данных (byte data link controller — BDLC). Этот модуль Вы можете увидеть в составе МК MC68HC912B32 на рис. 1.3. Модуль контроллера BDLC был разработан для подключения МК семейства 68HC12 к информационной сети, которая использует протокол J1850 общества автомобильных инженеров (SAE).

Сети передачи данных класса В протокола SAE J1850 предназначены для последовательной передачи данных на скоростях до 125 кб/с. Модуль BDLC использует переменный формат длительности временного интервала передачи бита, помехоподвляющие фильтры, механизм определения коллизий и циклический контроль избыточности для контроля за сохранностью переданных данных. Сообщение протокола J1850 состоит из начального символа кадра, приоритета сообщения, идентификатора сообщения, фактических данных, байта контрольной суммы CRC и символа конца данных. Модуль может функционировать в трех режимах: режиме с отключенным питанием (1), режиме сброса (2) и рабочем режиме (3). Кроме того, модуль BDLC поддерживает три энергосберегающих режима: BDLC и ЦП в режиме ожидания (1), BDLC в режиме останова, ЦП в режиме ожидания (2), BDLC и ЦП в режиме останова (3).

Модуль BDLC 68HC12 состоит из конечного автомата, мультиплексора, двух приемных и двух передающих регистров данных. Пять регистров управления используются, чтобы конфигурировать модуль BDLC для выбора источника тактирования, скорости передачи информации, режима работы, кодирования битов, разрешения прерываний. Три дополнительных регистра (регистр порта управления DLC, регистр порта данных DLC и регистр порта направления передачи данных DLC) используются, чтобы конфигурировать порт BDLC как универсальный порт ввода-вывода.

Протоколы SAE J1850 и CAN конкурируют в области управления локальными контроллерными сетями. Текущая тенденция показывает, что CAN протокол приобретает большую популярность среди пользователей, занимающихся промышленным применением, стремясь покрыть весь сектор локальных контроллерных сетей.

9.7. Заключение по главе 9

В этой главе, мы рассмотрели основы связи между встраиваемыми микроконтроллерными системами, соответствующие протоколу локальных промышленных сетей Bosch CAN 2.0A и CAN 2.0B. Мы познакомились с аппаратными и программными средствами периферийного модуля последовательного обмена msCAN в составе микроконтроллеров семейства 68HC12, а также с более простым модулем последовательного обмена BDLC 68HC12. Мы обсудили проблемы синхронизации, связанные с CAN протоколом, регистры, используемые в контроллерах msCAN12, алгоритмы программного обслуживания буферов для приема и передачи сообщений по CAN. Привели ряд простых демонстрационных программ по инициализации на прием и передачу модуля msCAN12.

9.8. Что еще почитать?

1. Motorola, Inc. «HC12-M68HC12B Family Advance Information, M68HC12B/D», 2000.

2. Motorola, Inc. «CAN-Bosch Controller Area Network (CAN) Version 2.0,» Protocol Standard, BCANPSV2.0/D, Rev. 3, 1998.

3. Motorola, Inc. «The msCAN on the MC9S12DP256 Compared with the msCAN on the HC12 Family,» AN2011/D, Rev. 1, 01/2002.

4. Motorola, Inc. «Scalable Controller Area Network (msCAN) Interrupts», AN2283/D, Rev. 0, 08/2002.

5. Motorola, Inc. «VPW J1850 Multiplexing and Motorola's Byte Data Link Controller (BDLC) Module,» 1998.

9.9. Вопросы и задания

Основные

1. Сравните распределенную систему управления систему из нескольких автономных встраиваемых систем.

2. Расшифруйте следующие аббревиатуры: WAN, LAN, SAN, CAN.

3. Дайте короткое определение понятия «протокол».

4. Сколько уровней ISO существует в протоколе CAN версии 2.0/A?

5. Сколько уровней ISO существует в протоколе CAN версии 2.0/В?

6. Какие биты являются доминантными и рецессивными в CAN протоколе?

7. Перечислите возможные типы кадров, передающихся по CAN шине.

8. Перечислите возможные режимы работы контроллера последовательного обмена msCAN12.

9. В контроллере последовательного обмена заполнены три буфера передатчика.

Как контроллер msCAN12 решает, содержимое какого буфера передать первым?

Более сложные

1. CAN протокол не использует в сообщении адресов передающего и принимающего узлов. Как образом узел сети определяет, принимать сообщение, появившееся на шине, или нет?

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

3. Опишите процесс передачи сообщения на шину CAN аппаратными и программными средствами контроллера msCAN12.

4. Опишите процесс, приема сообщения с шины CAN при использовании контроллера msCAN12.

5. Запишите на Си фрагмент программного кода, который загружает в буфер 0 подсистемы передатчика произвольное кодовое сообщение для контроллера CAN.

6. Запишите на Си фрагмент программного кода, который сначала опрашивает флаг состояния заполнения буфера 0 передатчика, а затем, когда буфер освободится, загружает в него новое произвольное сообщение.

7. Запишите на Си фрагмент программного кода, позволяющий конфигурировать подсистему приемника контроллера msCAN12 так, чтобы он получал любое сообщение с номерами идентификатора «2003» и «1995».

8. Запишите на Си фрагмент программного кода, который создает сообщение об ошибке, когда переполняется регистр счетчика ошибок приема. Используйте программу обработки прерываний, связанную с регистром счетчика ошибок, чтобы установить в передающий буфер 0 сообщение «Error».

Исследовательские

1. Нарисуйте схему аппаратного подключения для сети CAN с тремя узлами (A, B и C), использующую соответствующие приемопередатчики.

2. По техническому условию требуется, чтобы узел А передал сообщение с числовым значением узлу В, узел В добавил к этому значению 1 и переслал результат узлу C, а узел С еще раз добавил 1 к полученному значению и переслал полученный результат снова узлу А. Этот процесс должен быть периодическим. Узел А начинает весь процесс с нулевого начального значения. Нарисуйте блок-схему, выполняющую эту задачу.

3. Запишите на Си программы для всех трех узлов в предыдущей задаче.

Загрузка...