Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт
Шрифт:
Интервал:
Закладка:
• Наряду с регистром 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).