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