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