МИКРОСХЕМА ИНТЕГРАЛЬНАЯ 1921ВК035. Руководство пользователя - часть 3

 

  Главная      Книги - Разные     МИКРОСХЕМА ИНТЕГРАЛЬНАЯ 1921ВК035. Руководство пользователя

 

поиск по сайту            правообладателям  

 

   

 

   

 

содержание      ..     1      2      3      4      ..

 

 

 

МИКРОСХЕМА ИНТЕГРАЛЬНАЯ 1921ВК035. Руководство пользователя - часть 3

 

 

На рисунке 17.20 представлено графическое пояснение к описанию режима.
Рисунок 17.20 - Режим FS ведомого приемника
Рисунок17.21 - Режим HS ведомого приемника
Режим HS ведомого приемника
Включение режима происходит после получения валидного кода мастера
(0000_1хххb). После передачи кода мастера формируется состояние повторного старта, а
затем передается адрес ведомого с нулевым битом направления (R/W# = «0»). После
получения байта адреса ведомый проверяет его на совпадение (см. ранее «Режим FS
ведомого приемника»).
Дополнительно можно обратиться к приложению Б.
На рисунке 17.21 представлено графическое пояснение к описанию режима.
Режим FS ведомого передатчика
В этом режиме данные передаются от ведомого передатчика к мастеру приемнику.
Ведомый проверяет ответ мастера на бит ACK.
Переход в режим передатчика происходит из режима ведомого приемника. После
получения собственного адреса и бита направления, равного единице (R/W# = «1»),
ведомый становится передатчиком. Флаг INT устанавливается, указывая на то, что в
регистр SDA следует записать данные.
127
Пока установлен флаг INT, линия SCL удерживается в «0». После записи данных в
регистр SDA следует сбросить флаг INT. После этого, по истечении времени,
необходимого для установки данных на линии SDA, линия SCL освобождается, и данные
начинают передаваться.
Передача данных аналогична передаче в режиме мастера передатчика. После
каждого успешного приема байта устанавливается флаг INT, а в поле MODE записывается
соответствующий код. Линия SCL удерживается в состоянии «0» до тех пор, пока флаг
INT остается установленным. Флаг INT должен сбрасываться только после записи данных
в регистр SDA. Каждый последующий байт должен записываться в регистр SDA до тех
пор, пока в поле MODE не появится код 17h (состояние STDANA), указывающий на то,
что мастер «не желает» далее принимать данные.
Вывод ведомого из режима передатчика осуществляется только мастером
приемника. Мастер приемника должен не квитировать последний (согласно
запланированному количеству) полученный байт данных. При обнаружении
неквитирования переданных данных, модуль I2C переходит в режим безадресного
ведомого и в поле MODE записывается код 00h (состояние IDLE). Далее ведомый
мониторит шину в ожидании состояния старта или повторного старта.
Для работы в режиме с 10-битной адресацией следует осуществить действия,
аналогичные описанным для режима FS ведомого приемника.
Сначала модуль I2C переходит в режим ведомого приемника и получает 10-битный
адрес. Если программно не требуется никаких действий, то флаг INT не устанавливается,
линия SCL не удерживается в «0» и поле MODE содержит соответствующую информацию
о состоянии. Далее (см. ранее «Формат передачи данных с 10-битной адресацией»), вслед
за вторым байтом адреса может последовать состояние повторного старта и затем
повторная передача первого байта адреса с той лишь разницей, что бит направления
содержит единицу (R/W# = «1»). Таким образом, после приема трех байт, если принятый
10-битный адрес окажется «своим», установится флаг INT и ведомый переключится в
режим передатчика. В поле MODE запишется один из двух кодов - 14h или 15h.
Если включен механизм распознавания ошибок, то последний отправленный
ведомым передатчиком байт будет байтом CRC. Программа должна «знать» количество
байт, посылаемых в пакете данных, и после отправки всех байт устанавливать бит
PECNEXT (вместо записи очередных данных в регистр SDA) для того, чтобы в регистр
SDA записался байт контрольной суммы.
В модуле I2C поддерживается функция распознавания адреса отклика, который
передается мастером шины ко всем ведомым. Ведомое устройство, получившее адрес
отклика (0001_100b), переключается в режим передатчика и начинает передавать свой
собственный адрес (подробнее - см. подраздел «Формат передачи данных с 7-битной
адресацией»).
Для включения функции распознавания адреса отклика следует установить бит
SMBARE в регистре CTL0.
Модуль I2C реагирует на адрес отклика только при работе в режиме ведомого. В
ответ на получение адреса отклика начать передачу адресов могут несколько ведомых.
Ведомый, выигравший арбитраж, продолжает передачу, остальные - освобождают шину.
Дополнительно можно обратиться к приложению Б.
На рисунке 17.22 представлено графическое пояснение к описанию режима.
128
Рисунок 17.22 - Режим FS ведомого передатчика
Режим HS ведомого передатчика
Модуль I2C переходит в режим HS ведомого после получения валидного кода
мастера (0000_1xxxb). Далее следует состояние повторного старта и передача адреса
ведомого с единичным битом направления (R/W# = «1»). После этого ведомый
переключается в режим HS ведомого передатчика. Функционирование в этом режиме в
целом идентично режиму FS ведомого передатчика, с теми отличиями, что
поддерживается более высокая скорость передачи, а значения кодов состояний (поле
MODE) находятся в диапазоне 34h - 37h.
Дополнительно можно обратиться к приложению Б.
На рисунке 17.23 представлено графическое пояснение к описанию режима.
Рисунок 17.23 - Режим HS ведомого передатчика
Дополнительная информация о работе модуля
1 Когда модуль I2C выключен, бит BB регистра CST очищен. Включения модуля в
системе с более чем одним мастером, может произойти в момент времени, когда по шине
идет передача. Бит BB не сможет это показать. Во избежание создания ошибок на шине
модуль I2C должен синхронизироваться с сигналами на шине прежде, чем сделать
попытку стать мастером. Для этого следует дождаться момента, когда на шине не будет
129
выявлена активность, т. е. периодически проверять бит BB через периоды времени,
равные периоду ожидания на шине.
2 Бит BB позволяет мониторить шину и не допускать формирования ошибочных
состояний старта в процессе передачи между другими устройствами на шине.
3 В некоторых случаях шина может «зависать» при активных (с нулевым уровнем)
сигналах на линиях SDA и/или SCL. Источниками таких состояний могут быть
необнаруженные ошибочные стартовые или стоповые состояния, сформировавшиеся в
течение приема ведомых данных. Если считать, что причиной зависания явился модуль
I2C, то возможны следующие два варианта развития событий:
а) если зависла линия SCL, ничего не будет происходить, а мастер, захвативший
шину, должен освободить ее;
б) если зависла линия SDA, мастер должен освободить шину. Следует помнить, что
в нормальном состоянии удерживать линию SCL может только текущий мастер шины.
Последовательность действий для выхода из зависания следующая (при условии, что на
шине только один мастер):
- выключить и включить модуль I2C для перевода его в режим безадресного
ведомого;
- установить бит START для создания состояния старта;
- проверить, удерживается ли линия SDA в «0» (активное состояние) чтением бита
TSDA регистра CST. Если линия активна, отправить одиночный импульс по линии SCL,
установив бит TGSCL в регистре CST;
- проверить, что в поле MODE записан код 01b (состояние STDONE), который
укажет на то, что состояние старта сформировано. Если нет, то повторять предыдущий и
этот шаги до тех пор, пока линия SDA не освободится.
130
18 Контроллер интерфейса CAN
18.1 Протокол CAN
Последовательный интерфейс CAN (Controller Area Network) - интерфейс связи,
эффективно поддерживающий распределенное управление в масштабе реального времени
с высокой помехозащищенностью. Протокол связи определен в спецификации CAN 2.0B.
Протокол CAN оптимизирован для систем, в которых должно передаваться
относительно небольшое количество информации (по сравнению с Ethernet или USB) к
любому или всем узлам сети. Множественный доступ с опросом состояния шины
позволяет каждому узлу получить доступ к шине с учетом приоритетов. Неадресная
структура сообщений позволяет организовать многоабонентскую доставку данных с
сокращением трафика шины. Быстрая устойчивая передача информации с системой
контроля ошибок позволяет отключать неисправные узлы от шины, что гарантирует
доставку критических по времени сообщений.
Область применения протокола CAN: от высокоскоростных сетей связи до
электропроводов в автомобиле. Высокая скорость передачи данных (до 1 Мбит/с),
хорошая помехозащищенность протокола, защита от неисправности узлов - делают шину
CAN подходящей для индустриальных приложений управления типа Device Net.
CAN имеет асинхронную последовательную структуру шины с одним логическим
сегментом сети. CAN сеть может состоять из двух или более узлов с возможностью
подключения/отключения узлов от шины без перенастройки других устройств (см.
рисунок 18.1).
Рисунок 18.1 - Общая структура CAN сети
Логика шины работает по механизму монтажного И, в котором рецессивный бит
соответствует логической единице, а доминантный - логическому нулю. Пока ни один
узел не формирует доминантный бит, шина находится в рецессивном состоянии.
Появление на шине доминантного бита (выставленного одним или несколькими узлами)
создает доминантное состояние шины. Отсюда следует, что при выборе среды передачи
данных необходимо точно определить, какое состояние будет доминантным, а какое -
рецессивным. Одним из наиболее распространенных и дешевых вариантов линии связи
является пара скрученных проводов. Линии шины тогда называются CANH и CANL и
131
могут быть подключены непосредственно к устройствам. Не существует никакого
дополнительного стандарта на среду передачи данных.
При использовании в качестве линии связи пары скрученных проводов с
нагрузочными резисторами на концах можно получить максимальную скорость передачи
данных 1 Мбит/с при длине линии до 40 м. Для линий связи протяженностью более 40 м
необходимо снизить скорость передачи данных (для линии 1 000 м скорость шины должна
быть не более 40 Кбит/с). Из-за дифференциального характера линии связи шина CAN
малочувствительна к электромагнитным помехам. Экранирование шины значительно
снизит воздействие внешнего электромагнитного поля, что особенно важно для
высокоскоростных режимов работы.
Двоичная информация кодируется. Доминантным является низкий уровень,
рецессивным - высокий. Для гарантированной синхронизации данных всеми узлами
шины используется принцип «бит-стаффинга». Это означает, что при последовательной
передаче пяти бит одинаковой полярности передатчик вставляет один дополнительный
бит противоположной полярности перед передачей остальных битов. Приемник также
проверяет полярность и удаляет дополнительные биты.
В CAN протоколе при передаче данных приемные узлы не адресуются, а
указывается идентификатор передатчика. С помощью идентификатора указывается
содержание сообщения (например, применительно автомобиля - обороты, температура
двигателя и т. д.) и степень приоритета сообщения. Более высокий приоритет у
идентификатора, имеющего меньшее бинарное значение.
При коллективном доступе к шине используется неразрушающий арбитраж с
опросом состояния шины. Перед началом передачи данных узел проверяет состояние
шины (отсутствие активности на шине). При начале передачи сообщения узел становится
управляющим шины, все остальные узлы переходят в режим приема. После приема
сообщения (подтвержденного каждым узлом) каждый узел проверяет идентификатор в
сообщении и сохраняет сообщение, если это требуется. В противном случае, сообщение
сбрасывается. Если два или более узлов начинают передачу данных одновременно,
поразрядный арбитраж позволяет избежать конфликта на шине. Каждый узел выдает на
шину свой идентификатор (старший бит формируется первым) и контролирует ее
состояние. Если узел посылает «1», а читает «0», значит, арбитраж потерян, и узел
переключается в режим приема. Это происходит тогда, когда идентификатор
конкурирующего узла имеет меньшее бинарное значение. Таким образом, узел с высоким
приоритетом выигрывает арбитраж без необходимости повторять сообщение. Все
остальные узлы будут пытаться передать сообщение после освобождения шины. Данный
механизм не позволяет передавать сообщения одновременно разными узлами. Для этого
программно должно быть обеспечено, чтобы узлы, передающие данные, не имели
одинаковых идентификаторов. Оригинальная спецификация в версии CAN 2.0b (так
называемая расширенная версия CAN) определяет возможность идентификатора иметь
длину 11 или 29 бит.
Протокол CAN предусматривает следующие типы сообщений:
- сообщение данных (стандартное и расширенное);
- удаленный запрос данных;
- сообщение об ошибке;
- сообщение о перезагрузке.
132
Стандартное сообщение данных
Формируется, когда узел желает передать данные. Формат сообщения показан на
рисунке 18.2.
Рисунок 18.2 - Стандартное сообщение данных
Стандартное сообщение имеет в своем составе:
- бит SOF - доминантный («0») бит начала сообщения для жесткой синхронизации
всех узлов;
- поле арбитража (12 бит), включающее поле ID идентификатора (11 бит) и бит RTR
передачи по удаленному запросу (RTR
=
«0» соответствует сообщению данных,
RTR = «1» соответствует удаленному запросу);
- поле управления
(6 бит), включающее бит IDE
- указатель расширенного
идентификатора (IDE = «0» соответствует стандартному идентификатору, IDE = «1»
соответствует расширенному идентификатору), бит RB0 - резервный доминантный бит и
поле DLC - числа байт данных (4 бита), которое указывает, сколько байт данных
содержится в сообщении (допустимые значения - от
0 до
8, другие значения
использоваться не могут);
- поле данных (от 0 до 64 бит), содержащее целое число байт данных;
- поле контрольной суммы CRC
(16 бит), включающее поле CRC
(15 бит),
используемое для обнаружения возможных ошибок передачи данных и бит CRCDel
рецессивный разделитель CRC;
- поле подтверждения (2 бита), включающее бит АСК Slot подтверждения передачи
(передающий узел выдает рецессивный бит, а любой узел, который принял сообщение без
ошибок, заменяет его сформированным доминантным битом) и бит ACKDel рецессивный
разделитель подтверждения;
- поле EOF конца сообщения (7 бит).
Между передачами двух любых сообщений шина должна оставаться в рецессивном
состоянии как минимум в течение времени появления 3 бит (поле INT простоя). Если
после появления трех рецессивных битов (поле INT) ни один узел не начал передачу,
шина переходит в состояние бездействия IDLE и находится в рецессивном состоянии до
появления доминантного бита сообщения.
133
Расширенное сообщение данных
Формируется, когда узел желает передать данные. Формат сообщения показан на
рисунке 18.3.
Рисунок 18.3 - Расширенное сообщение данных
Расширенное сообщение имеет в своем составе:
- бит SOF - доминантный («0») бит начала сообщения для жесткой синхронизации
всех узлов;
- поле арбитража (38 бит), включающее поле стандартного идентификатора (11 бит),
бит SRR заменитель удаленного запроса, бит IDE указатель расширенного
идентификатора (рецессивный, что соответствует расширенному идентификатору) и поле
расширенного идентификатора (18 бит);
- бит RTR передачи по удаленному запросу (RTR = «0» соответствует сообщению
данных, RTR = «1» соответствует удаленному запросу);
- поле управления (6 бит), включающее бит RB0 - резервный доминантный бит, бит
RB1 резервный доминантный бит и поле DLC числа байт данных (4 бита), которое
указывает, сколько байт данных содержится в сообщении (допустимые значения -
от 0 до 8, другие значения использоваться не могут);
- поле данных (от 0 до 64 бит), содержащее целое число байт данных;
- поле контрольной суммы CRC
(16 бит), включающее поле CRC
(15 бит)
используемое для обнаружения возможных ошибок передачи данных и бит CRCDel
рецессивный разделитель CRC;
- поле подтверждения (2 бита), включающее бит АСК Slot подтверждения передачи
(передающий узел выдает рецессивный бит, а любой узел, который принял сообщение без
ошибок, заменяет его сформированным доминантным битом) и бит ACKDel рецессивный
разделитель подтверждения;
- поле EOF конца сообщения (7 бит).
Удаленный запрос данных
Формируется, когда узлу требуются данные другого узла. Узел назначения посылает
удаленный запрос с идентификатором источника. Соответствующий узел источника
(распознавший свой идентификатор) посылает стандартное или расширенное сообщение в
ответ на запрос.
Удаленный запрос данных существует в стандартном и расширенном вариантах (на
рисунке 18.4 представлен вариант удаленного запроса со стандартным идентификатором).
134
Рисунок 18.4 - Удаленный запрос данных (стандартный формат)
Имеются только два отличия содержимого удаленного запроса от сообщения
данных:
- бит RTR в удаленном запросе передается в рецессивном состоянии;
- поле данных отсутствует (в сообщении не передается никаких данных, значение в
поле DLC любое в пределах от 0 до 8).
В самом маловероятном случае, когда одновременно формируется удаленный
запрос, и устройство пытается передать данные с одинаковыми идентификаторами,
арбитраж будет выигран устройством, передающим данные, из-за доминантного
состояния бита RTR.
Узел, который посылал запрос, получает данные немедленно.
Сообщение об ошибке
Формируется любым узлом, который обнаруживает ошибку на шине. Формат
сообщения показан на рисунке 18.5.
Сообщение об ошибке состоит из двух полей: поле разделителя ошибки и поле флага
ошибки. Возможны два типа поля флага ошибки, в зависимости от вида ошибки узла,
обнаружившего ее.
Если ошибку обнаружил активный узел (как в примере на рисунке 18.5), тогда он
прерывает передачу текущего сообщения, формируя флаг активной ошибки. Флаг
активной ошибки состоит из шести последовательных доминантных битов, которые
нарушают правила бит-стаффинга (правила наполнения и передачи битов на шине).
Остальные узлы также обнаруживают ошибку и начинают формировать сообщение об
ошибке. Таким образом, поле флага ошибки может содержать от 6 до 12 доминантных
битов (сформированных одним узлом или более). Поле флага ошибки дополняется
разделителем ошибки, состоящим из восьми рецессивных битов и позволяющим
перезапускать связь с шиной после обнаружения ошибки. После перехода шины в
нормальное состояние узлы возобновляют передачу данных, остановленный узел
повторяет передачу сообщения, переданного до этого с ошибкой.
135
Рисунок 18.5 - Сообщение об ошибке
Если ошибку обнаружил пассивный узел, тогда он формирует флаг пассивной
ошибки, состоящий из шести последовательных рецессивных битов и затем разделитель
ошибки. Таким образом, сообщение о пассивной ошибке состоит из 14 рецессивных
битов. Это не нарушает правила бит-стаффинга на шине и не оказывает влияния на
передачи других узлов. Исключение составляет узел, который передает данные узлу,
обнаружившему ошибку. В этом случае правила бит-стафинга нарушаются и передача
данных прекращается. После передачи пассивной ошибки узел должен ожидать шесть
последовательных рецессивных битов для восстановления связи с шиной.
Сообщение о перезагрузке
Формат сообщения о перезагрузке аналогичен формату сообщения об ошибке, но
может быть сформирован только, когда шина простаивает.
Сообщение о перезагрузке показано на рисунке 18.6.
Рисунок 18.6 - Сообщение о перезагрузке
Разделитель перезагрузки состоит из восьми последовательных рецессивных битов.
Узел может сформировать сообщение о перезагрузке в двух случаях:
- между сообщениями обнаружен доминантный бит, что является ненормальным во
время простоя шины;
136
- для задержки передачи нового сообщения.
Узел может последовательно сформировать не более двух сообщений перезагрузки.
Флаг перезагрузки состоит из шести последовательных доминантных битов. Другие
узлы обнаруживают перезагрузку и начинают формировать ее самостоятельно. Поэтому
на шине во время выполнения перезагрузки может быть до 12 доминантных битов.
18.2 Структура и функционирование контроллера CAN
В состав контроллера CAN входият два идентичных независимых узла CAN0 и
CAN1, ОЗУ для хранения сообщений, которое является общим для узлов, и система
управления. Контроллер CAN имеет следующие функциональные особенности:
- соответствие ISO 11898;
- функционирование согласно спецификации CAN 2.0b (активная версия);
- отдельные управляющие регистры для каждого из двух узлов;
- программируемая скорость передачи информации до 1 Мбит/с;
- гибкий и полный контроль передачи сообщений и обработки ошибок.
Контроллер CAN реализует 16 линий прерываний и 256 объектов сообщений для
хранения сообщений и их параметров в ОЗУ. Каждый объект сообщения может быть
привязан к любому из узлов, сконфигурирован для передачи или приема как стандартных,
так и расширенных сообщений и удаленных запросов. Каждый объект имеет
индивидуальную маску для фильтрации принимаемых сообщений. Объекты сообщений
могут объединяться в классы, с разными уровнями приоритета, могут объединяться для
построения структур FIFO произвольных размеров (до 256 объектов в одной структуре).
Кроме того, реализована возможность попарного соединения объектов для формирования
шлюзов для автоматической передачи сообщений между узлами. Параллельно с
вышеуказанными свойствами объекты сообщений могут организовываться в списки с
постоянно доступной реорганизацией (совместимость с TwinCan-устройствами, которые
не имеют списков).
Структура контроллера CAN приведена на рисунке 18.7.
Рисунок 18.7 - Общая структура контроллера CAN
137
Синхронизация
Тактирующим сигналом контроллера CAN является сигнал Fclc (Fin), приходящий с
генератора тактовых сигналов. На основе этого сигнала посредством программируемого
дробного делителя частоты формируется внутренний сигнал Fcan (Fout),
синхронизирующий работу контроллера и являющийся базовым синхросигналом для
передачи/приема сообщений по внешней шине CAN.
Включение контроллера CAN
По умолчанию, после сброса микроконтроллера контроллер CAN выключен. На это
также указывает состояние флага DISS регистра CLC. Когда контроллер выключен, этот
флаг установлен.
Для включения контроллера CAN следует записать ноль в бит DISR регистра CLC.
После этого флаг DISS сбросится. Рекомендуется проверять состояние флага DISS, перед
началом программирования регистров контроллера, которые не доступны в выключенном
состоянии.
Выключение контроллера CAN
Программно можно перевести контроллер CAN в режим выключения установкой
бита DISR. Контроллер завершает все текущие операции, после чего устанавливает флаг
DISS и отключает внутреннее тактирование, в связи с чем, все регистры становятся
недоступными для обращения.
Простой шины
Между передачами сообщений шина CAN находится в рецессивном состоянии. Для
выполнения условий простой шины необходимо, чтобы было получено, как минимум, три
рецессивных бита после завершения передачи/приема очередного сообщения.
Анализ работы контроллера CAN
Для анализа работы контроллера доступны два режима
- общего анализа и
внутренней петли.
Режим общего анализа включается установкой бита CALM регистра NCR узла и
позволяет осуществлять независимый мониторинг работы узла, не затрагивая шину CAN.
В этом режиме сообщения данных и удаленные запросы отслеживаются без участия узла в
операциях на шине. Выходы узла находятся в рецессивном состоянии. Узел может
получать сообщения данных, сообщения удаленных запросов и сообщения об ошибках, но
работа узла на передачу запрещена. Полученные сообщения данных/удаленных запросов
остаются без подтверждения (бит подтверждения остается в рецессивном состоянии), но
принимаются и сохраняются (при совпадении идентификаторов) в соответствующих
объектах сообщений. В ответ на входящие сообщения не выдается подтверждение, и не
генерируются сообщения об ошибках. На удаленные запросы не выдаются сообщения
данных, а сами сообщения данных не могут быть переданы установкой бита запроса
передачи TXRQ регистра состояния объекта сообщения MOSTAT. Прерывания после
приема генерируются (если это разрешено) для всех принятых сообщений, не содержащих
ошибок.
Режим внутренней петли включается установкой бита LBM регистра NPCR и
позволяет проводить внутреннее тестирование контроллера CAN, а также отладку
управляющей программы без доступа к внешней шине CAN. Внутренняя петля состоит из
внутренней шины CAN (внутри контроллера CAN) и переключателя выбора шины для
каждого узла (см. рисунок 18.8). С помощью переключателя каждый узел CAN может
быть подключен либо к внутренней шине (режим внутренней петли), либо к внешней
шине (нормальный режим работы). Если выбран режим внутренней петли, то на внешнем
138
передающем выводе узла CAN поддерживается рецессивный уровень сигнала, а состояние
принимающего вывода игнорируется.
Рисунок 18.8 - Режим внутренней петли
Если оба узла CAN функционируют в режиме внутренней петли, они
взаимодействуют друг с другом посредством внутренней шины CAN, не оказывая влияние
на работу других модулей, функционирующих в нормальном режиме.
Дробный делитель
Дробный делитель позволяет генерировать частоту fout из входной тактовой частоты
fin (HCLK) путем программирования делителя посредством регистра FDR.
Рисунок 18.9 - Схема дробного делителя
Задаваемое значение входной частоты fin зависит от длительности передачи одного
бита информации и должно быть n-кратно ей. Поскольку длительность передачи бита
определяется количеством квантов времени (Ntq, см. далее), то для расчета частоты fin в
МГц следует пользоваться формулой:
fin = n×Ntq,
(18.1)
где Ntq - количество квантов времени tq;
n - целое число, начиная с 1 (для задания кратности).
Дробный делитель делит частоту fin путем умножения на величину 1/val или
величину 1024/val для любого val от 0 до 1023, выдавая на выходе тактовый сигнал
fout (fcan).
На рисунке 18.9 показана блок-схема дробного делителя. Логика дробного делителя
работает по-разному, в зависимости от режима, задаваемого полем DM.
139
В режиме нормального деления (DM = 01b) делитель работает как перегружаемый
счетчик с шагом инкрементирования, равным единице. Состояние счетчика доступно
посредством поля RESULT. Каждый раз, при переполнении (т. е. когда RESULT = 3FFh),
формируется импульс сигнала Fout, после чего в счетчик загружается значение из поля
STEP.
Выходная частота fout определяется по формуле
fout = fin× 1/ (1024 - STEPd),
(18.2)
где STEPd - значение поля STEP в десятичном формате.
Отсюда следует, что для получения частоты fout = fin, значение STEP должно быть
равно 3FFh. На рисунке 18.10 показано формирование сигнала Fout при значении
STEP = = 3FDh (1021d).
Рисунок 18.10 - Формирование сигнала с частотой fout в нормальном режиме
В режиме дробного деления (DM = 10b) делитель работает как перезагружаемый
счетчик, но шаг инкрементирования в этом случае равен значению поля STEP. Если
результат инкрементирования значения RESULT на величину STEP превышает 3FFh,
возникает переполнение счетчика, формируется импульс сигнала Fout, после чего в
счетчик загружается значение, на которое результат инкрементирования превысил 3FFh.
Выходная частота fout определяется по формуле
fout = fin× STEPd / 1024d .
(18.3)
В целом, режим дробного деления позволяет программировать частоту fout с более
высокой точностью, чем нормальный режим, но сигнал может иметь джиттер периода, не
превышающий одного периода fin, в связи с чем, не рекомендуется использовать режим
дробного деления при высоких скоростях передач.
На рисунке 18.11 показано формирование сигнала Fout при значении STEP = 234h
(564d). fout = fin× 564/1024 = 0,55 × fin.
Рисунок 18.11 - Формирование сигнала с частотой fout в режиме дробного деления
Процесс выключения делителя начинается одновременно с возникновением запроса
выключения контроллера CAN.
140
Контроллер сообщений
Управляет обменом сообщениями между CAN узлами и памятью сообщений и
выполняет следующие функции:
- фильтрация входящих сообщений для определения корректного объекта сообщения
для сохранения полученных данных;
- определение объекта сообщения, содержимое которого будет передано в первую
очередь (для каждого узла индивидуально);
- передача содержимого объекта сообщения к CAN узлу с параллельной вставкой в
сообщение битов управления и состояния;
- осуществление буферизации FIFO и функционирования шлюза;
- объединение битов уведомления ждущих обработки сообщений.
Управление прерываниями блока CAN
На рисунке 18.12 показана структура формирования запроса на прерывание.
Рисунок 18.12 - Структура формирования запроса на прерывание
Событие, по которому должен быть сгенерирован запрос на прерывание,
устанавливает флаг прерывания и (если разрешено) формирует запрос на прерывание на
одной из 16 линий прерываний. Импульс запроса на прерывание генерируется независимо
от состояния флага прерывания. Флаг прерывания может быть сброшен программно,
записью нуля. Если к одной линии прерываний подключены несколько источников
прерываний, то появление импульса от любого источника сформирует запрос на
прерывание. Логика управления прерываниями использует схему компрессии
прерываний.
Источниками прерываний являются:
- CAN узлы (восемь источников - по четыре для каждого узла);
- объекты сообщений (512 источников - по два для каждого объекта);
- программное прерывание (источник - регистр MITR).
Каждый аппаратный источник прерывания управляется
4 битами указателя
прерываний, который определяет для него одну из 16 линий прерываний, что позволяет
коммутировать на одну линию несколько источников прерываний. На рисунке 18.13
представлена схема коммутации линий прерываний.
Когда объект сообщения n генерирует запрос на прерывание по окончании приема
или передачи сообщения, запрос передается на линию прерываний, выбранную в битовом
поле RXINP или TXINP регистра MOIPR объекта сообщения n. Если количество объектов
сообщений больше, чем количество линий прерываний, то на одну линию могут
приходить несколько запросов прерываний. Для разрешения конфликтов на линиях
прерываний в контроллере CAN предусмотрен механизм распределения приоритетов для
объектов сообщений.
141
Рисунок 18.13 - Схема коммутации линий прерываний
18.3 Узел контроллера CAN
Каждый узел CAN имеет свою собственную логику управления и выдачи
информации о состоянии и может быть сконфигурирован и работать независимо от
другого узла.
Режим конфигурации включается установкой бита CCE регистра NCR. Режим
конфигурации позволяет изменять параметры синхронизации битов и состояния
счетчиков ошибок.
Конфигурация прерываний задается битами TRIE, ALIE и LECIE:
- бит TRIE управляет разрешением прерывания после передачи сообщения;
- бит ALIE управляет разрешением прерываний по ошибке;
- бит LECIE управляет разрешением прерывания по коду последней ошибки.
Регистр NSR отражает текущее состояние, содержит информацию о передачах и
ошибках узла.
142
Блок управления узлом
Координирует работу:
- разрешает/запрещает действия узла на шине;
- разрешает/запрещает и генерирует различные события, касающиеся работы узла
(ошибка на шине, успешное завершение передачи сообщения), которые приводят к
формированию запросов на прерывания;
- управляет счетчиком сообщений.
Блок синхронизации битов
Согласно стандарту ISO 11898 время передачи одного бита разделено на сегменты,
которые, в свою очередь, составлены из целочисленных отрезков времени, называемых
квантами времени tq (см. рисунок 18.14). Квант времени - фиксированная единица
времени, получаемая из частоты синхронизации и делителя контроллера CAN.
Сегмент синхронизации Tsync позволяет синхронизировать начало обмена данными
между передатчиком и приемником. Длительность сегмента всегда равна одному кванту
времени.
Сегмент распространения - Tprop. Используется для компенсации физического
времени запаздывания сигнала в пределах сети. Длительность сегмента рассчитывается с
учетом времени прохождения сигнала от передатчика к приемнику и обратно, входной
задержки компаратора и задержки выхода драйвера и может составлять от 1 до 8 квантов
времени.
Рисунок 18.14 - Структура одного бита
Сегменты буфера фазы 1 и буфера фазы 2 - Tb1 и Tb2, расположенные до и после
точки выборки, используются для компенсации смещения фазы тактовых частот
источника и приемника, обнаруживаемой после появления сегмента синхронизации, а
также для оптимального расположения точки выборки полученного бита.
Точка выборки - момент, когда читается состояние шины для определения
принятого бита. Как правило, длительность временного интервала от начала бита до точки
выборки составляет (60 - 70) % времени бита, в зависимости от системных параметров.
Сегмент распространения и сегмент буфера фазы 1 вместе составляют сегмент
параметра
1 (Tseg1), который определяется битовым полем TSEG1 регистра
синхронизации битов NBTR (может быть записан, только если установлен бит CCE
регистра NCR). Согласно стандарту ISO, минимальная длительность сегмента параметра 1
должна составлять три кванта времени.
Сегмент параметра 2 (Tseg2) определяется битовым полем TSEG2 регистра NBTR и
охватывает сегмент буфера фазы 2. Минимальная длительность сегмента параметра 2
составляет два кванта времени.
Согласно стандарту ISO, минимальная длительность одного бита, получающаяся
сложением сегментов Tsync, Tseg1 и Tseg2 не должна быть менее 8 квантов времени.
Максимальная длительность бита - 25 квантов времени.
143
Примечание
- Минимальное номинальное время передачи одного бита
составляет 1 мкс, что соответствует скорости передачи 1 Мбит/с.
Формулы вычисления значений сегментов и времени одного бита Tbit:
- при DIV8 = 0 значение кванта времени
tq= (BRP + 1) / fout;
(18.4)
- при DIV8 = 1 значение кванта времени
tq = 8 × (BRP + 1) / fout;
(18.5)
- Tsync = 1 × tq;
- Tseg1 = (TSEG1 + 1) × tq ≥ 3tq;
- Tseg2 = (TSEG2 + 1) × tq ≥ 2tq;
- Tbit = Tsync + Tseg1 + Тseg2 ≥ 8tq.
Чтобы компенсировать смещение фазы между частотами генераторов различных
узлов шины, каждое устройство должно синхронизироваться по фронту смены уровня
сигнала на шине от рецессивного к доминантному. Как только фронт обнаруживается,
логика синхронизации сравнивает его текущее положение с ожидаемым и выполняет
настройку значений параметров Tseg1 и Тseg2.
Контроллер CAN использует два механизма синхронизации
- аппаратный и
ресинхронизацию (синхронизация с восстановлением тактовых интервалов).
Аппаратная синхронизация выполняется по каждому фронту смены уровня сигнала
на шине от рецессивного к доминантному. При аппаратной синхронизации временные
интервалы сегментов, из которых складываются времена битов, не изменяются в течение
всего сообщения.
Ресинхронизация выполняется автоматическим удлинением сегмента Tseg1 или
укорачиванием сегмента Tseg2. Максимальное значение изменения сегментов колеблется
в пределах от 1 до 4 квантов времени. Синхронизация выполняется только при появлении
фронта смены уровня сигнала на шине от рецессивного к доминантному. Фиксированное
значение максимального числа последовательных бит одинаковой полярности
гарантирует своевременное восстановление синхронизации. Смещение фазы фронта
смены уровня сигнала на шине отслеживается относительно сегмента cинхронизации и
измеряется в квантах времени.
Если величина фазового смещения меньше или равна запрограммированному
значению ширины перехода ресинхронизации Tsjw, выполняется аппаратная
синхронизация.
Если величина смещения фазы больше, чем Tsjw, а фазовое смещение
положительно, то удлиняется сегмент Tseg1, в случае отрицательного фазового смещения
укорачивается сегмент Tseg2.
Значение Tsjw определяется полем SJW регистра NBTRx по формуле
Tsjw= (SJW + 1) × tq .
(18.6)
Помимо прочего, должны соблюдаться следующие правила:
Tseg1 ≥ Tsjw + Tprop и Tseg2 ≥ Tsjw.
Соотношения между максимальным отклонением частоты fout и сегментами
буферов фаз и шириной перехода ресинхронизации следующие:
- Δfout ≤ T/2 × (13 × Tbit - Tb2);
- Δfout ≤ Tsjw / 20 × Tbit,
144
где T - меньшее из Tb1 и Tb2.
В итоге:
- Tsync составляет 1 квант времени;
- Tprop - от 1 до 8 квантов времени;
- Tb1 - от 1 до 8 квантов времени;
- Tb2 - выбирается равным двум квантам времени или равным сегменту Tb1, если
его значение более двух квантов времени;
- Tsjw может составлять максимально
4 кванта времени, однако, в типовых
приложениях достаточно 1.
Корректные значения параметров синхронизации битов должны быть записаны в
регистр NBTR (доступен, если установлен бит CCE) до окончания инициализации (до
сброса бита INIT регистра NCR), т. е. до начала работы CAN узла.
Процессор потока битов
Процессор потока битов формирует (на основе содержимого объектов сообщений)
сообщения данных и удаленные запросы непосредственно перед отправкой на шину CAN.
Процессор потока управляет генератором CRC (генератор контрольной суммы) и
добавляет контрольную сумму к сообщению. После вставки битов начала (SOF) и конца
(EOF) сообщения, процессор потока начинает передачу сообщения по правилам
арбитража шины CAN. В течение всего времени передачи сообщения процессор потока
битов ведет мониторинг шины. Если обнаруживается несовпадение текущего
(определяемого мониторингом) и ожидаемого (выдаваемого CAN узлом) уровня
напряжения на шине, генерируется ошибка и соответствующий ей запрос на прерывание.
Код возникшей ошибки отражается в битовом поле LEC регистра NSR.
Корректность получаемых данных проверяется и подтверждается или не
подтверждается кодом CRC. В случае отсутствия подтверждения возникает ошибка,
генерируется запрос на прерывание и код ошибки выставляется в регистре NSR. Кроме
этого, на шину выдается сообщение об ошибке.
После получения сообщения, не содержащего ошибок, и разбиения его на
идентификатор и пакет данных полученная информация записывается в буфер блока
обработки сообщений, формируется соответствующее прерывание, и обновляются
регистры состояния.
Блок обработки ошибок
Блок обработки ошибок предназначен для выявления ошибок в работе устройств
узла. В составе блока есть два счетчика: счетчик ошибок приема (поле REC в регистре
NECNT) и счетчик ошибок передачи (поле TEC). Инкрементированием и
декрементированием счетчиков управляет процессор потока битов.
Если процессор потока битов сам выявляет ошибку в процессе передачи, то счетчик
TEC инкрементируется на 8. Инкрементирование на 1 происходит, если об ошибке
сообщено внешним CAN-устройством путем генерирования сообщения об ошибке.
Направление передачи с ошибочным сообщением и узел, сообщивший об ошибке
передачи, указывают на соответствующие узлы CAN в регистрах NECNT, что
используется для анализа ошибки.
В зависимости от значений счетчиков ошибок узел CAN может находиться в одном
из трех состояний:
- активной ошибки;
- пассивной ошибки;
- отключен от шины.
145
Узел находится в состоянии активной ошибки, если значение каждого из счетчиков
ошибок меньше 128. Узел в состоянии активной ошибки присоединен к шине и посылает
флаг активной ошибки при обнаружении ошибок.
Узел находится в состоянии пассивной ошибки, если значение хотя бы одного из
счетчиков ошибок больше или равно 128. Узел подключен к шине, но при обнаружении
ошибок посылает флаг пассивной ошибки. После передачи узел в состоянии пассивной
ошибки будет ждать инициализации дальнейшей передачи.
Узел находится в состоянии отключения от шины, если значение счетчика ошибок
TEC больше или равно 256. О том, что CAN узел находится в состоянии отключения от
шины, сигнализирует флаг BOFF регистра NSR. Узел в состоянии отключения от шины не
может работать с шиной (выходные передатчики отключены).
Флаг EWRN регистра NSR устанавливается, когда хотя бы один из счетчиков достиг
или превысил лимит ошибок, определенный в битовом поле EWRNLVL регистра NECNT.
Как только значения обоих счетчиков перестанут превышать лимит ошибок, флаг EWRN
сбросится.
Счетчик сообщений
Счетчик сообщений может использоваться для получения информации о завершении
передачи/приема сообщения соответствующего узла CAN. Подсчет сообщений
осуществляется 16 разрядным счетчиком, который управляется регистром NFCR. Битовые
поля CFMOD и CFSEL определяют режим работы и событие для инкрементирования
счетчика.
Каждый узел CAN имеет в своем составе
16-разрядный счетчик
сообщений/синхросчетчик, который подсчитывает количество принятых и переданных
сообщений. Битовое поле CFSEL определяет один из трех режимов работы счетчика.
В режиме подсчета сообщений после успешной передачи и/или приема сообщения,
содержимое счетчика копируется в битовое поле CFCVAL регистра MOIPR объекта
сообщения n, участвующего в пересылке данных. После чего счетчик сообщений
инкрементируется.
Прерывания узла CAN
Коммутация линий запросов прерываний показана на рисунке 18.15.
Рисунок 18.15 - Прерывания CAN узла
146
Узел может генерировать запросы на прерывания в случае:
- успешной передачи/приема сообщения;
- обнаружения кода последней ошибки;
- переполнения счетчика сообщений;
- состояния ALERT (состояние, возникающее, когда хотя бы один из счетчиков
ошибок узла достиг значения своего лимита, изменяется состояние «отключен от шины»,
возникает ошибка длины списка или ошибка списка объектов).
После каждой успешной передачи или успешного приема сообщения генерируется
(если разрешено соответствующими битами TXOK и RXOK) прерывание. Битовое поле
TRINP регистра NIPR задает одну (из 16) линию прерывания.
Прерывание узла при возникновении кода последней ошибки формируется (если
разрешено битом LECIE), если после модификации поля LEC его значение больше нуля.
Битовое поле LECINP задает линию прерывания.
Прерывание узла при переполнении счетчика сообщений генерируется, если оно
разрешено битом CFCIE регистра NFCR. Битовое поле CFCINP задает линию прерывания.
Прерывание ALERT может быть сформировано (если разрешено битом ALERT)
любым из следующих событий:
- изменение состояния бита BOFF;
- изменение состояния бита EWRN;
- ошибка длины списка, которая также выставляет бит LLE;
- ошибка элемента списка, которая также выставляет бит LOE;
- бит INIT выставлен аппаратно.
Битовое поле ALINP задает линию прерывания.
В дополнение к аппаратным прерываниям есть возможность программного
генерирования прерываний с использованием регистра прерываний MITR. Запись
единицы в n-й разряд битового поля IT генерирует сигнал запроса прерывания на
соответствующей ему n-ой линии прерываний (одной из 16). Установка нескольких битов
приводит к параллельному генерированию запросов прерываний на соответствующих
установленным битам линиях прерываний.
18.4 Объекты сообщений
Регистры управления и состояния объектов сообщений
В состав каждого объекта сообщения входят девять 32-разрядных регистров:
- управления и состояния - MOCTR (только запись) и MOSTAT (только чтение),
доступные по одному адресу;
- арбитража - MOAR;
- данных - MODATAH и MODATAL;
- маски - MOAMR;
- указателя прерываний - MOIPR;
- указателя FIFO/шлюза - MOFGPR;
- управления функционированием - MOFCR.
Расположение регистров представлено на рисунке 18.16, где для примера взят пятый
объект сообщения.
147
Рисунок 18.16 - Структура памяти регистров
Объекты сообщений контроллера CAN могут быть организованы в восемь списков
(см. рисунок 18.17).
Рисунок 18.17 - Списки контроллера CAN
Каждый объект сообщения может быть добавлен в один из списков. Каждый узел
CAN имеет свой список и соответствующий регистр списка. Регистр LIST1 отражает
состояние списка №1 узла CAN0, регистр LIST2 - списка №2 узла CAN1.
Примечание - Узел может оперировать только с теми объектами сообщений,
которые занесены в принадлежащий ему список.
Положение объекта сообщения n в списке определяется посредством регистра
MOSTAT, который содержит указатели на предшествующий ему и следующий за ним
элементы списка (объекты). Нераспределенные между узлами CAN объекты сообщений
по умолчанию организуются в отдельный список №0, состояние которого отражается в
регистре LIST0. Остальные пять списков с номерами от 3 до 7 являются свободными (не
принадлежат ни одному узлу) и имеют соответствующие регистры LIST3 - LIST7.
148
Примечание - Объекты сообщений, распределенные в списки с 3 по 7, не могут
быть использованы узлами CAN.
Механизмы FIFO и шлюза (см. далее) оперируют с объектами сообщений
независимо от их распределения по спискам, что дает возможность работы со всеми
восемью списками. Следовательно, при использовании механизмов FIFO и шлюза следует
внимательно следить за содержимым списков.
На рисунке 18.18 представлен вариант, когда объекты сообщений с номерами 3, 5 и
16 занесены в список № 2, принадлежащий узлу CAN1. Состояние списка отражено в
регистре LIST2.
Рисунок 18.18 - Пример списка объектов сообщений
Значение поля BEGIN регистра LIST2 указывает на первый элемент списка (объект
сообщения 5). Значение поля END указывает на последний элемент списка (объект
сообщения 3). Количество элементов списка (количество объектов сообщений в списке)
отражается в поле SIZE (значение SIZE всегда на единицу меньше количества элементов
списка). Бит EMPTY является индикатором заполнения списка. Если список пуст, бит
EMPTY установлен, в противном случае бит сброшен.
Каждый объект сообщения содержит номер списка (поле LIST), к которому он
относится, а также указатели PNEXT и PPREV на следующий по списку объект
сообщения и предшествующий, соответственно. Поле PPREV первого по списку объекта
сообщения должно указывать на этот же объект. Поле PNEXT последнего по списку
объекта сообщения должно указывать на этот же объект.
На рисунке 18.18 указатель PPREV пятого объекта сообщения (первого в списке)
имеет значение 5h, а указатель PNEXT третьего объекта сообщения (последнего в списке)
имеет значение 3h. Значение поля LIST всех трех объектов сообщений равно 2h.
Объект сообщения, у которого LIST = 0h относится к нулевому списку
нераспределенных объектов. После сброса все объекты сообщений считаются
нераспределенными. По умолчанию, порядок элементов списка № 0 следующий: объект
сообщения (n - 1) является предыдущим объекта сообщения n, а объект сообщения (n + 1)
- следующим.
Для просмотра структуры списка объектов сообщений узла достаточно обратиться к
соответствующим регистрам LIST1/LIST2 и MOSTAT.
Структура списка управляется и изменяется посредством контроллера списка,
который, в свою очередь, управляется панелью команд, основное назначение которой -
упрощение внесения изменений в структуру списка, отслеживание этих изменений и
проверка их корректности с помощью регистра PANCTR.
149
Панель команд запускается записью соответствующей команды в битовое поле
PANCMD. До записи кода команды должны быть записаны соответствующие аргументы
команды в битовые поля PANAR1 и PANAR2.
Примечание - Запись новых значений в поля PANAR1 и PANAR2 не изменяет
сразу их содержимого. Новые значения сначала попадают в специальный теневой регистр.
Далее, одновременно с записью кода команды в поле PANCMD, новые значения из
теневого регистра переносятся в поля PANAR1 и PANAR2.
С записью корректного кода команды выставляется флаг BUSY, и в дальнейшем все
попытки записи в регистр PANCTR игнорируются. Флаг BUSY остается активным, а
панель команд заблокированной до тех пор, пока не завершится выполнение записанной
команды.
После сброса микроконтроллера контроллер списка формирует список
№ 0
нераспределенных объектов сообщений. Во время этой операции флаг BUSY установлен,
и все обращения к объектам сообщений запрещены. По окончании этой операции флаг
BUSY сбрасывается, и объекты становится доступными.
В случае появления команды динамического распределения, по которой какой-либо
элемент забирается из списка № 0 и переносится в другой указанный список, наряду с
битом BUSY, устанавливается бит RBUSY. Это указывает на то, что значения битовых
полей PANAR1 и PANAR2 будут обновлены контроллером списка следующим образом:
- номер объекта сообщения, переносимого из списка
№ 0 нераспределенных
объектов сообщений, записывается в PANAR1;
- если установлен бит ERR (седьмой бит поля PANAR2), значит, список № 0 пуст и
выполнение команды завершается; если бит ERR сброшен - список № 0 не пуст и команда
выполняется.
Результаты выполнения команды динамического распределения записываются до
того, как контроллер списка начнет процесс распределения. Как только результаты станут
доступны, бит RBUSY сбрасывается. Это позволяет пользователю запрограммировать
настройки желаемого объекта сообщения, в то время как контроллер списка распределяет
объекты. Во время операций со списками доступ к объектам сообщений не запрещен, но
следует помнить, что любой доступ к регистрам объектов сообщений в течение процесса
распределения объектов вносит задержку (в процесс), равную длительности доступа.
Код команды «нет операции» автоматически записывается в битовое поле PANCMD.
Новая команда может быть записана в любое время, когда бит BUSY сброшен.
Все битовые поля регистра PANCTR, исключая биты BUSY и RBUSY, могут быть
записаны программно, что делает возможным сохранять и восстанавливать значения
регистра PANCTR, если панель команд используется независимой подпрограммой
обработки прерываний. Если возникает такая ситуация, то любые задачи, которые
используют панель команд и которые могут прерывать выполнение других задач, тоже
использующих панель команд, будут опрашивать состояние флага BUSY. До тех пор, пока
флаг BUSY будет оставаться установленным, содержимое регистра PANCTR будет
сохранено в соответствующей области памяти до операции восстановления. Как только
подпрограмма обработки прерываний закончится, содержимое регистра PANCTR будет
восстановлено.
До того, как объект сообщения, занесенный в список активного узла CAN, будет
перенесен на другую позицию этого же списка или перенесен в другой список, бит
MSGVAL регистра MOSTATn объекта сообщения n должен быть очищен.
150
Примечание - Если требуется перераспределить объекты сообщений в списки
повторно, необходимо приостановить работу узлов CAN (установить бит INIT регистра
NCR), а после занесения объектов в списки возобновить ее (сбросить бит INIT).
18.5 Прием и передача сообщений
Прием сообщения
После завершения приема сообщение сохраняется в объекте сообщения в
соответствии с установленным алгоритмом (см. рисунок 18.19).
Рисунок 18.19 - Алгоритмы приема и передачи сообщения
151
Помимо сохранения данных в объекте сообщения, контроллер CAN осуществляет
обмен данными с ЦП.
При приеме сообщения информация сохраняется в объекте сообщения только в том
случае, если установлен бит MSGVAL регистра MOSTAT. Если ЦП очищает бит
MSGVAL, контроллер CAN останавливает запись в объект сообщения, и далее объект
может быть реконфигурирован центральным процессором с последующей записью в него
информации без участия контроллера CAN.
Полученное с шины сообщение может быть сохранено в объекте сообщения только в
случае, если установлен бит RXEN. Контроллер CAN проверяет состояние бита RXEN
только во время фильтрации принимаемого сообщения. После того, как сообщение
принято, состояние бита не имеет значения и не оказывает влияния на дальнейшее
сохранение данных в объекте сообщения.
Бит RXEN позволяет управлять блокированием объекта сообщения - после сброса
бита RXEN полученное сообщение сохраняется в объекте сообщения, который получил
приоритет, но в сохранении последующих сообщений этот объект не принимает участия.
Реконфигурация объекта сообщения центральным процессором во время работы
контроллера CAN (например, сброс бита MSGVAL, изменение объекта сообщения и
повторная установка бита MSGVAL) происходят следующим образом:
- объект сообщения получает приоритет;
- ЦП очищает бит MSGVAL для реконфигурации объекта сообщения;
- после реконфигурации ЦП снова устанавливает бит MSGVAL;
- завершается получение сообщения;
- если установлен бит MSGVAL, полученные данные сохраняются в объекте
сообщения, генерируется запрос на прерывание, устанавливается соответствующий флаг;
- если сконфигурировано, производятся шлюзовые и FIFO операции.
Примечание - После реконфигурации объекта сохранение данных по завершении
получения сообщения может быть нежелательным. Запретить запись данных в объект
сообщения можно посредством бита RTSEL.
После получения объектом сообщения приоритета, его бит RTSEL устанавливается
контроллером CAN, открывая, таким образом, объект сообщения для записи. После
приема сообщения контроллер CAN дополнительно проверяет возможность записи в
объект сообщения, а именно - установлен ли все еще бит RTSEL. И только в том случае,
если бит RTSEL установлен, полученные данные сохраняются в объекте сообщения
(вместе со всеми последующими действиями, которые указаны выше).
Если во время операций контроллера CAN объект сообщения становится
некорректным (сброс бита MSGVAL), бит RTSEL должен быть сброшен до того, как бит
MSGVAL будет установлен снова, или, по крайней мере, одновременно с ним. Это
необходимо для предотвращения сохранения старой информации в объекте сообщения.
Реконфигурация объекта сообщения должна происходить следующим образом:
- сброс бита MSGVAL;
- реконфигурация объекта сообщения, пока бит MSGVAL сброшен;
- сброс бита RTSEL и далее установка бита MSGVAL.
Индикатором процесса сохранения (изменения) данных в объекте сообщения
является флаг RXUPD, который выставляется с началом процесса сохранения (изменения)
и сбрасывается с его окончанием.
После сохранения полученного сообщения (идентификатора, бита IDE, кода длины
данных, поля данных, в случае сообщения данных) выставляется флаг NEWDAT. Если к
моменту выставления (завершение сохранения/изменения данных) флаг NEWDAT был
152
уже установлен, выставляется флаг MSGLST, который говорит о том, что произошла
потеря данных.
Флаги RXUPD и NEWDAT позволяют произвести чтение корректных данных из
объекта сообщения во время текущих операций контроллера CAN. Рекомендуемая
последовательность действий следующая:
- сброс флага NEWDAT;
- чтение данных (идентификатор, данные и т. д.) из объекта сообщения;
- проверка флагов NEWDAT и RXUPD - оба флага должны быть сброшены. В
случае невыполнения этого условия возвращение к первому действию;
- если флаги NEWDAT и RXUPD сброшены, то содержимое объекта сообщения
корректно и не используется контроллером CAN в течение операции чтения.
Поведение флагов RXUPD, NEWDAT и MSGLST идентично как для сообщений
данных, так и для сообщений удаленных запросов.
Передача сообщения
Алгоритм передачи сообщений показан на рисунке
18.19. Одновременно с
копированием данных (идентификатора, бита IDE, бита RTR, равного биту DIR, кода
длины данных и собственно данных) из объекта сообщения, содержимое которого должно
быть передано во внутренний передающий буфер соответствующего узла CAN, для
контроля соблюдения четкой последовательности выполнения всех операций
устанавливаются биты состояния.
Сообщение может быть передано только в случае, когда все четыре бита MSGVAL,
TXEN0, TXEN1 и TXRQ установлены.
Бит RTSEL выставляется после того, как объект сообщения получает приоритет для
передачи своего содержимого. Когда данные объекта сообщения копируются в
передающий буфер, бит RTSEL проверяется, и если он установлен, сообщение передается.
После успешной передачи сообщения бит RTSEL проверяется снова, и если он
установлен, осуществляются дальнейшие операции.
Для полной и завершенной реконфигурации корректного объекта сообщения
должны быть выполнены следующие шаги:
- очистка бита MSGVAL;
- реконфигурация объекта сообщения, пока бит MSGVAL сброшен;
- сброс бита RTSEL и установка бита MSGVAL.
Сброс бита RTSEL гарантирует, как полное отключение объекта сообщения от
текущей передачи, так и то, что никакие операции (копирование данных в передающий
буфер, включая сброс бита NEWDAT, очистка бита TXRQ, прерывание сообщения и т. д.),
относящиеся к старой конфигурации этого объекта сообщения, не повлияют на новую
конфигурацию после установки бита MSGVAL.
После завершения передачи содержимого объекта сообщения в передающий буфер
узла CAN, флаг NEWDAT аппаратно сбрасывается, тем самым обозначая, что объект
сообщения открыт для записи новых данных.
Если после успешной передачи сообщения (на CAN-шину) флаг NEWDAT все еще
остается сброшенным (в объект сообщения не были записаны новые данные), флаг TXRQ
аппаратно сбрасывается. Если же флаг NEWDAT был установлен программно (в связи с
необходимостью передачи новых данных), флаг TXRQ не сбрасывается, тем самым
разрешая передачу новых данных.
153
18.6 Фильтрация сообщений
Фильтрация при получении сообщений
При получении узлом CAN сообщения определяется объект сообщения, в котором
будут сохранены получаемые данные в случае успешного приема.
Объект сообщения считается корректным для приема, если одновременно
соблюдаются условия:
- объект сообщения распределен в список объектов сообщений узла, который
принимает сообщение;
- бит MSGVAL установлен;
- бит RXEN установлен;
- бит DIR равен биту RTR принимаемого сообщения. Если бит DIR установлен,
объект сообщения (объект передачи) может принять только сообщение удаленного
запроса. Если бит DIR сброшен (объект приема), объект сообщения может принять только
сообщение данных;
- если бит MIDE установлен, то бит IDE получаемого сообщения оказывает
следующее влияние:
- если бит IDE (регистр MOAR) установлен, то бит IDE принимаемого
сообщения должен быть равен единице (расширенный идентификатор);
- если бит IDE сброшен, бит IDE принимаемого сообщения должен быть равен
нулю (стандартный идентификатор);
- если бит MIDE сброшен, значение бита IDE принимаемого сообщения не
важно, т. е. допускаются сообщения, как со стандартным, так и с расширенным
идентификатором;
- идентификатор полученного сообщения полностью (побитно) совпадает с
идентификатором, хранящимся в регистре MOARn объекта сообщения, за исключением
битов, закрытых маской регистра MOAMRn, значение которых не важно. На рисунке
18.20 показан пример проверки идентификатора.
Рисунок 18.20 - Проверка идентификатора полученного сообщения
Среди всех объектов сообщений, которые отвечают указанным выше критериям, для
сохранения полученного сообщения выбирается объект с наивысшим приоритетом. Для
задания приоритета используется поле PRI в регистре MOAR. Объект сообщения, у
которого значение поля PRI меньше, имеет больший приоритет. При равенстве значений
поля PRI приоритетным считается объект сообщения, который предшествует следующему
в списке.
154
Фильтрация при передаче сообщений
Когда требуется передача содержимого какого-либо объекта сообщения, в
соответствующих управляющих регистрах выставляются флаги, указывающие на
необходимость передачи. Объект сообщения считается корректным для передачи, если
одновременно соблюдаются условия:
- объект сообщения распределен в список объектов сообщений узда CAN;
- флаг MSGVAL установлен;
- флаг TXRQ установлен;
- флаги TXEN0 и TXEN1 установлены.
Может возникнуть ситуация, когда передачи требуют одновременно несколько
объектов сообщений. Среди всех объектов, которые отвечают указанным выше
критериям, для передачи выбирается объект с наивысшим приоритетом.
Объект сообщения, у которого значение поля PRI меньше, имеет больший
приоритет. При равенстве значений поля PRI разных объектов приоритет определяется
следующим образом:
- при PRI = 10b - согласно правилам арбитража передачи сообщения;
- при PRI = 01b/11b приоритет имеет объект сообщения, который предшествует
следующему в списке.
Объект сообщения, являющийся корректным для передачи и имеющий приоритет,
будет осуществлять передачу первым. Остальные объекты сообщений будут переданы по
очереди, согласно их приоритетам.
Объект сообщения определяется как стандартный объект сообщения, если в регистре
MOFCR значение битового поля MMC равно нулю. Стандартный объект сообщения
может принимать и передавать сообщения, согласно правилам, описанным выше.
На рисунке 18.21 показано формирование запроса на передачу объекта сообщения.
Рисунок 18.21 - Формирование запроса на передачу объекта сообщения
18.7 Удаленные запросы
После получения узлом CAN сообщения удаленного запроса и сохранения его в
объекте сообщения, выставляется бит запроса передачи для ответа на удаленный запрос
(отправка сообщения данных) или для автоматического повторения запроса.
В зависимости от состояния бита FRREN объекта сообщения, который принял
сообщение удаленного запроса, возможны два варианта действий:
- если бит FRREN сброшен, то устанавливается флаг TXRQ этого объекта;
- если бит FRREN установлен, то устанавливается флаг TXRQ того объекта, на
который указывает поле CUR объекта, принявшего удаленный запрос. При этом поле
CUR не меняет своего значения.
155
Состояние регистров объекта сообщения, передающего сообщение удаленного
запроса
У объекта сообщения, передающего сообщение удаленного запроса, в регистре
MOSTAT должен быть сброшен бит DIR (объект передает сообщение данных) и
установлены биты TXEN0, TXEN1, MSGVAL и TXRQ. Значение идентификатора в
регистре MOAR передающего объекта сообщения должно быть равно значению
идентификатора принимающего объекта сообщения (или совместно с регистром MOAMR
обеспечивать успешное прохождение фильтрации), чтобы сообщение удаленного запроса
было принято принимающим объектом другого узла. Само сообщение удаленного запроса
должно содержать идентификатор принимающего объекта сообщения, поэтому значение
регистра MODATAL передающего объекта сообщения должно быть равно значению
регистра MOAR принимающего объекта.
Состояние регистров объекта сообщения, принимающего сообщение
удаленного запроса при FRREN = 0
У объекта сообщения, принимающего сообщение удаленного запроса, должны быть
установлены биты DIR (объект принимает сообщение удаленного запроса), TXEN0 и
TXEN1 (если отвечать на запрос будет сам), RXEN и MSGVAL. Регистры MODATAL и
MODATAH должны содержать данные, которые будут переданы в ответ на запрос.
Состояние регистров объекта сообщения, принимающего сообщение
удаленного запроса (при FRREN = 1) и содержащего данные для ответа на
запрос
У объекта сообщения, принимающего сообщение удаленного запроса, должны быть
установлены биты DIR, RXEN и MSGVAL. Битовое поле CUR должно указывать на номер
объекта сообщения (должен находиться в том же узле, что и объект принявший
сообщение удаленного запроса), содержащего данные, предназначенные для передачи в
ответ на поступивший удаленный запрос.
В свою очередь у объекта сообщения, хранящего данные для отправки в ответ на
запрос, должны быть установлены биты DIR, (объект передает сообщение данных),
TXEN0, TXEN1 и MSGVAL. Бит TXRQ устанавливается автоматически при приеме
сообщения удаленного запроса принимающим объектом сообщения.
Прием ответа на запрос (переданного сообщения данных) осуществляется
стандартным объектом сообщения запрашивающего узла CAN (обмен данными
происходит между объектом сообщения, хранящим данные для отправки в ответ на
запрос, и объектом сообщения запрашивающего узла).
18.8 Дополнительные режимы передачи
Дополнительно имеются два режима, каждый из которых может быть выбран
индивидуально:
- режим передачи данных с защитой от повторений;
- режим однократной пересылки данных.
Режим передачи данных с защитой от повторения
Выбирается установкой бита SDT регистра MOFCR.
После приема сообщения данных и сохранения его в объекте с установленным
битом SDT, бит MSGVAL этого объекта аппаратно сбрасывается, чтобы исключить
возможность повторного приема и записи в этот объект. Этот режим нельзя использовать
для базового объекта FIFO структуры.
В ответ на сообщение удаленного запроса, принятое объектом с установленным
битом SDT, будут отправлены данные из объекта сообщения, на который указывает поле
156
CUR объекта, принявшего удаленный запрос. После этого бит MSGVAL объекта
принявшего сообщение удаленного запроса сбросится.
Примечание - Объект, принявший сообщение удаленного запроса, не может быть
источником данных, передаваемых в ответ на запрос. Это означает, что в данном режиме
бит FRREN объекта, принявшего удаленный запрос, обязательно должен быть установлен.
Режим однократной пересылки данных
Выбирается установкой бита STT.
Бит TXRQ сбрасывается, когда содержимое объекта сообщения копируется в
передающий буфер узла CAN. Таким образом, в дальнейшем, при неудачной (вследствие
ошибок) пересылке сообщения по CAN-шине, повторной передачи не будет.
18.9 FIFO структура объектов сообщений
Регистр MOFGPRn объекта сообщения n содержит установки указателей на объекты
сообщений, которые используются при операциях FIFO и шлюзовых операциях.
В случае сильной загрузки ЦП обработка серии сообщений может быть затруднена -
например, вследствие получения и/или передачи большого числа сообщений за малые
промежутки времени. Для таких случаев предусмотрена система буферов быстрого ввода-
вывода, так называемая FIFO структура, которая может функционировать автоматически
и позволяет избежать потери принимаемых сообщений, минимизировать время
подготовки сообщений к отправке, а также генерировать прерывания по окончании
операций.
Допускается организация нескольких параллельных FIFO структур. Число структур
и их составляющих зависит только от количества доступных объектов сообщений. FIFO
структура может быть создана, изменена и удалена в любой момент времени, даже во
время операций контроллера CAN.
На рисунке 18.22 представлена основная FIFO структура. Она состоит из одного
базового объекта и n-ого числа вспомогательных объектов.
Рисунок 18.22 - FIFO структура с базовым объектом и
n вспомогательными объектами
157
Вспомогательные объекты объединяются последовательно в списки (подобно
спискам объектов сообщений). Базовый объект может быть занесен в любой список. Хотя
на рисунке базовый объект не относится ни к одному из списков, он может быть вставлен
в любую последовательность вспомогательных объектов. Это означает, что базовый
объект одновременно является и вспомогательным объектом (шлюзовые операции не
возможны). Порядковые номера объектов сообщений (0, 1, 2 и т. д.) не имеют никакого
значения при FIFO операциях с объектами.
Базовый объект не нуждается в обязательном занесении его в какой-либо список, в
отличие от вспомогательных объектов, которые должны быть определены в общий список
(так как они последовательно связаны). С помощью указателей (битовые поля BOT, CUR
и TOP) можно присоединять базовый объект к вспомогательному объекту, независимо от
того, принадлежат базовый и вспомогательный объекты одному списку или разным
спискам.
Минимальная FIFO структура может состоять из одного объекта сообщения,
который будет одновременно являться и базовым, и вспомогательным (фактически не
используется). Максимальная FIFO структура может включать в себя все 256 объектов
сообщений.
В базовом объекте FIFO границы установлены: поле BOT указывает на самый
младший элемент FIFO структуры, поле TOP - на самый старший элемент, поле CUR - на
вспомогательный объект, который в настоящий момент выбран котроллером CAN для
передачи сообщения. Как только начинается передача, в CUR записывается номер
следующего по списку вспомогательного объекта сообщения (CUR = PNEXT
используемого объекта). Если значение битового поля CUR достигло номера старшего
элемента списка (CUR = TOP), то следующим значением будет BOT (реализация
автоматического перехода в начало списка). Таким образом, реализуется замкнутая FIFO
структура, в которой битовые поля TOP и BOT устанавливают связь между началом и
концом списка.
Битовое поле SEL позволяет определить вспомогательный объект в пределах списка,
для которого генерируется прерывание всякий раз, когда указатель CUR достигает
значения указателя SEL. Также битовое поле SEL позволяет отследить окончание
запланированной передачи серии сообщений или выдать прерывание, предупреждающее о
том, что FIFO структура становится заполненной.
FIFO структура для приема
Используется для буферизации входящих сообщений данных и удаленных запросов.
FIFO структура для приема активируется записью значения 0001b в битовое поле
MMC регистра MOFCR базового объекта. Эта запись автоматически определяет объект
как базовый объект приема FIFO. Типы вспомогательных объектов FIFO не имеют
значения при операциях.
Когда базовый объект FIFO получает сообщение от узла CAN, которому он
принадлежит, сообщение сохраняется не в этом базовом объекте, а во вспомогательном
объекте сообщения, на который указывает битовое поле CUR. При этом по умолчанию
предполагается, что для вспомогательного объекта MMC = 0000b (действительное
значение MMC игнорируется), и никаких операций фильтрации принимаемого сообщения
не производится.
Одновременно с приемом сообщения текущее значение указателя CUR базового
объекта меняется на номер следующего по списку вспомогательного объекта FIFO
структуры. Этот вспомогательный объект будет использован для приема следующего
сообщения.
Если установлен флаг OVIE регистра MOFCR базового объекта и значение указателя
CUR становится равным значению указателя SEL, генерируется прерывание
переполнения. Это прерывание генерируется на узле прерываний с указателем TXINP
158
базового объекта сразу после сохранения полученного сообщения во вспомогательном
объекте. Прерывания генерируются, если это разрешено битом TXIE.
Следует помнить, что сообщение сохраняется в базовом и вспомогательном
объектах FIFO, только если установлен бит MSGVAL.
Во избежание непосредственного приема сообщения вспомогательным объектом,
как если бы он был независимым объектом и не принадлежал FIFO структуре, флаги
RXEN всех вспомогательных объектов должны быть сброшены. Состояние флага RXEN
неважно в случае, когда вспомогательный объект занесен в список, не связанный с узлом
CAN.
FIFO структура для передачи
Используется для буферизации серий сообщений данных или удаленных запросов,
которые должны быть отправлены. FIFO структура для передачи состоит из базового
объекта и одного или более вспомогательных объектов.
FIFO структура для передачи активируется записью значения 0010b в поле MMC
регистра MOFCR базового объекта. В отличие от FIFO структуры для приема, в битовые
поля MMC вспомогательных объектов (FIFO структуры для передачи) должно быть
записано значение 0011b. Указатели CUR всех вспомогательных объектов должны
указывать на базовый объект FIFO передачи (чтобы инициализироваться программно).
Флаги TXEN1 всех вспомогательных объектов сообщений, за исключением одного,
на который указывает указатель CUR базового объекта, должны быть программно
сброшены. Флаг TXEN1 указанного объекта должен быть установлен. Указатель CUR
базового объекта может быть инициализирован для любого вспомогательного объекта.
При определении корректности объектов сообщений FIFO структуры для начала
FIFO-операций базовый объект должен быть определен первым как корректный, т. е.
MSGVAL должен быть установлен.
В случае необходимости удаления FIFO структуры, прежде чем начнется операция
удаления, все вспомогательные объекты, принадлежащие этой FIFO структуре, должны
быть определены как некорректные (биты MSGVAL должны быть сброшены).
FIFO структура для передачи использует флаги TXEN1 всех своих объектов для
выбора сообщения для передачи. В результате фильтрации право передавать сообщение
получает тот объект, у которого выставлен флаг TXEN1. После передачи сообщения флаг
TXEN1 аппаратно сбрасывается, а в указатель CUR записывается номер следующего
объекта, требующего отправки сообщения, для которого уже выставлен (аппаратно) свой
флаг TXEN1, и так далее для всей FIFO структуры.
Если установлен флаг OVIE регистра MOFCRn базового объекта и значение
указателя CUR становится равным значению указателя SEL, генерируется прерывание
переполнения. Это прерывание генерируется на узле прерываний с указателем RXINP
базового объекта после завершения операций получения сообщения. Прерывания приема
базового объекта генерируются, если это разрешено битом RXIE.
Программирование регистров для FIFO структуры
1 Для передающего базового объекта:
- сбросить бит MSGVAL;
- задать поля CUR, BOT, TOP, SEL;
- записать значение 0010b в поле MMC, задать DLC, установить биты OVIE и RXIE
(если необходимо).
Примечание - Состояние регистров MOAR и MOAMR передающего базового
объекта не важно, поскольку в передаче участвуют передающие вспомогательные
объекты и принимающий базовый объект. Поле RXINP указывает линию, на которую
будет выдаваться прерывание переполнения (CUR = SEL).
159
2 Для передающих вспомогательных объектов:
- сбросить бит MSGVAL;
- установить биты DIR, TXEN1 (только для того вспомогательного объекта, на
который указывает поле CUR передающего базового объекта, у остальных
вспомогательных объектов бит TXEN1 должен быть сброшен), TXEN0;
- записать в поле CUR номер передающего базового объекта;
- записать значение 0011b в поле MMC, задать DLC.
Примечание
- Значение регистров MOAR передающих вспомогательных
объектов должно совпадать (или совместно с регистрами MOAMR обеспечивать
успешное прохождение фильтрации) со значением регистра MOAR принимающего
базового объекта, так как процесс передачи фактически происходит между ними (или
иного принимающего объекта, если на приеме используется не FIFO структура).
3 Для принимающего базового объекта:
- установить бит RXEN;
- задать поля CUR, BOT, TOP, SEL;
- записать значение 0001b в поле MMC, задать DLC, установить биты OVIE и TXIE
(если необходимо).
Примечание - Значение регистра MOAR принимающего базового объекта должно
быть равно значению регистров MOAR передающих вспомогательных объектов передачи
(или совместно с регистром MOAMR обеспечивать успешное прохождение фильтрации).
Поле TXINP указывает, на какую линию будет выдаваться прерывание переполнения
(прерывание после операции сохранения полученного сообщения во вспомогательных
объектах при CUR = SEL).
4 Для принимающих вспомогательных объектов:
- сбросить бит RXEN (не требуется, если вспомогательные объекты занесены в
список, не связанный с узлом CAN);
- задать поле DLC (состояние поля MMC не важно).
Примечание
- Состояние регистров MOAR, принимающих вспомогательные
объекты, не важно.
5 Установить бит MSGVAL в первую очередь у передающего базового объекта, а
затем у всех остальных объектов.
6 Установить бит TXRQ для всех передающих вспомогательных объектов, начиная с
того, на который указывает поле CUR передающего базового объекта.
18.10 Режим шлюза
Режим позволяет реализовывать автоматическую передачу информации через шлюз
между двумя независимыми шинами CAN без участия ЦП.
Шлюз можно сформировать на уровне объектов сообщений и осуществлять
передачу информации между узлами CAN. Шлюз может быть сформирован между двумя
любыми объектами сообщений, принадлежащими разным узлам CAN. Количество
шлюзов зависит только от количества объектов сообщений, допускающих формирование
шлюзов.
Режим шлюза активируется записью значения 0100b в битовое поле MMC регистра
MOFCR объекта сообщения n, инициализирует его как шлюзовый объект-источник.
Объект сообщения, который будет являться шлюзовым объектом-приемником,
160
выбирается указателем CUR объекта-источника. Для формирования шлюза достаточно,
чтобы объект-приемник был корректным (установлен бит MSGVAL). Остальные
параметры не влияют на возможность осуществления передачи между объектами от
источника к приемнику.
Рисунок 18.23 - Передача через шлюз от источника к приемнику
Шлюзовый объект-источник (см. рисунок 18.23) функционирует как обычный
объект сообщения с тем отличием, что возможны дополнительные действия контроллера
CAN при приеме и сохранении сообщения в объекте-приемнике:
1 Если установлен флаг DLCC регистра MOFCRn объекта-источника, код длины
данных DLC копируется из шлюзового объекта-источника в шлюзовый объект-приемник.
2 Если установлен флаг IDC объекта-источника, идентификатор ID и расширение
IDE копируются из шлюзового объекта-источника в шлюзовый объект-приемник.
3 Если установлен флаг DATC объекта-источника, байты данных, хранящиеся в двух
регистрах MODATAL и MODATAH объекта-источника, копируются из шлюзового
объекта-источника в шлюзовый объект-приемник. Копируются все 8 байт данных, вне
зависимости от значения поля DLC.
4 Если установлен флаг GDFS объекта-источника, то устанавливается бит запроса
передачи TXRQ объекта-приемника.
5 Устанавливаются флаги RXPND и NEWDAT регистра MOSTAT объекта-
приемника.
6 Если установлен флаг RXIE регистра MOSTAT объекта-приемника, то
генерируется запрос на прерывание.
7 Указатель CUR объекта-источника переводится на следующий объект-приемник
по правилам FIFO структуры. Сформировать шлюз между объектом-источником и одним
объектом-приемником (значение указателя CUR будет оставаться неизменным) возможно
программированием:
TOP = BOT = CUR = номер объекта-приемника.
161
Организация шлюза «объект-источник - объект-приемник» аналогична организации
FIFO структуры «базовый объект - вспомогательный объект», что указывает на
возможность формирования шлюза с интегрированным FIFO-приемником. При
получении сообщения данных (объект-источник является объектом приема, т. е. его бит
DIR сброшен) и при получении удаленного запроса (объект-источник является объектом
передачи) через шлюз используется один и тот же механизм.
Несмотря на то, что механизм удаленных запросов работает независимо от типа
объекта сообщения, он наиболее полезен при использовании шлюзов, для формирования
удаленных запросов на шине шлюзового объекта-источника после получения удаленного
запроса на шине шлюзового объекта-приемника. В зависимости от значения бита FRREN
шлюзового объекта-приемника, есть два варианта обработки удаленного запроса,
возникшего с той стороны шлюза, где расположен объект-приемник (при условии, что
происходит передача из объекта-источника в объект-приемник, т. е. DIR (источника) = 0 и
DIR (приемника) = 1).
1 Обработка запроса шлюзового объекта-приемника с FRREN = 0b:
- сообщение удаленного запроса принимается шлюзовым объектом-приемником;
- бит TXRQ шлюзового объекта-приемника устанавливается автоматически;
- сообщение данных с текущей информацией, хранящейся в объекте-приемнике,
передается на шину приемника.
2 Обработка запроса шлюзового объекта-приемника с FRREN = 1b:
- сообщение удаленного запроса принимается шлюзовым объектом-приемником;
- бит TXRQ шлюзового объекта-источника (объект должен быть указан в поле CUR
объекта-приемника), устанавливается автоматически;
- сообщение данных передается объектом-источником на шину CAN источника;
- получатель удаленного запроса в ответ выдает сообщение данных на шину
источника;
- сообщение данных сохраняется в объекте-источнике;
- сообщение данных копируется в объект-приемник (через шлюз);
- выставляется бит TXRQ объекта-приемника (при условии, что GDFS
источника = 1);
- новые данные, сохраненные в объекте-приемнике, передаются на шину приемника,
в ответ на удаленный запрос на шине приемника.
Рекомендации по записи в регистры в режиме шлюза при передаче удаленного
запроса с FRREN = 1.
Обмен запрос - данные происходит в данном случае между стандартным объектом
сообщения одного узла и объектом-приемником шлюза другого узла. Но при этом данные
для ответа на запрос в шлюзовый объект-приемник поступают по шлюзу от объекта-
источника. При получении удаленного запроса от объекта сообщения объектом-
приемником флаг TXRQ устанавливается не у самого объекта-приемника, а у объекта-
источника, благодаря установленному биту FRREN и битовому полю CUR (указывает на
объект-источник) объекта-приемника. Данные из MODATAL и MODATAH объекта-
источника копируются в MODATAL и MODATAH объекта-приемника (установлен бит
DATC регистра MOFCR объекта-источника), вследствие чего автоматически
устанавливается бит TXRQ регистра MOCTR объекта-приемника (установлен бит GDFS
объекта-источника шлюза), и осуществляется передача сообщения данных (ответ на
запрос) запрашивающему объекту сообщения.
После успешного приема/передачи сообщения ЦП получает уведомление о
завершении операции для задания дальнейших действий, связанных с объектом
сообщения.
162
18.11 Прерывания объектов сообщений
После сохранения принятого сообщения в объект сообщения или успешной
передачи формируется соответствующее прерывание. Каждый объект сообщения может
формировать прерывания. Каждое прерывание направляется на одну из 16 выходных
линий прерываний. Прерывания приема (после сохранения сообщения) также
формируются после операций FIFO и шлюзовых операций. Флаги TXPND и RXPND
всегда устанавливаются после успешной операции передачи/приема, независимо от
состояния соответствующих флагов разрешения прерываний.
Объект сообщения может формировать FIFO прерывания. Если флаг OVIE регистра
MOFCR установлен, то формирование FIFO прерывания будет зависеть от типа объекта
сообщений (см. рисунок 18.24):
- если объект сообщения является принимающим базовым объектом, то выходная
линия прерываний для этого объекта определяется битовым полем TXINP регистра
MOIPR;
- если объект сообщения является передающим базовым объектом, то выходная
линия прерываний определяется битовым полем RXINP.
Рисунок 18.24 - Распределение прерываний
Ждущие сообщения
Когда генерируется запрос на прерывание (после приема/передачи сообщения), в
одном из восьми регистров ждущих прерываний MSPNDx (x от 0 до 7) выставляется флаг
ждущего сообщения. Восемь регистров образуют область из 32 × 8 битов - по два бита
(один бит для операций приема и один бит для операций передачи) для каждого из
объектов сообщений. Позиция флага ждущего сообщения определяется
демультиплексорами DMUX, см. рисунки 18.25 и 18.26.
В зависимости от значения поля MPSEL регистра MCR, реализуется один из двух
режимов выбора и установки флагов, ждущих сообщения:
- режим 1 в случае MPSEL = 0h;
- режим 2 в случае MPSEL = Fh.
Если нет необходимости в определении источника прерывания (прием или передача
сообщения), то можно использовать любой из двух режимов, в противном случае, следует
использовать второй режим.
В первом режиме установка флага ждущего сообщения происходит следующим
образом:
- 7, 6 и 5 биты поля MPN выбирают регистр MSPNDx, в котором будет установлен
флаг 7ждущего сообщения;
163
- пять младших бит поля MPN (на рисунке 18.25 выделены серым цветом) выбирают
позицию флага (от 0 до 31), который будет установлен в выбранном регистре MSPNDx.
Рисунок 18.25 - Режим выбора и установки флагов при MPSEL = 0h
Рисунок 18.26 - Режим выбора и установки флагов при MPSEL = Fh
Во втором режиме при определении позиции флага ждущего сообщения
принимаются в расчет значения поля MPN, полей RXINP (для приема) и TXINP (для
передачи). При этом для флагов могут использоваться любые биты выбранного регистра
MSPNDx. Установка флага ждущего сообщения происходит следующим образом:
- 3, 2 и 1 биты поля TXINP/RXINP выбирают регистр MSPNDx, в котором будет
установлен флаг по окончании передачи/приема сообщения;
- четыре младших бита поля MPN (на рисунке 18.26 выделены серым цветом)
совместно с нулевыми битами полей TXINP и RXINP выбирают позицию флага
(от 0 до 31). Фактически нулевой бит поля TXINP/RXINP выбирает старшее или младшее
164
слово выбранного регистра MSPNDx, а четыре бита поля MPN задают позицию в
выбранном слове.
Регистры MSPNDx могут быть записаны программно. Биты, в которые
записываются единицы, остаются без изменений, а биты, в которые записываются нули,
очищаются. Такой механизм записи позволяет избежать конфликта между одновременной
аппаратной установкой и программной очисткой битов регистра.
Каждый регистр MSPNDx связан с соответствующим регистром индекса сообщения
MSIDx, который отражает позицию самого младшего бита из всех установленных в
регистре MSPNDx. Регистры MSIDx доступны только для чтения и обновляются
незамедлительно после изменения (как аппаратного, так и программного) содержимого
соответствующих регистров MSPNDx.
Регистр маски индекса сообщения MSIMASK содержит маску для регистров
MSPNDx. Только незакрытые маской биты могут обслуживаться. Регистр MSIMASK
используется одновременно для всех регистров MSPNDx и соответствующих им
регистров MSIDx.
18.12 Программирование контроллера CAN
Для корректной работы контроллера CAN следует соблюдать порядок
программирования регистров.
Для запуска контроллера:
- записать регистр CLC;
- проверить, что сброшен бит DISR, регистр PANCTR = 00000000h и после этого
записать регистр FDR.
Далее для конфигурирования узла CAN с номером х (от 0 до 3) выполнить:
- в регистре узла NCRx установить биты INIT и CCE, после чего регистры NBTRx и
NPCRx станут доступны для записи и чтения, а регистр NECNTx - только для чтения;
- записать регистр NPCRx;
- записать регистр NIPRx;
- записать регистр NBTRx;
- записать регистр NFCRx (если необходимо);
- в регистре NCRx сбросить биты INIT и CСE, после чего регистры NBTRx и NPCRx
будут не доступны для записи;
- распределить объекты сообщений в списки посредством регистра PANCTR.
Для корректной работы объектов сообщений регистры каждого из них должны быть
проинициализированы. Для объектов, использование которых не предусматривается,
достаточно записать ноль в бит MSGVAL регистра MOCTR.
Рекомендуемый порядок инициализации регистров объекта сообщения:
- установить бит DIR в регистре MOSTAT для передачи сообщения данных/приема
удаленного запроса или сбросить бит DIR для приема сообщения данных/передачи
удаленного запроса; установить биты TXEN0 и TXEN1 (для передачи) или RXEN (для
приема) в регистре MOCTR;
- записать регистр MOFCR;
- записать регистр MOAR;
- записать регистр MOAMR (если необходимо);
- записать регистр MOFGPR (если будут использоваться FIFO структуры);
- записать регистр MOIPR;
- записать регистры MODATAL и MODATAH;
- установить бит MSGVAL корректности объекта сообщения в регистре MOCTR
(для неиспользуемых объектов этот бит должен быть сброшен);
- для активирования передачи установить бит TXRQ регистра MOCTR.
165
19 Блок АЦП
Блок АЦП объединяет один модуль АЦП последовательного приближения
(архитектура SAR), схему управления, буферы результатов измерений и схему управления
прерываниями. Структурная схема блока АЦП показана на рисунке 19.1.
Рисунок 19.1 - Структурная схема блока АЦП
В блок АЦП входят:
- четырехканальный модуль АЦП разрядностью 12 бит и скоростью измерения по
одному каналу до 2М измерений в секунду при рабочей частоте до 32 МГц;
- 2 секвенсора, каждый из которых позволяет независимо произвести запуск
измерений по необходимым каналам АЦП и сгенерировать прерывание;
- 4 независимых цифровых компаратора, отслеживающих и сравнивающих
измерения с пороговыми значениями для формирования прерываний и сигналов
управления другими блоками микроконтроллера;
- 2 буферов результатов измерений (каждый организован по типу FIFO);
- блок управления прерываниями.
Блок АЦП имеет 4 входных канала. Диапазон измерений ограничен AVDD.
Настройка тактирования и сброса блока АЦП и его модулей осуществляется
посредством регистра ADCCFG блока управления тактовыми сигналами (RCU). Вся
внутренняя логика блока АЦП тактируется частотой ACLK, но запись/чтение контрольно-
статусных регистров осуществляется на частоте HCLK.
Для правильной работы блока, необходимо обеспечить тактирование модулей АЦП
частотой ACLK от 300 кГц до 32 МГц, которую можно получить, выбрав источник
тактового сигнала полем CLKSEL, а также, при необходимости, включив и настроив
делитель полями DIVEN и DIVN (поля регистра ADCCFG блока RCU). Частота ACLK не
должна быть больше частоты системного тактового сигнала SYSCLK (на тактовый вход
HCLK блока АЦП подается системный тактовый сигнал).
166
19.1 Секвенсор
Секвенсор представляет собой управляющий блок, позволяющий разгрузить
процессор от управления модулями АЦП. Секвенсор управляет запуском модулей АЦП,
обработкой полученных результатов измерений и генерацией прерываний. В состав блока
АЦП входят s секвенсоров (s=0,1). Структурная схема секвенсора представлена на
рисунке 19.2.
Рисунок 19.2 - Структурная схема секвенсора
Одиночные запуски по событиям
Разрешение работы секвенсора осуществляется установкой соответствующего бита в
регистре SEQEN.
Каждый секвенсор может совершать независимые однократные запуски по одному
из событий, которое выбирается полем EMs регистра EMUX:
- установка бита GSYNC регистра SEQSYNC (запустятся только секвенсоры, для
которых установлены биты SYNCs того же регистра);
- сигналы от таймеров;
- сигналы от блоков ШИМ;
167
- сигнал прерывания GPIO.
Когда секвенсор s запускается по одному из сигналов событий, выставляется
соответствующий флаг SEQBUSYs в регистре BSTAT. Также в это же время все
настройки секвенсора сохраняются в теневых регистрах и секвенсор начинает работу
согласно полученным настройкам. Изменять настройки секвенсора во время его работы
можно, но вступят в силу они лишь при следующем запуске. Флаг занятости держится
установленным до тех пор, пока задача, инициированная событием, не будет полностью
выполнена секвенсором (будет осуществлена запись последнего результата в FIFO).
События запуска не кэшируются - если секвенсор был занят выполнением текущей
задачи (установлен SEQBUSYs), когда пришло очередное событие запуска, то оно будет
проигнорировано. Необходимо учитывать это при настройке запуска по событиям от
сторонних периферийных модулей так, чтобы время между возникновением событий
было не меньше времени измерений. Диаграмма работы секвенсора при одиночных
запусках по событиям показаны на рисунке 19.3.
Рисунок 19.3 - Одиночные запуски секвенсора по событиям
Одиночные запуски по событиям с немедленными перезапусками
Здесь и далее, под перезапусками понимается внутренний механизм работы
секвенсора, а под запусками - приход внешнего события, которое переводит секвенсор из
ожидающего состояния в активное.
Секвенсор имеет возможность осуществлять как отложенные, так и немедленные
автоматические перезапуски серий измерений, после прихода первого «инициирующего»
события запуска от периферии. Перезапуск может выполняться до 255 раз (поле RCNT
регистра SCCTL). Текущее состояние счетчика перезапусков можно узнать, прочитав поле
RCNT регистра SCVAL. Диаграмма работы секвенсора при разрешенных немедленных
перезапусках показана на рисунке 19.4.
Рисунок 19.4. - Одиночные запуски по событиям с немедленными перезапусками при
RCNT=2 (регистр SCCTL)
Одиночные запуски по событиям с отложенными перезапусками
Отложенные перезапуски осуществляются спустя некоторое время от запуска,
задаваемое регистром SRTMR. Задержка задается в тактах ACLK и ведет счет независимо
от текущего состояния секвенсора, поэтому, при её выборе необходимо учитывать, что
168
текущие измерения должны завершиться до прихода сигнала перезапуска, иначе он будет
пропущен.
В режиме одиночных запусков по событиям счетчик задержки перезапуска не будет
считать, если поле RCNT регистра SCCTL равно нулю.
Как говорилось ранее, все настройки секвенсора сохраняются в теневых регистрах
при его переходе в режим занятости и их изменение никак не повлияет на текущую
работу. Однако, существует возможность обновить задержку перезапуска еще во время
работы секвенсора. Для этого надо записать новое значение задержки в регистр SRTMR с
одновременно установленным последним битом NOWAIT. В этом случае, новая величина
задержки вступит в силу после ближайшего события отложенного перезапуска.
Диаграмма работы секвенсора при активных отложенных перезапусках показана на
рисунке 19.5.
Рисунок 19.5. - Одиночные запуски по событиям с отложенными перезапусками через
время SRTMR при RCNT=2 (регистр SCCTL)
Одиночные запуски с усреднением по перезапускам
Существует режим усреднения результатов по перезапускам, который включается
установкой бита RAVGEN в регистре SCCTL. Главным условием работы этого режима
является то, что поле RCNT регистра SCCTL должно содержать любое значение,
соответствующее
2p - 1, где p=1..8. Значение
2p и является количеством серий
измерений, которые будут усреднены (запуск и все перезапуски).
Работа этого режима заключается в том, что пока идут перезапуски, результаты
попадут в буфер не сразу, а будут накапливаться во внутренних регистрах (каждому
запросу на измерение соответствует такой регистр). Лишь во время последнего
перезапуска, будут получены усреднённые значения по каждому из измерений, которые и
будут помещаться в FIFO в порядке очереди.
Работа режима усреднения при немедленных перезапусках продемонстрирована на
рисунке 19.6. При отложенных перезапусках данный вид усреднения работает аналогично,
позволяя распределить равномерно измерения на длительном промежутке времени и
получить среднее значение сигнала в конце него.
169
Рисунок 19.6. - Одиночные запуски по событиям усреднением по перезапускам при
RCNT=3, RAVGEN=1 (регистр SCCTL)
Например, если измерения проводились по всем 4-ём каналам, то при RAVGEN=0,
на момент снятия флага SEQBUSYs то в в FIFO было бы 16 результатов, но если
усреднение по перезапускам было бы активно, то в FIFO находилось бы 4 усредненных
результата по каждому из каналов.
Циклический запуск
Секвенсор может быть запрограммирован на циклический запуск
- он будет
запускаться снова каждый раз при завершении предыдущего запуска (имитация постоянно
активного внешнего события). Чтобы начать работу в циклическом режиме, необходимо,
после соответствующей конфигурации регистра EMUX, установить бит GSYNC регистра
SEQSYNC. Чтобы завершить работу в циклическом режиме, необходимо выбрать в поле
EMs регистра EMUX любое событие однократного запуска. Флаг занятости секвенсора
SEQBUSYs в регистре BSTAT будет установлен сразу же по входу в циклический режим
и будет сброшен только лишь по выходу из него. Диаграмма работы секвенсора при
циклическом запуске показана на рисунке 19.7.
Рисунок 19.7 - Циклический запуск секвенсора
Циклический отложенный запуск
В отличие от режима одиночных запусков, циклический режим позволяет
активировать счетчик задержки SRTMR, даже если поле RCNT регистра SCCTL равно
нулю. В этом случае измерения будут запускаться не непрерывно, а с некоторой паузой
(определяемой SRTMR). Диаграмма работы секвенсора при циклическом запуске
показана на рисунке 19.8.
170
Рисунок 19.8 - Циклический отложенный запуск секвенсора через время SRTMR
Циклический запуск с усреднением по перезапускам
Если в циклическом режиме установить поле RCNT регистра SCCTL значением
отличным от нуля, то секвенсор между запусками начнет делать нужное количество
перезапусков. Но механика такого режима внешне никак не будет отличаться от обычной
циклической работы, поэтому данный режим имеет смысл лишь в том случае, когда
необходимо скомбинировать циклический режим с усреднением по перезапускам (как
немедленным, так и отложенным).
Диаграмма работы секвенсора в циклическом режиме запуска с усреднением по
отложенным перезапускам показана на рисунке 19.9.
Рисунок 19.9 - Циклический запуск секвенсора с отложенными перезапусками через время
SRTMR при RCNT=1, RAVGEN=1 (регистр SCCTL)
Генерация запросов на измерение
После запуска по событию или очередного перезапуска секвенсор начинает
формировать запросы на измерения по каналам в порядке очереди, заданной регистром
SRQSEL. Конец очереди или её «глубина» задается полем RQMAX регистра SRQCTL.
Определить состояние очереди можно с помощью регистра SRQSTAT - в поле RQPTR
находится номер текущего запроса по порядку, а установленный флаг занятости RQBUSY
171
говорит о том что запрос выставлен и в состоянии обработки.
Иллюстрация к механизму генерации запросов на измерение представлена на
рисунке 19.10.
Рисунок 19.10 - Генерация секвенсором запросов на измерение
1 Как только секвенсор получает сигнал запуска, он выставляет первый запрос из
очереди и ожидает его принятия модулем АЦП.
2 Когда запрос будет принят, АЦП проведет измерение. По окончанию измерения,
результат выполнения запроса будет передан секвенсору.
3 Секвенсор сохраняет результат в FIFO, и продолжает выставлять запросы до
окончания их очереди.
4 Если секвенсор настроен на проведение перезапусков (отложенных или
немедленных), то по окончании очереди секвенсор перезапускается и снова выставляет
первый в очереди запрос.
5 Лишь когда завершен последний перезапуск, то работа секвенсора, начатая по
первичному событию запуска (пункт 1), считается завершенной.
6 Секвенсор переходит в состояние ожидания следующего сигнала запуска.
Результат каждого запроса сохраняется в кольцевом буфере результатов секвенсора
(SFIFO). Буферы всех секвенсоров имеют емкость в
32
12-битных слова. Текущее
количество слов в буфере можно узнать, прочитав регистр SFLOAD.
Контроль состояния буфера осуществляется посредством флагов регистра FSTAT.
Установленный флаг OVs, указывает на то что в FIFO не осталось свободных ячеек.
Любая запись в буфер в таком случае будет игнорироваться до появления хотя бы одной
свободной ячейки. Сброшенный флаг UNs свидетельствует о наличии в FIFO как
минимум одного результата измерений. Соответственно, флаг UNs установится, когда
FIFO будет полностью пуст, при этом результатом чтения пустого FIFO будут нули.
Сброс флагов осуществляется путем записи в них единицы.
Усреднение сканированием очереди
Наряду с усреднением по перезапускам секвенсор имеет дополнительный механизм
усреднения - усреднение сканированием (опросом) очереди измерений. Оба механизма
могут работать как вместе, так и по отдельности.
Включается усреднение сканированием путем установки бита QAVGEN в регистре
SRQCTL. Перед включением режима необходимо задать количество усредняемых
опросов в поле QAVGVAL того же регистра - оно считается как 2QAVGVAL .
172
Работа режима заключается в том, что очередь запросов выполняется не один раз
(рисунок 19.10) с сохранением результатов в буфер после каждого запроса, а 2QAVGVAL раз
с сохранением результатов лишь на последней итерации сканирования после усреднения
всех полученных измерений. Результаты измерений накапливаются и усредняются
индивидуально для каждого запроса (аналогично усреднению по перезапускам).
Диаграмма работы усреднения сканированием показана на рисунке 19.11.
Рисунок 19.11 - Режим усреднения сканированием
Усреднение сканированием позволяет с относительно малой фазовой задержкой
измерить уровень сигнала по нескольким каналам в пределах одной временной точки, а
усреднение по перезапускам дает возможность усреднить значения, полученных таким
образом точек, на достаточно большом интервале времени. В совокупности, оба
механизма предлагают довольно гибкий инструментарий для автоматизации и усреднения
измерений.
Генерация прерываний
Секвенсор может генерировать прерывания с заданной периодичностью. По
завершении каждой записи в FIFO инкрементируется счетчик измерений. Как только было
зафиксировано ICNT+1 записей (поле регистра SCCTL), генерируется прерывание. Стоит
отметить, что даже если FIFO заполнено полностью (установлен OVs в регистре FSTAT),
а измерения продолжают проводиться - счетчик измерений все равно будет считать
последующие попытки записи секвенсора в FIFO (хотя они будут и игнорироваться самим
FIFO). Текущее состояние счетчика можно узнать, прочитав поле ICNT регистра SCVAL.
Сброс счетчика запросов происходит в следующих случаях:
- зафиксировано ICNT+1 записей;
- при запуске секвенсора по событию, если сброшен бит ICNTs в регистре CICNT;
- бит разрешения работы секвенсора ENs регистра SEQEN сброшен;
- программно - при каждой записи единицы в поле ICLR регистра SCVAL.
Для каждого секвенсора выделена линия прерываний - ADC_SEQ0 и ADC_SEQ1
соответственно.
173
Использование прямого доступа к памяти
Для разрешения использования DMA секвенсором, необходимо установить бит
DMAEN в регистре SDMACTL. Поле WMARK того же регистра задает уровень
заполнения буфера секвенсора, по достижении которого будет запущен DMA. Перенос
данных будет выполняться пока не будет передано число результатов измерений,
соответствующее состоянию поля WMARK.
Если очередной запрос на запуск DMA пришел раньше, чем закончился предыдущий
цикл DMA от того же секвенсора, то будет выставлен флаг ошибки DOVs в регистре
FSTAT.
19.2 Модуль АЦП
Структурная схема четырехканального модуля АЦП показана на рисунке 19.12.
Рисунок 19.12 - Модуль АЦП
Разрешение работы модуля АЦП осуществляется установкой бита ADCEN в
регистре ACTL. При каждом переключении ADCEN в единицу запускается процедура
инициализации АЦП, которая завершается установкой бита ADCRDY регистра ACTL.
АЦП готов к работе когда ADCRDY=1. Для правильной работы блока, необходимо
обеспечить тактирование модулей АЦП частотой ACLK от 300 кГц до 32 МГц. Время
преобразования одного канала равняется 14 тактам частоты ACLK.
Правила арбитража
Когда АЦП начинает выполнять измерения по запросам он устанавливает флаг
ADCBUSY в регистре BSTAT. Флаг занятости будет сброшен лишь при полном
отсутствии запросов - при последовательном выполнении запросов флаг не сбрасывается.
Во время установки флага все настройки каналов АЦП сохраняются в теневых регистрах.
Изменять их настройки во время работы можно, но вступят в силу они лишь при
следующей установке флага ADCBUSY после сброса.
174
Секвенсоры могут выставлять запросы как одновременно, так и независимо друг от
друга по разным событиям запуска. Для определения порядка выполнения запросов
модулем АЦП реализована схема арбитража, со следующими правилами работы:
1 Если модуль АЦП был в режиме ожидания (включен и измерения не проводятся),
то при поступлении запроса незамедлительно начинается его обслуживание.
2 Секвенсоры выставляют «ждущие» запросы - запрос будет активен до тех пор,
пока модуль АЦП не начнет его обработку. Как только его обслуживание началось, запрос
сбрасывается.
3 Как только текущий запрос секвенсора был сброшен, он сразу выставляет
следующий запрос (если таковой имеется в наличии), чтобы успеть принять участие в
ближайшей процедуре арбитража и чтобы АЦП не тратил такты на переход из активного
режима в режим ожидания и обратно.
4 Секвенсор, во время работы, может не выставить следующий запрос после сброса
текущего, но лишь в случае ожидания отложенного события перезапуска. Во всех
остальных режимах запросы выставляются неразрывно друг за другом.
5 Если несколько секвенсоров выставили одинаковые запросы, то обслуживаться
они будут параллельно. Результат запроса попадет в буфера всех соответствующих
секвенсоров.
6 Арбитраж происходит перед началом обработки первого запроса (если АЦП был
в ожидании) и в конце каждого обрабатываемого в текущий момент.
7 Если несколько секвенсоров одновременно выставят запросы, то запросы по
каналам с меньшим номером имеют приоритет выше, чем каналы с большим.
8 Каналы с установленным битом PRIORITY в регистрах CHCTLn (где n - номер
канала, 0..3) имеют более высокий приоритет, чем те, у которых бит сброшен.
9 Если одновременно будут выставлены запросы по каналам с установленным
PRIORITY, то запросы по каналам с меньшим номером имеют приоритет выше, чем
каналы с большим.
10 Необходимо с осторожностью производить частый опрос более
высокоприоритетных каналов - это может значительно затруднить опрос остальных
каналов.
Иллюстрация работы схемы арбитража запросов приведена на рисунке 19.13.
Рисунок 19.13 - Пример арбитража запросов, серым выделены запросы по каналам с
установленным битом PRIORITY
Коррекция результатов измерений
Результат преобразования передается на схему коррекции, которая нивелирует
ошибку усиления и смещения нуля, и работа которой описывается формулой:
∗ (4096 + GAINTRIM)
DR
DC =
+ OFFTRIM,
4096
где DR - «сырые» данные, полученные непосредственно с АЦП;
175
DC - скорректированные данные, выдаваемые секвенсору;
GAINTRIM - коэффициент корректировки усиления, имеет диапазон -256…255;
OFFTRIM - коэффициент корректировки смещения нуля, имеет диапазон -256…255.
Значения GAINTRIM и OFFTRIM заносятся в одноименные поля регистров CHCTLn
(где n - номер канала 0..3) в дополнительном коде. По умолчанию, результат измерения
проходит через схему коррекции не изменяясь, т.к. коэффициенты равны нулю.
Реализована математика «насыщения» - когда значение OFFTRIM отрицательное и
больше дроби, то результат будет равен нулю, если сумма OFFTRIM и дроби больше
4095, то результата равен 4095.
19.3 Цифровой компаратор
В состав блока АЦП входят d компараторов (d=0…3). Структурная схема
компаратора показана на рисунке 19.14.
Рисунок 19.14 - Структурная схема компаратора
Все компараторы блока АЦП независимы. Каждый компаратор может обрабатывать
результат измерения любого канала.
По умолчанию, когда модуль АЦП завершает обработку запроса по каналу, он
выставляет результат, который захватывает как секвенсор, так и разрешенный (любым из
секвенсоров) и настроенный на этот канал компаратор.
Возможен и другой режим работы, когда на компаратор будет подаваться результат,
который секвенсор записывает в FIFO, но только в том случае, если канал,
соответствующий сохраняемому результату, также совпадает с каналом на который
176
настроен компаратор. Включение этого режима осуществляется установкой бита SRC в
регистре DCTL.
Правила настройки:
1 Посредством регистра SRQSEL секвенсора s выбираются каналы для измерений.
2 Посредством регистра SDC выбираются (разрешаются) компараторы для
обработки полученных результатов запросов (установкой битов DCd). Запрещенные
компараторы не обрабатывают полученные результаты.
3 Для каждого компаратора d в его регистре DCTL в поле CHNL указывается номер
канала, результат измерения которого будет передан на него. По умолчанию, значение
CHNL = 0h, т. е. все компараторы настроены на работу с нулевым каналом.
4 Битом SRC в регистре DCTL выбирается источник данных для компаратора -
результаты непосредственно с АЦП или результаты, записываемые секвенсором в FIFO
(которые могут быть уже усреднены).
Результат измерения, полученный компаратором d, передается во внутреннюю
схему сравнения и одновременно с этим сохраняется в регистре DDATA. Схема сравнения
выполняет проверку соответствия результата измерения заданному условию (поля CTC,
CTM регистра DCTL и поля CMPL, CMPH регистра DCMP) и в зависимости от результата
проверки переключает выходной триггер и устанавливает флаг события сравнения DCEVd
в регистре DCTRIG. Работа триггера разрешается установкой бита CTE регистра DCTL.
Сравнение по условию «Измерение ≤ CMPL» (CTC = 00b)
- В однократном режиме (CTM = 01b) выходной триггер переключится в единицу
только в случае, если результат сравнения окажется положительным при том, что
результат предыдущего сравнения был отрицательным. В остальных случаях состояние
триггера - ноль.
- В многократном режиме (CTM = 00b) выходной триггер будет переключаться в
единицу каждый раз, когда результат сравнения будет положительным.
- В однократном режиме с гистерезисом (CTM
=
11b) выходной триггер
переключится в единицу только в случае, если после прекращения выполнения условия
«CMPH ≤ Измерение», результат сравнения окажется положительным при том, что
результат предыдущего сравнения был отрицательным. В остальных случаях состояние
триггера - ноль.
- В многократном режиме с гистерезисом (CTM
=
10b) выходной триггер
переключится в единицу в случае, если после прекращения выполнения условия «CMPH ≤
Измерение», результат сравнения окажется положительным при том, что результат
предыдущего сравнения был отрицательным, и далее триггер будет оставаться в
состоянии единицы до тех пор, пока снова не выполнится условие «CMPH ≤ Измерение».
Пример функционирования триггера показан на рисунке 19.15.
177
Рисунок 19.15 - Функционирование триггера при CTC = 00b
Сравнение по условию «CMPL ≤ Измерение ≤ CMPH» (CTC = 01b)
- В однократном режиме выходной триггер переключится в единицу только в случае,
если результат сравнения окажется положительным при том, что результат предыдущего
сравнения был отрицательным. В остальных случаях состояние триггера - ноль.
- В многократном режиме выходной триггер будет переключаться в единицу каждый
раз, когда результат сравнения будет положительным.
- Однократный и многократный режимы с гистерезисом не поддерживаются.
Пример функционирования триггера показан на рисунке 19.16.
Рисунок 19.16 - Функционирование триггера при CTC = 01b
Сравнение по условию «CMPH ≤ Измерение » (CTC = 10b)
- В однократном режиме выходной триггер переключится в единицу только в случае,
если результат сравнения окажется положительным при том, что результат предыдущего
сравнения был отрицательным. В остальных случаях состояние триггера - ноль.
- В многократном режиме выходной триггер будет переключаться в единицу каждый
раз, когда результат сравнения будет положительным.
- В однократном режиме с гистерезисом выходной триггер переключится в единицу
только в случае, если после прекращения выполнения условия «Измерение ≤ CMPL»,
результат сравнения окажется положительным при том, что результат предыдущего
178
сравнения был отрицательным. В остальных случаях состояние триггера - ноль.
- В многократном режиме с гистерезисом (CTM
=
10b) выходной триггер
переключится в единицу в случае, если после прекращения выполнения условия
«Измерение ≤ CMPL», результат сравнения окажется положительным при том, что
результат предыдущего сравнения был отрицательным, и далее триггер будет оставаться в
состоянии единицы до тех пор, пока снова не выполнится условие «Измерение ≤ CMPL».
Пример функционирования триггера показан на рисунке 19.17.
Рисунок 19.17 - Функционирование триггера при CTC = 10b
Переключение выходного триггера в единицу устанавливает соответствующий флаг
TOSd в регистре DCTRIG и генерирует управляющий сигнал для пороговых
выключателей блоков ШИМ. Вне зависимости от состояния флагов TOSd по каждому
событию сравнения устанавливается соответствующий флаг DCEVd того же регистра.
Флаги события сравнения сбрасываются записью единицы. Сброс самого триггера и его
статусного флага выполняется также записью единицы в соответствующий бит TOSd
регистра DCTRIG.
Независимо от состояния триггера (разрешен или запрещен) в случае
положительного результата сравнения компаратор может генерировать прерывание. Для
этого следует установить бит CIE регистра DCTL и задать условия CIC и CIM
(аналогичны по функционалу CTC и CTM).
Примечание - Условия срабатывания выходного триггера компаратора и условия
генерирования прерываний могут не совпадать.
19.4 Контроллер прерываний
При генерировании прерываний устанавливаются флаги SEQRISs и DCRISd в
регистре RIS. Если были установлены маски прерываний в регистре IM (поля SEQIMs и
DCIMd), то также устанавливаются соответствующие маскированные флаги прерываний
SEQMISs и DCMISd. Сброс флагов (маскированных и немаскированных) осуществляется
записью единицы в соответствующие поля регистра IC (поля SEQIСs и DCIСd).
Установка маскированных флагов SEQMISs вызывает формирование
соответствующих прерываний ADC_SEQs блока АЦП.
Флаги DCMISd компараторов объединены по ИЛИ, и установка любого из них
вызывает формирование прерывания ADC_DC блока АЦП.
Структурная схема контроллера прерываний показана на рисунке 19.18.
179
Рисунок 19.18 - Контроллер прерываний
180
19.5 Примеры работы
В этом подразделе представлены разнообразные примеры настройки блока АЦП
для осуществления измерений в различных режимах. Для всех примеров подразумевается,
что АЦП тактируется частотой 25 МГц.
Настройка тактирования
Один из примеров настройки тактирования АЦП совместно с настройкой
системного тактового сигнала представлен ниже.
1 С помощью регистра PLLCFG блока RCU настраиваем выходную частоту PLL
100 МГц. Осуществляем процедуру перевода системной частоты на PLL. Таким образом,
частота системного тактового сигнала SYSCLK будет равна 1000 МГц.
2 Настройка рабочей частоты АЦП ACLK производится с помощью регистра
ADCCFG блока RCU. Выбираем в качестве источника выходную частоту PLL (поле
CLKSEL=1), включаем делитель на 4 (поле DIVN=1, бит DIVEN=1). Таким образом,
ACLK=25МГц.
RCU->ADCCFG_bit.CLKSEL = 1;
RCU->ADCCFG_bit.DIVN = 1;
RCU->ADCCFG_bit.DIVEN = 1;
3 Включаем тактирование блока (бит CLKEN=1) и снимаем сброс (бит RSTDIS=1).
Блок АЦП готов к дальнейшим конфигурациям.
RCU->ADCCFG_bit.CLKEN = 1;
RCU->ADCCFG_bit.RSTDIS = 1;
Пример 1 - программный запуск одного секвенсора
Требуемый режим работы:
- программный запуск;
- секвенсор 0
- однократное измерение всех четырех каналов;
- без прерываний (опрос флагов).
Код, соответствующий настройке и запуску необходимого режима, представлен
ниже.
// Настройка
ADC->ACTL_bit.ADCEN = 1;
ADC->EMUX_bit.EM0 = 0;
ADC->SEQ[0].SRQCTL_bit.RQMAX = 3;
ADC->SEQ[0].SRQSEL_bit.RQ0 = 0;
ADC->SEQ[0].SRQSEL_bit.RQ1 = 1;
ADC->SEQ[0].SRQSEL_bit.RQ2 = 2;
ADC->SEQ[0].SRQSEL_bit.RQ3 = 3;
ADC->SEQEN_bit.SEQEN0 = 1;
// Запуск
while(!ADC->ACTL_bit.ADCRDY);
ADC->SEQSYNC_bit.SYNC0 = 1;
ADC->SEQSYNC_bit.GSYNC = 1;
1 Разрешаем работу модуля АЦП - необходимо установить бит ADCEN в регистре
ACTL.
2 Для работы выберем секвенсор 0. Настроим его источник запуска - поле EM0
регистра EMUX должно быть равно 0, т.к. запуск программный.
3 В поле RQMAX регистра SRQCTL необходимо внести значение 3h, т.к. измерения
будут проводиться по всем четырем каналам.
181
4 Настраиваем каналы для запросов. Допустим, необходимо опросить каналы
последовательно от нулевого к третьему, значит в регистр SRQSEL необходимо внести
значения в поля: RQ0=0h, RQ1=1h, RQ2=2h, RQ3=3h.
5 Разрешаем работу секвенсора. Для этого необходимо установит бит SEQEN0 в
регистре SEQEN.
6 Запускаем измерения. Перед запуском проверяем флаг ADCRDY, чтобы быть
уверенными в том, что модуль АЦП провел необходимые инициализации. Для того чтобы
начать измерения, необходимо установить бит SYNC0 в регистре SEQSYNC и записать в
бит GSYNC единицу.
7 Проводим опрос флагов, чтобы установить окончание измерений. Например,
можно опрашивать регистр SFLOAD, ожидая, пока он не станет равен 4h.
8 Считываем четыре результата измерения из буфера SFIFO.
Работа режима проиллюстрирована на рисунке 19.19.
Рисунок 19.19 - Диаграмма работы примера 1
Пример 2 - циклический опрос канала с задержками
Требуемый режим работы:
- циклическая работа;
- секвенсор 0
- опрос канала номер 2 каждую 1мс;
- коррекция канала 2;
- каждый опрос из 16 последовательных измерений и усреднения;
- прерывание по каждой записи в FIFO.
Код, соответствующий настройке и запуску необходимого режима, представлен
ниже.
// Настройка
ADC->ACTL_bit.ADCEN = 1;
ADC->CHCTL[2].CHCTL_bit.GAINTRIM = 5; // значения для примера
ADC->CHCTL[2].CHCTL_bit.OFFTRIM = (uint32_t)(-5);
ADC->EMUX_bit.EM0 = 0xF;
ADC->SEQ[0].SCCTL_bit.ICNT = 0;
ADC->SEQ[0].SRTMR = 24999;
ADC->SEQ[0].SRQCTL_bit.RQMAX = 0;
ADC->SEQ[0].SRQCTL_bit.QAVGVAL = 4;
ADC->SEQ[0].SRQCTL_bit.QAVGEN = 1;
182
ADC->SEQ[0].SRQSEL_bit.RQ0 = 2;
ADC->SEQEN_bit.SEQEN0 = 1;
// NVIC прерывание
ADC->IM_bit.SEQIM0 = 1;
NVIC_EnableIRQ(ADC_SEQ0_IRQn);
// Запуск
while(!ADC->ACTL_bit.ADCRDY);
ADC->SEQSYNC_bit.SYNC0 = 1;
ADC->SEQSYNC_bit.GSYNC = 1;
1 Разрешаем работу модуля АЦП - необходимо установить бит ADCEN в регистре
ACTL.
2 Если предварительно была произведена процедура коррекции канала 2 и были
вычислены поправочные коэффициенты, их необходимо внести в поля GAINTRIM и
OFFTRIM регистра CHCTL2.
3 Для работы выберем секвенсор 0. Настроим его источник запуска - поле EM0
регистра EMUX должно быть равно Fh, т.к. запуск циклический.
4 В поле RQMAX регистра SRQCTL необходимо внести значение 0h, т.к. измерения
будут проводиться по одному каналу.
5 Настраиваем канал для запроса. В регистр SRQSEL необходимо внести значение
RQ0=2h.
6 Включаем усреднение сканированием по 16 опросам очереди. В регистре SRQCTL
нужно установить поля QAVGVAL=4, QAVGEN=1.
7 Для того чтобы опрос проводился каждую 1 мс (при ACLK=25МГц), необходимо
внести в регистр SRTMR значение (1мс/40нс) - 1 = 24999.
8 Разрешаем генерацию прерываний по каждой записи в FIFO - нужно установить
бит SEQIM0 в регистре IM, и проследить, чтобы поле ICNT регистра SCCTL оставалось
равным нулю.
9 Разрешаем работу секвенсора. Для этого необходимо установит бит SEQEN0 в
регистре SEQEN.
10 Запускаем измерения. Перед запуском проверяем флаг ADCRDY, чтобы быть
уверенными в том, что модуль АЦП провел необходимые инициализации. Для того чтобы
начать измерения, необходимо установить бит SYNC0 в регистре SEQSYNC и записать в
бит GSYNC единицу.
11 Измерения будут сразу же запущены и будут запускаться каждую 1мс далее.
После каждого запуска будет проведено 16 измерений, результат усреднения которых
будет записан в FIFO, и будет вызвано прерывание.
Работа режима проиллюстрирована на рисунке 19.20.
183
Рисунок 19.20 - Диаграмма работы примера 2
Пример 3 - равномерно распределенные измерения по периоду таймера
Требуемый режим работы:
- запуск по таймеру 0 с частотой 10кГц;
- 4 точки измерения равномерно распределенные по периоду;
- секвенсор 0;
- опросы по каналам 3 и 0;
- каждый опрос из 4 последовательных измерений и усреднения;
- прерывание каждые 8 записей в FIFO (по окончанию измерений в текущем периоде
таймера).
Код, соответствующий настройке и запуску необходимого режима, представлен
ниже.
// Настройка таймера
RCU->PCLKCFG0_bit.TMR0EN = 1;
RCU->PRSTCFG0_bit.TMR0EN = 1;
TMR0->LOAD = 9999;
TMR0->ADCSOC_bit.EN = 1;
// Настройка АЦП
ADC->ACTL_bit.ADCEN = 1;
ADC->EMUX_bit.EM0 = 3;
ADC->SEQ[0].SCCTL_bit.ICNT = 7;
ADC->SEQ[0].SCCTL_bit.RCNT = 3;
ADC->SEQ[0].SRTMR = 624;
ADC->SEQ[0].SRQCTL_bit.RQMAX = 1;
ADC->SEQ[0].SRQCTL_bit.QAVGVAL = 2;
ADC->SEQ[0].SRQCTL_bit.QAVGEN = 1;
ADC->SEQ[0].SRQSEL_bit.RQ0 = 3;
ADC->SEQ[0].SRQSEL_bit.RQ1 = 0;
ADC->SEQEN_bit.SEQEN0 = 1;
// NVIC прерывание
184
ADC->IM_bit.SEQIM0 = 1;
NVIC_EnableIRQ(ADC_SEQ0_IRQn);
// Запуск
while(!ADC->ACTL_bit.ADCRDY);
TMR0->CTRL_bit.ON = 1;
1 Включаем тактирование таймера 0 и снимаем сброс - установим бит TMR0EN в
регистрах PCLKCFG0 и PRSTCFG0, соответственно.
2 Для того чтобы таймер опустошался с частотой 10 кГц (при SYSCLK=100МГц),
необходимо внести в регистр таймера LOAD значение (100000кГц/10кГц) - 1 = 9999.
3 Разрешаем генерацию таймером запросов на старт преобразования, установив бит
EN в регистре ADCSOC таймера.
4 Разрешаем работу модуля АЦП - необходимо установить бит ADCEN в регистре
ACTL.
5 Для работы выберем секвенсор 0. Настроим его источник запуска - поле EM0
регистра EMUX должно быть равно 3h, т.к. запуск по опустошению таймера 0.
6 Необходимое количество записей в FIFO для генерации прерывания - 8h, поэтому
запишем в поле ICNT регистра SCCTL значение 8-1=7h.
7 По каждому запуску должно совершиться 3 перезапуска с паузой в четверть
периода опустошения таймера 0. В поле количества перезапусков RCNT регистра SCCTL
внесем 3h. В регистр задержки перезапуска SRTMR внесем значение 25000кГц/(10кГц*4)
- 1 = 624.
8 В поле RQMAX регистра SRQCTL необходимо внести значение 1h, т.к. измерения
будут проводиться по двум каналам.
9 Настраиваем каналы для запроса. В регистр SRQSEL необходимо внести значения
RQ0=3h, RQ1=0h.
10 Включаем усреднение сканированием по 4 опросам очереди. В регистре SRQCTL
нужно установить поля QAVGVAL=2, QAVGEN=1.
11 Разрешаем генерацию прерываний после каждой 8-ой записи в FIFO - нужно
установить бит SEQIM0 в регистре IM.
12 Разрешаем работу секвенсора. Для этого необходимо установит бит SEQEN0 в
регистре SEQEN.
13 Запускаем измерения. Перед запуском проверяем флаг ADCRDY, чтобы быть
уверенными в том, что модуль АЦП провел необходимые инициализации. Для того чтобы
их начать, необходимо включить таймер 0, установив бит ON в регистре CTRL таймера 0.
14 Измерения будут запускаться по каждому опустошению таймера 0. После
каждого запуска будет проведено по три отложенных перезапуска. Т.к. после каждого
перезапуска в FIFO попадать по 2 усредненных результата, то прерывание будет
сгенерировано после записи последнего результата в последнем третьем перезапуске.
Работа режима проиллюстрирована на рисунке 19.21.
185
Рисунок 19.21 - Диаграмма работы примера 3
Пример 4 - запуск нескольких секвенсоров
Требуемый режим работы:
- таймер 0 опустошается с частотой 10кГц;
- ШИМ0 считает в двунаправленном режиме, достигает нуля с частотой 10кГц;
- секвенсор 0 - запускается по ШИМ;
- секвенсор
0
- усреднение результатов по
4 точкам измерений равномерно
распределенным по периоду;
- секвенсор 0 - измерения по каналам 0, 1, каналы имеют повышенный приоритет;
- секвенсор 0 - каждое измерение из 2 последовательных опросов и усреднения;
- секвенсор 0 - прерывание каждые 2 записи в FIFO (по окончанию измерений в
текущем периоде);
- секвенсор 1 - запускается по таймеру;
- секвенсор 1 - измерение канала 2;
- секвенсор 1 - каждое измерение из 4 последовательных опросов и усреднения;
- секвенсор 1 - прерывание каждую запись в FIFO.
Код, соответствующий настройке и запуску необходимого режима, представлен
ниже.
// Настройка таймера
RCU->PCLKCFG0_bit.TMR0EN = 1;
RCU->PRSTCFG0_bit.TMR0EN = 1;
TMR0->LOAD = 9999;
TMR0->ADCSOC_bit.EN = 1;
//Инициализация ШИМ
RCU->PCLKCFG0_bit.PWM0EN = 1;
RCU->PRSTCFG0_bit.PWM0EN = 1;
PWM0->TBCTL_bit.CLKDIV = 1;
PWM0->TBCTL_bit.HSPCLKDIV = 5;
PWM0->TBPRD = 250;
PWM0->TBCTL_bit.CTRMODE = 2;
PWM0->ETSEL_bit.SOCASEL = 1;
186
PWM0->ETSEL_bit.SOCAEN = 1;
//Настройка АЦП
ADC->ACTL_bit.ADCEN = 0x1;
ADC->CHCTL[0].CHCTL_bit.PRIORITY = 1;
ADC->CHCTL[1].CHCTL_bit.PRIORITY = 1;
//Настройка секвенсора 0
ADC->EMUX_bit.EM0 = 7;
ADC->SEQ[0].SCCTL_bit.ICNT = 1;
ADC->SEQ[0].SCCTL_bit.RCNT = 3;
ADC->SEQ[0].SCCTL_bit.RAVGEN = 1;
ADC->SEQ[0].SRTMR = 624;
ADC->SEQ[0].SRQCTL_bit.RQMAX = 1;
ADC->SEQ[0].SRQCTL_bit.QAVGVAL = 1;
ADC->SEQ[0].SRQCTL_bit.QAVGEN = 1;
ADC->SEQ[0].SRQSEL_bit.RQ0 = 0;
ADC->SEQ[0].SRQSEL_bit.RQ1 = 1;
ADC->SEQEN_bit.SEQEN0 = 1;
ADC->IM_bit.SEQIM0 = 1;
NVIC_EnableIRQ(ADC_SEQ0_IRQn);
//Настройка секвенсора 1
ADC->EMUX_bit.EM1 = 3;
ADC->SEQ[1].SRQCTL_bit.RQMAX = 0;
ADC->SEQ[1].SRQCTL_bit.QAVGVAL = 2;
ADC->SEQ[1].SRQCTL_bit.QAVGEN = 1;
ADC->SEQ[1].SRQSEL_bit.RQ0 = 2;
ADC->SEQEN_bit.SEQEN1 = 1;
ADC->IM_bit.SEQIM1 = 1;
NVIC_EnableIRQ(ADC_SEQ1_IRQn);
// Запуск
while(!ADC->ACTL_bit.ADCRDY);
TMR0->CTRL_bit.ON = 1;
SIU->PWMSYNC_bit.PRESCRST = 1<<0;
1 Включаем тактирование таймера 0 и снимаем сброс - установим бит TMR0EN в
регистрах PCLKCFG0 и PRSTCFG0, соответственно.
2 Для того чтобы таймер опустошался с частотой 10 кГц (при SYSCLK=100МГц),
необходимо внести в регистр таймера LOAD значение (100000кГц/10кГц) - 1 = 9999.
3 Разрешаем генерацию таймером запросов на старт преобразования, установив бит
EN в регистре ADCSOC таймера.
4 Включаем тактирование ШИМ 0 и снимаем сброс - установим бит PWM0EN в
регистрах PCLKCFG0 и PRSTCFG0, соответственно.
5 Настроим делители тактового сигнала ШИМ, таким образом, чтобы частота счета
TBCLK была равна 5 МГц (при SYSCLK=100МГц). Для этого запишем в поля регистра
ШИМ TBCTL значения CLKDIV=1 (коэффициент 1/2), HSPCLKDIV=5 (коэффициент
1/10).
6 Режим счета двусторонний - поле CTRMODE=2 регистра TBCTL. А период счета
(регистр TBPRD) соответственно равен 5000кГц/(10кГц)/2 = 250.
7 Разрешаем генерацию ШИМ0 запросов по каналу А на старт преобразования,
установив бит SOCAEN в регистре ETSEL и записав единицу в поле ETSEL того же
регистра.
8 Разрешаем работу модуля АЦП - необходимо установить бит ADCEN в регистре
ACTL.
9 Устанавливаем высокий приоритет для каналов, которые будут обрабатываться
187
секвенсором 0 - каналов 0, 1, установив бит PRIRORITY в соответствующих регистрах
CHCTL.
10 Проинициализируем секвенсор 0. Настроим его источник запуска - поле EM0
регистра EMUX должно быть равно 7h, т.к. запуск по сигналу канала А ШИМ.
11 Необходимое количество записей в FIFO для генерации прерывания - 2, поэтому
запишем в поле ICNT регистра SEQ0->SCCTL значение 2-1=1h.
12 По каждому запуску должно совершиться 3 перезапуска с паузой в четверть
периода ШИМ. В поле количества перезапусков RCNT регистра SEQ0->SCCTL внесем 3h.
В регистр задержки перезапуска SEQ0->SRTMR внесем значение 25000кГц/(10кГц*4) - 1
= 624.
13 В поле RQMAX регистра SEQ0->SRQCTL необходимо внести значение 1h, т.к.
измерения будут проводиться по двум каналам.
14 Настраиваем каналы для запроса. В регистр SEQ0->SRQSEL необходимо внести
значения RQ0=0h, RQ1=1h.
15 Включаем усреднение сканированием по 2 опросам очереди. В регистре SEQ0-
>SRQCTL нужно установить поля QAVGVAL=1, QAVGEN=1.
16 Разрешаем генерацию прерываний - нужно установить бит SEQIM0 в регистре
IM.
17 Разрешаем работу секвенсора. Для этого необходимо установит бит SEQEN0 в
регистре SEQEN.
18 Проинициализируем секвенсор 1. Настроим его источник запуска - поле EM1
регистра EMUX должно быть равно 3h, т.к. запуск по сигналу таймера 0.
19 В поле RQMAX регистра SEQ1->SRQCTL необходимо внести значение 0h, т.к.
измерения будут проводиться по одному каналу.
20 Настраиваем каналы для запроса. В регистр SEQ1->SRQSEL необходимо внести
значение RQ0=2h.
21 Включаем усреднение сканированием по 4 опросам очереди. В регистре SEQ1-
>SRQCTL нужно установить поля QAVGVAL=2, QAVGEN=1.
22 Разрешаем генерацию прерываний - нужно установить бит SEQIM1 в регистре
IM.
23 Разрешаем работу секвенсора. Для этого необходимо установит бит SEQEN1 в
регистре SEQEN.
24 Запускаем измерения. Перед запуском проверяем флаг ADCRDY, чтобы быть
уверенными в том, что модуль АЦП провел необходимые инициализации. Для того чтобы
их начать, необходимо включить таймер 0, установив бит ON в регистре CTRL таймера 0.
А также разрешить работу предделителя ШИМ, записав 1h в поле PRESCRST регистра
PWMSYNC блока SIU.
25 Измерения секвенсора 0 будут запускаться по каждому равенству счетного
регистра ШИМ0 нуля. После каждого запуска будет проведено по три отложенных
перезапуска. Т.к. дополнительно включено усреднение по перезапускам, то 2 усреднённых
результата попадут в FIFO в последнем третьем перезапуске и будет вызвано прерывание.
Измерения секвенсора 1 будут производится по каждому опустошению таймера 0. После
усреднения сканированием результат будет записан в FIFO и будет вызвано прерывание.
Работа режима проиллюстрирована на рисунке 19.22.
188
189
20 Сторожевой таймер
Сторожевой таймер позволяет сбросить систему в случае отказа программного
обеспечения. Пользователь может включать или выключать таймер по собственному
усмотрению.
Сторожевой таймер представляет собой 32-битный обратный счетчик, который
загружается значением из регистра LOAD. Счетчик уменьшается на единицу по каждому
нарастающему фронту тактового сигнала WDTCLK.
По умолчанию, сторожевой таймер не тактируется и находится в сбросе.
Активировать таймер можно с мозоью регистра WDTCFG блока RCU.
Включение счета таймера и его прерывания осуществляется установкой бита INTEN
в регистре CTRL. Когда счетчик таймера достигает нуля, устанавливается флаг WDTINT в
регистре MIS, а в счетчик загружается значение из регистра LOAD.
Далее, если установлен бит RESEN, счетчик продолжает декрементироваться. Если
на момент повторного достижения нуля флаг WDTINT установлен, производится сброс
микроконтроллера. Алгоритм работы таймера показан на рисунке 20.1.
Рисунок 20.1 - Алгоритм работы таймера
190

 

 

 

 

 

 

 

 

содержание      ..     1      2      3      4      ..