logo
HCS12 с применением языка С - royallib

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. Рассмотрим структуру подсистемы передатчика.

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

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

Передающий буфер 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, чтобы считать данные*/