Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
/********************************************************************/
/* 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.