Здесь приведен перевод части документации [1], посвященной описанию аппаратного блока шины CAN, доступного в процессорах ADSP-BF538, ADSP-BF538F4, ADSP-BF538F8. Предлагаемое описание предполагает, что читатель знаком со стандартом CAN (обращайтесь к спецификации Version 2.0 CAN компании Robert Bosch GmbH).
Если CAN не используется, то выводы передачи и приема (CANTX и CANRX) можно освободить и использовать как ножки потов GPIO (CANTX размещен на выводе PC0, CANRX на PC1, см. описание портов в статье [2]).
Выводы CAN на BGA корпусе процессора BC-316:
Вывод
Шарик
Функция
CANTX/PC0
B12
Сигнал передачи CAN (выход)
CANRX/PC1
B11
Сигнал приема CAN (вход)
Основные возможности и параметры модуля CAN:
• Удовлетворяет стандарту CAN 2.0B (активная версия стандарта). • Поддерживает 2 версии CAN-идентификаторов, standard (11 бит) и extended (29 бит). • Поддерживает скорости передачи до 1 мегабита/сек. • Доступно 32 почтовых ящика (mailbox): 8 на передачу, 8 на прием, 16 конфигурируемых на передачу или прием. • Отдельная маска фильтра (acceptance mask) для каждого mailbox. • Фильтрация по данным (первым двум байтам в mailbox), что можно использовать для дополнительной фильтрующей адресации (acceptance filtering в режиме DeviceNet™). • Регистры состояния ошибки (Error status) и предупреждения. • Модуль универсального счетчика. • Можно считывать уровень выводов приема и передачи.
Модуль CAN представляет собой низкоскоростной последовательный интерфейс, предназначенный для приложений, в которых скорость передачи данных не превышает 1 мегабит/сек. В протокол CAN встроена проверка данных на CRC, трекинг сообщений об ошибках и ограничение работоспособности отказавшего узла сети (fault node confinement) - все это предназначено для повышения надежности сети, чтобы удовлетворять требованиям приложений управления.
Физический интерфейс шины CAN - простая двухпроводная линия. На рис. 19-1 в символической форме показано соединение процессора с трансивером CAN (например TJA1041, TJA1050, PCA82C250, MCP2551 и т. п., см. также [4]). Выход и вход процессора Blackfin CANTX и CANRX подключается соответственно к выводам TX и RX трансивера CAN. Выводы CANTX и CANRX работают с уровнями TTL, и подходят для работы с трансиверами шины CAN по стандарту ISO/DIS 11898 или модифицированному интерфейсу RS-485 (см. таблицу 19-1).
Рис. 19-1. Соединение с формирователем физических уровней шины CAN (трансивером).
Таблица 19-1. Рецессивные и доминантные уровни сигналов передачи и приема.
Вывод
Уровень на выводе
Значение на физической линии шины CAN
CANTX
Лог. 0 (GND)
Доминантное
Лог. 1 (VCCEXT)
Рецессивное
CANRX
Лог. 0 (GND)
Доминантное
Лог. 1 (VCCEXT)
Рецессивное
Модуль CAN процессора Blackfin может подключаться к CAN-трансиверам, работающим с логическими уровнями 3V или 5V. Вывод CANRX допускает подачу TTL-уровней с напряжением 5V (5V tolerant), несмотря на то, что подсистема периферийных устройств Blackfin питается от напряжения 3.3V (шина питания VDDEXT).
Состояние по умолчанию для выхода CANTX рецессивное (лог. 1). Обратите внимание, что CANTX мультиплексируется с выводом сигнала передачи SPORT. Выходное состояние может быть лог. 0, если вместо CAN выбрано использование SPORT, что происходит для состояния по умолчанию после сброса. Входное значение вывода CANRX игнорируется.
Архитектура модуля CAN организована вокруг аппаратного mailbox RAM на 32 ячейки. К mailbox осуществляется аппаратный доступ через последовательный интерфейс CAN, или через программный доступ со стороны ядра CPU. Каждый mailbox состоит из восьми 16-битных регистров (см. далее раздел "Хранилище данных"). Данные в этих регистрах поделены на поля, которые включают идентификатор сообщения, метку времени (time stamp), счетчик байт, до 8 байт данных, а также несколько бит управления. Каждый узел на шине CAN мониторит сообщения, передаваемые по сети CAN. Если идентификатор в передаваемом сообщении совпал с идентификатором в одном из mailbox, то модуль знает, что сообщение предназначено для него, и записывает принятые данные в соответствующий mailbox, сигнализируя хосту прерыванием о событии поступления сообщения.
Сеть CAN использует одну дифференциальную пару проводов. Все узлы подключены к этой паре параллельно, и одновременно прослушивают на ней сигнал. Асинхронный интерфейс CAN не требует отдельного сигнала тактов, однако необходимо, чтобы настройка интервалов фреймов CAN (скорости) всех узлов сети была идентичной. Сообщения передаются в одном из 4 стандартных типов сообщений, или фреймов. Синхронизация достигается по тщательно продуманной схеме, выполненной в каждом приемнике CAN. Арбитраж на шине реализуется по каждому биту фрейма. Для всей сети установлена доминантная полярность уровня сигналов в сети. Всем узлам разрешается передавать в начале одного и того же фрейма, начиная с импульса синхронизации фрейма (frame sync pulse).
Когда каждый узел передает бит, он при этом одновременно проверяет, находится ли уровень бита на шине в соответствии с передаваемым им уровнем бита. Если это так, то передача продолжается. Если же нет, то это означает, что другой узел передал доминантный бит, так что первый узел по этому факту знает, что он проиграл арбитраж, и останавливает передачу, освобождая шину для другого узла. Процесс арбитража продолжается, пока не останется передающим только один узел на шине (этот узел считается выигравшим арбитраж шины CAN).
Электрические характеристики каждой конкретной сети могут значительно отличаться, поэтому аппаратура интерфейса CAN обычно всегда делится на 2 части: контроллер CAN и трансивер CAN (см. рис. 19-1). Это позволяет одному контроллеру поддерживать разные типы драйверов и сетей CAN. CAN-модуль процессора Blackfin представляет только часть контроллера. Сам протокол CAN, его стандарты и рекомендации в этой документации не приводятся и не рассматриваются. Описываются только те части протокола, которые непосредственно требуются для понимания и реализации в программном обеспечении, которое работает с модулем CAN.
[Функции пониженного энергопотребления]
Процессор Blackfin предоставляет состояние hibernate с низким потреблением энергии [3], и модуль CAN реализует встроенный режим сна. Поведение модуля CAN в этих двух режимах описывается в последующих секциях.
Пробуждение CAN из состояния Hibernate. В состоянии hibernate процессора Blackfin, когда внутренний регулятор напряжения VDDINT выключает питание ядра процессора, отключаются такты ядра и системной шины. В этом режиме кристалл процессора потребляет очень малый ток (около 50 мкА). Этот ток используется для поддержки схемы регулятора в ожидании поступления сигналов события пробуждения (hibernate wake-up event). Одно из таких событий - пробуждение из-за активности на шине CAN. После выхода из состояния hibernate модуль CAN должен быть инициализирован повторно.
Для устройств с низким энергопотреблением внешний трансивер шины CAN обычно переводится в состояние приостановки (standby mode) с помощью одного из внешних выводов портов GPIO процессора Blackfin. В режиме standby трансивер CAN постоянно выдает рецессивный уровень лог. 1 на вывод CANRX модуля CAN процессора. Если трансивер почувствовал активность шины CAN, то он переводит вывод CANRX в доминантный уровень лог. 0. Это сигнализирует процессору Blackfin, что была определена активность на шине CAN. Если внутренний регулятор напряжения был запрограммирован на определение активности на шине CAN как события выхода из состояния hibernate, то он реагирует соответственно (включается). Иначе активность на выводе CANRX никак не повлияет на состояние процессора.
Чтобы это все работало, регистр управления регулятора напряжения (VR_CTL) должен быть запрограммирован с установленным битом разрешения пробуждения от интерфейса CAN (CAN wake-up enable bit). Вот типовая последовательность событий для использования функции CAN wake-up:
1. Используйте вывод GPIO процессора, чтобы перевести внешний трансивер в режим standby. 2. Запрограммируйте регистр VR_CTL значением, где установлен бит разрешения пробуждения от CAN (CANWE), и поле FREQ установлено в 00.
CAN Sleep Mode. У модуля CAN есть встроенный режим сна. В этот режим модуль вводят установкой бита SMR в регистре CAN_CONTROL. Как только произошел вход в режим сна, многие из внутренних тактов модуля CAN выключаются, что снижает общее энергопотребление. Когда модуль CAN находится в sleep mode, все попытки чтения регистров CAN возвратят содержимое CAN_INTR вместо обычного содержания. Все записи в регистры, кроме регистра CAN_INTR, в sleep mode игнорируются.
В режиме сна малая часть модуля CAN продолжает получать такты, чтобы позволить выход из sleep mode. Запись в регистр CAN_INTR завершает sleep mode. Если бит WBA в регистре CAN_CONTROL был установлен перед входом в sleep mode, то доминантный уровень на CANRX завершает sleep mode модуля CAN.
[Регистры управления и конфигурирования CAN]
В главном управляющем регистре (CAN_CONTROL) реализовано несколько глобальных командных бит. Глобальный регистр статуса (CAN_STATUS) представляет внутренние сигналы состояния. Параметр тайминга бит CAN и специальные режим модуля CAN определены в регистрах CAN_CLOCK и CAN_TIMING.
Все значения тайминга бит могут быть изменены только когда ядро модуля CAN находится в режиме конфигурации. Программный сброс (software reset) не меняет значения регистров CAN_CLOCK и CAN_TIMING. Таким образом, выполняющаяся передача по шине CAN не может быть повреждена изменением параметров тайминга бит или инициированием программного сброса (SRS=1 в CAN_CONTROL). Регистры CAN_CLOCK и CAN_TIMING блокируются на запись (изменение их не разрешается), если CCA=0 в регистре CAN_STATUS.
Дополнительно модуль CAN содержит функцию режима теста, предназначенную для отладки ПО и системы CAN, что доступно через регистр отладки CAN (CAN_DEBUG).
На рис. 19-2 показаны глобальные биты команд, реализованные в главном регистре управления (CAN_CONTROL). После включения питания, сброса процессора или программного сброса CAN устанавливается бит CCR, и все его другие биты очищаются. Во время доступа на запись все зарезервированные биты должны быть в лог. 0.
Рис. 19-2. Master Control Register.
Примечание: установка бита CCR всего лишь обозначает попытку (запрос) входа в режим конфигурации, однако реально контроллер CAN будет находиться в режиме конфигурации только тогда, когда будет установлен бит CCA (подтверждение режима конфигурации) в регистре CAN_STATUS. Иногда, по некоторым не выясненным для меня причинам (например, когда контроллер CAN находится в состоянии ошибки, если на шине CAN присутствуют сигналы, не соответствующие текущей настройке тайминга контроллера CAN), программный сброс интерфейса CAN приводит только к установке бита CCR, но бит CCA не устанавливается. Выйти из этой ситуации получается только путем физического отключения от шины CAN.
Ниже приведено описание бит регистра CAN_CONTROL.
CCR - CAN Configuration Mode Request.
Если поле TSEG1 регистра CAN_TIMING запрограммировано в 0, то модуль не покидает режим конфигурации.
Если счетчик ошибок CAN-модуля становится больше или равен 256, то модуль входит в состояние "bus-off" (отключается от шины). Для дополнительной информации см. описание регистра CAN Error Counter (CAN_CEC). В этом состоянии модулю не дозволяется никак влиять на состояние шины, т. е. выходные драйверы выключены.
Во время последовательности восстановления из bus-off бит запроса конфигурационного режима устанавливается внутренней логикой (CCR = 1), таким образом модуль ядра CAN не подключится к шине автоматически. Бит CCR не может сброситься, пока не завершится последовательность восстановления из bus-off.
Бит CCR работает во взаимодействии с битом подтверждения режима конфигурации (бит CCA в регистре CAN_STATUS). Бит CCR не может быть очищен, если он установлен и очищен бит CCA, и бит CCR не может быть установлен, если он очищен и установлен бит CCA.
1: запрошен режим конфигурации. После включения питания этот режим активен (CCR=1 и CCA=1). Параметры тайминга бита должны быть определены перед выходом из этого режима. Доступ на запись в регистр параметра тайминга блокируется, когда модуль CAN находится в нормальном рабочем режиме (CCA == 0). Если ядро модуля CAN в настоящий момент обрабатывает сообщение на шине CAN, то эта операция завершается перед тем, как будет подтвержден режим конфигурации (CCA в активной 1). Таким образом, пользователь должен ждать установки CCA перед тем, как осуществлять доступ к параметрам тайминга бит (регистры CAN_CLOCK и CAN_TIMING). Во время режима конфигурации модуль не проявляет активности на шине CAN. Выход CANTX остается рецессивным, и модуль не принимает и не передает сообщения или фреймы ошибки. После выхода из режима конфигурации все внутренние регистры ядра CAN и счетчики ошибок CAN устанавливаются в свои начальные значения.
0: отменен запрос на режим конфигурации.
CSR - CAN Suspend Mode Request.
Бит CSR работает во взаимодействии с битом подтверждения режима приостановки (suspend mode acknowledge, CSA в регистре CAN_STATUS). Бит CSR не может быть очищен, если он установлен и бит CSA очищен, и бит CSR не может быть установлен, если он очищен и установлен бит CSA.
1: запрошен suspend mode (режим приостановки). Если модуль CAN в настоящий момент обрабатывает сообщение на шине CAN, то эта операция завершится перед тем, как будет подтвержден suspend mode (CSA в активной 1). Таким образом, пользователь должен ждать установки бита CSA. Во время suspend mode модуль не проявляет активности на шине CAN. Выход CANTX остается рецессивным, и модуль не принимает и не передает сообщения или фреймы ошибки. Содержимое счетчиков ошибок CAN остается неизменным.
0: запрос suspend mode отменен.
SMR - Sleep Mode Request.
В режиме сна (sleep mode) отключается тактирование на большинстве регистров CAN, что снижает потребление тока. Модуль может проснуться от активности на шине CAN или от записи в регистр CAN_INTR. Бит SMACK в регистре CAN_INTR показывает, что активен sleep mode.
Чтобы достичь самого лучшей экономии энергии, используйте состояние hibernate, и установите регулятор напряжения на пробуждение от активности на шине CAN. Для дополнительной информации см. выше "Пробуждение CAN из состояния Hibernate".
1: модуль входит в sleep mode после того, как завершилась операция на шине CAN. 0: не было запроса на вход в sleep mode.
WBA - Wake-Up on CAN Bus Activity.
1: произойдет автоматический выход из sleep mode, если была определена любая активность на шине CAN. 0: модуль остается в sleep mode, независимо от состояния шины CAN, пока сброшен SMR.
ABO - Auto Bus On.
1: после завершения процедуры восстановления из состояния bus-off произойдет автоматический вход в состояние bus active. 0: после завершения процедуры восстановления из состояния bus-off произойдет вход в режим конфигурации.
DNM - DeviceNet Mode.
Если разрешено, то запускается фильтрация приема (acceptance filtering) после получения первого бита CRC, или после первого принятого бита DLC.
1: разрешен DeviceNet mode (фильтрация по байтам данных). Биты FDF и FMD в регистре CAN_AMxxH определяют функционал режима DeviceNet. См. далее описание регистров CAN Acceptance Mask (CAN_AMxx). 0: стандартная фильтрация сообщений (acceptance filtering), осуществляемая только по идентификатору.
SRS - Software Reset.
Этот бит регистра всегда читается как 0.
1: инициирует программный сброс. Все соответствующие биты регистра установятся в свои начальные значения, если не указано что-то другое в описании соответствующего регистра. 0: не оказывает никакого эффекта.
Регистр глобального статуса (CAN_STATUS), показанный на рис. 19-3, представляет сигналы внутреннего состояния. Этот регистр предназначен только для чтения (RO). Запись в регистр CAN_STATUS не дает никакого эффекта.
Рис. 19-3. Global Status Register (RO, только чтение).
Ниже приведено описание бит регистра CAN_STATUS.
REC - Receive Mode.
1: ядро протокола CAN находится в режиме приема. 0: ядро протокола CAN не находится в режиме приема.
RTM - Transmit Mode.
1: ядро протокола CAN находится в режиме передачи. 0: ядро протокола CAN не находится в режиме передачи.
MBPTR - Mail Box Pointer.
Представляет номер mailbox текущего передаваемого сообщения. После успешной передачи эти биты остаются не измененными.
11111: сейчас обрабатывается сообщение в mailbox 31. ... ... 00000: сейчас обрабатывается сообщение в mailbox 0.
CCA - CAN Configuration Mode Acknowledge.
1: ядро протокола CAN находится в режиме конфигурации. 0: ядро протокола CAN не находится в режиме конфигурации.
CSA - CAN Suspend Mode Acknowledge.
1: ядро протокола CAN находится в режиме suspend mode. 0: ядро протокола CAN не находится в режиме suspend mode.
SMA - Sleep Mode Acknowledge.
Бит SMA всегда читается как 0. Если модуль CAN находится в sleep mode, чтение регистра CAN_STATUS возвратит содержимое регистра CAN_INTR.
1: модуль находится в sleep mode. Все такты выключены. 0: модуль не находится в sleep mode.
EBO - CAN Error Bus-Off Mode.
1: счетчик ошибок передачи TXECNT достиг предела отключения от шины 256 (bus-off limit). 0: значение счетчика ошибок передачи TXECNT меньше 256.
EP - CAN Error Passive Mode.
1: как минимум один из счетчиков ошибок (RXECNT и TXECNT) достиг пассивного уровня ошибок 128. 0: значение обоих счетчиков ошибок (RXECNT и TXECNT) ниже 128.
WR - CAN Receive Warning Flag.
1: значение счетчика ошибок приема (RXECNT) достиг предела предупреждения (warning limit). 0: значение счетчика ошибок приема (RXECNT) ниже предела предупреждения (warning limit).
WT - CAN Transmit Warning Flag.
1: значение счетчика ошибок передачи (TXECNT) достиг предела предупреждения (warning limit). 0: значение счетчика ошибок передачи (TXECNT) ниже предела предупреждения (warning limit).
Регистр CAN_CLOCK (рис. 19-4) не генерирует сам по себе интервалы бит CAN. Он задает квант времени бита (time quantum, TQ), формируемый из частоты системной шины (SCLK). Из нескольких квантов времени формируется бит CAN, что управляется регистром CAN_TIMING.
Рис. 19-4. CAN Clock Register.
Квант времени вычисляется по формуле:
TQ = (BRP + 1)/SCLK
BRP. Хотя поле BRP можно установить в любое значение, однако рекомендуется, чтобы оно было больше или равно 4. Когда BRP < 4, на конфигурацию тайминга бита накладываются ограничения.
Все узлы шины CAN должны использовать одинаковую скорость бит (bit rate, битрейт).
Не модифицируйте регистр CAN_CLOCK во время нормальной работы интерфейса CAN (CCA == 0). Для этой цели всегда входите в режим конфигурации (CCR == 1, CCA == 1). Записи в этот регистр не оказывают никакого эффекта, когда модуль CAN не находится в режиме конфигурации.
Программный сброс не влияет на этот регистр (после него все значения остаются неизменными).
На основе кванта времени (time quantum, TQ) генерируемого прескалером BRP в регистре CAN_CLOCK, регистр CAN_TIMING (рис. 19-5) управляет номинальным временем бита и точкой выборки отдельных бит в протоколе CAN.
Рис. 19-5. CAN Timing Register (RO, только чтение).
Рис. 19-6 показывает 3 фазы бита CAN: сегмент синхронизации, сегмент перед точкой выборки уровня (sample point) и сегмент после точки выборки уровня.
Рис. 19-6. Три фазы бита CAN.
Сегмент синхронизации зафиксирован на длительности одного кванта TQ. Он требуется для синхронизации узлов на шине. Все перепады уровня сигнала ожидаются в пределах этого сегмента.
TSEG1, TSEG2. Поля TSEG1 и TSEG2 задают из скольких TQ состоит бит CAN, что влияет на скорость CAN (bit rate). Номинальное время бита определяется по формуле:
tBIT = TQ x (1 + (1 + TSEG1) + (1 + TSEG2))
Для безопасного функционирования приема в физических сетях точка выборки данных программируется полем TSEG1. Поле TSEG2 хранит количество квантов TQ, необходимых до завершения времени бита. Часто самая лучшая надежность достигается с точками выборки, находящимися в верхнем 80% диапазоне времени бита. Не используйте точки выборки ниже 50%. Таким образом, TSEG1 всегда должно быть больше или равно TSEG2.
Модуль CAN процессора Blackfin не делает различий между сегментом распространения (propagation segment) и сегментом фазы 1 (phase segment 1), как это определено стандартом. Значение TSEG1 предназначено покрывать оба этих интервала времени. Значение TSEG2 представляет сегмент фазы 2 (phase segment 2).
SJW. Если модуль CAN определяет перепад recessive -> dominant вне сегмента синхронизации, то он может автоматически переместить точку выборки так, чтобы бит CAN все еще обрабатывался правильно. Поле скачка синхронизации (synchronization jump width, SJW) задает максимальное количество квантов TQ, допустимое для такой попытки повторной синхронизации. Значение SJW не должно превышать TSEG2 или TSEG1:
SJW ≤ TSEG2 ≤ TSEG1
В дополнение к этому фундаментальному правилу, поле TSEG2 также должно быть больше или равно времени обработки информации (information processing time, IPT). Это время, требуемое для логики, чтобы сделать выборку CANRX. На модуле CAN процессора Blackfin это время составляет 3 такта SCLK. По этой причине TSEG2 не должно быть равно 0. Если прескалер тактов установлен в 0, то TSEG2 должно быть больше или равно 3. Если прескалер установлен в 1, минимальное значение TSEG2 будет 2.
SAM. С очищенным битом SAM уровень CANRX выбирается после истечения TSEG1. Если установлен бит SAM, то делается тройная выборка входного сигнала с частотой SCLK. Результирующее значение бита генерируется по мажоритарному принципу от значений этих трех выборок. Всегда оставляйте бит SAM очищенным, если значение BRP меньше 4.
Не модифицируйте этот регистр во время нормальной работы модуля CAN. Для этой цели всегда входите в режим конфигурации. Запись в этот регистр не дает эффекта, если модуль CAN не находится в режиме конфигурации.
Программный сброс не оказывает влияния на этот регистр (после программного сброса все значения в нем остаются неизменными).
Ниже дан пример настройки регистров CAN_CONTROL и CAN_TIMING для частоты шины SCLK=50 МГц. Функция Init_CAN_Timing принимает параметр speed, где указана скорость в килобитах/сек. Значение speed может принимать значение из ряда скандартных скоростей 1000, 800, 500, 250, 125, 100, 50, 20, 10 килобит/сек.
typedefstruct
{
u16 speed; // Скорость, килобит/сек.
u16 can_clock; // Значение для регистра CAN_CLOCK.
u16 can_timing; // Значение для регистра CAN_TIMING.
}TCanParam;
// Таблица параметров для стандартных скоростей CAN и частоты SCLK = 50 МГц,
// вычисленная на ресурсе http://www.bittiming.can-wiki.info/ [5]:
staticconst TCanParam canparam [] =
{
{1000, 0x0004, 0x0007}, //Sample Point 90%
{ 800, 0, 0},
{ 500, 0x0009, 0x0007}, //Sample Point 90%
{ 250, 0x0013, 0x0007}, //Sample Point 90%//{ 250, 0x0018, 0x0005}, //Sample Point 87.5%//{ 125, 0x0018, 0x001C}, //Sample Point 90%
{ 125, 0x0027, 0x0007}, //Sample Point 90%//{ 125, 0x0031, 0x0005}, //Sample Point 87.5%
{ 100, 0x0031, 0x0007}, //Sample Point 90%
{ 50, 0x0063, 0x0007}, //Sample Point 90%//{ 50, 0x007C, 0x0005}, //Sample Point 87.5%//{ 25, 0x007C, 0x001C}, //Sample Point 87.5%
{ 25, 0x00C7, 0x0007}, //Sample Point 90%//{ 25, 0x00F9, 0x0005}, //Sample Point 87.5%
{ 20, 0x00F9, 0x0007}, //Sample Point 90%
{ 10, 0x01F3, 0x0007}, //Sample Point 90%//{ 10, 0x0270, 0x0005}, //Sample Point 87.5%
{ 0, 0, 0}
};
staticboolInit_CAN_Timing(u16 speed)
{
// Вход в режим конфигурации CAN (установка CCR):*pCAN_CONTROL = CCR;
while(0== (*pCAN_STATUS & CCA))
{
// Цикл ожидания входа в режим конфигурации.
ssync();
}
/* ===================================================
* ==================================================*/int idx =0;
bool result =false;
while (canparam[idx].speed)
{
if (canparam[idx].speed == speed)
{
*pCAN_TIMING = canparam[idx].can_timing;
*pCAN_CLOCK = canparam[idx].can_clock;
ssync();
result =true;
break;
}
idx++;
}
// Выход из режима конфигурации CAN (очистка CCR):*pCAN_CONTROL =0;
while(*pCAN_STATUS & CCA)
{
// Цикл ожидания выхода из режима конфигурации.
ssync();
}
return result;
}
После вызова Init_CAN_Timing останется настроить ящики передачи и приема и (при необходимости) обработку их прерываний (об этом далее), и модуль CAN полностью готов к работе.
В модуле CAN есть тестовый режим, предназначенный для отладки ПО и системы CAN. Ниже в листинге 19-1 приведен пример разрешения функции отладки CAN.
При использовании этой функции модуль CAN может быть не совместим со спецификацией CAN. Все тестовые режимы должны быть разрешены или запрещены только когда модуль находится в режиме конфигурации (CCA=1 в регистре CAN_STATUS) или в режиме приостановки (suspend mode, CSA = 1 в регистре CAN_STATUS).
CDE. Бит CDE используется для получения доступа ко всем функциям отладки. Этот бит должен быть установлен для разрешения тестового режима, и должен быть записан перед последующими записями в регистр CAN_DEBUG. Когда бит CDE очищен, все функции отладки запрещены.
Листинг 19-1. Разрешение функций отладки (CAN Debug) на языке C:
#include < cdefBF538.h>
/* Разрешение debug mode, CDE должен быть установлен перед тем,
как могут быть модифицированы другие флаги в регистре: */
*pCAN_DEBUG |= CDE;
/* Установка флагов отладки: */
*pCAN_DEBUG &=~DTO;
*pCAN_DEBUG |= MRB | MAA | DIL;
/* Запуск кода в тестовом режиме: */
...
/* Запрет debug mode: */
*pCAN_DEBUG &=~CDE;
Когда бит CDE установлен, то разрешены записи в другие биты регистра CAN_DEBUG. Это также разрешает функции, не совместимые со стандартом CAN:
• Регистры тайминга бит можно поменять в любой момент, не только в режиме конфигурации. Это включает регистры CAN_CLOCK и CAN_TIMING. • Допускается запись в предназначенный только для чтения регистр ошибок передачи/приема CAN_CEC.
MRB. Бит обратного чтения режима (mode read back, MRB) используется для разрешения read back mode. В этом режиме сообщение, переданное по шине CAN (или через внутреннюю петлю зацикливания выхода на вход, режим internal loop back) принимается обратно напрямую во внутренний буфер приема. После корректной передачи внутренняя логика обрабатывает его как нормально принятое сообщение. Эта функция дает возможность протестировать функции CAN без внешних устройств (без внешнего трансивера и без внешнего подключения к физической сети CAN).
MAA. Бит режима автоматического подтверждения (mode auto acknowledge, MAA) позволяет модулю CAN генерировать собственное подтверждение во время слота ACK фрейма CAN. Не требуется подключения внешних устройств или внешних соединений, чтобы прочитать обратно переданное сообщение. В этом режиме сообщение, которое отправляется, автоматически сохраняется во внутренний буфер приема. В режиме auto acknowledge модуль посылает подтверждение сам себе. Это подтверждение может быть запрограммировано появляться на выводе CANTX, если DIL=1 и DTO=0. Если подтверждение предназначено использовать только внутренне, то эти биты тестового режима должны быть установлены в значения DIL=0 и DTO=1.
DIL. Бит запрета внутренней обратной петли (disable internal loop, DIL) используется для того, чтобы разрешить соединить внутри модуля выход передатчика со входом приемника.
DTO. Бит запрета выхода передачи (disable transmit output, DTO) используется, чтобы запретить выход CANTX. Когда этот бит установлен, на вывод CANTX постоянно выводятся рецессивные биты.
DRI. Бит запрета входа приема (disable receive input, DRI) используется, чтобы запретить вход CANRX. Когда этот бит установлен, внутренняя логика принимает рецессивные биты, или принимает сгенерированное внутри значение передачи в случае, когда разрешено внутреннее зацикливание с выхода на вход (DIL=0). В любом случае сигналы на входе CANRX игнорируются.
DEC. Бит запрета счетчиков ошибок (disable error counters, DEC) используется для запрета счетчиков ошибок передачи и приема в регистре CAN_CEC. Когда этот бит установлен, CAN_CEC хранит свои текущие значения, и не разрешается инкремент или декремент счетчиков ошибок. Этот режим не удовлетворяет спецификации CAN.
Записи в счетчики ошибок должны осуществляться только в debug mode. Доступ на запись во время приема могут привести к непредсказуемым значениям. Максимальное значение, которое можно записать в счетчики ошибок, равно 255. Таким образом, значение счетчика ошибок 256, которое принудительно переведет модуль CAN в состояние bus-off, нельзя записать в счетчики ошибок.
Таблица 19-2 показывает общие комбинации бит тестового режима.
Таблица 19-2. Тестовые режимы модуля CAN.
MRB
MAA
DIL
DTO
DRI
CDE
Функциональное описание
x
x
x
x
x
0
Нормальный режим, не режим отладки.
0
x
x
x
x
x
Не читать обратно передаваемое сообщение.
1
0
1
0
0
1
Нормальная передача по шине CAN. Обратное чтение. Требуется внешнее подтверждение от внешнего устройства.
1
1
1
0
0
1
Нормальная передача по шине CAN. Обратное чтение. Не требуется внешнее подтверждение от внешнего устройства. Передаваемое сообщение и подтверждение передается по шине CAN. Разрешен вход CANRX.
1
1
0
0
0
1
Нормальная передача по шине CAN. Обратное чтение. Не требуется внешнее подтверждение от внешнего устройства. Передаваемое сообщение и подтверждение передается по шине CAN. Вход CANRX и внутренняя петля с выхода на вход разрешены (операция ИЛИ над сигналами TX и TX).
1
1
0
0
1
1
Нормальная передача по шине CAN. Обратное чтение. Не требуется внешнее подтверждение от внешнего устройства. Передаваемое сообщение и подтверждение передается по шине CAN. Вход CANRX игнорируется. Внутренняя петля с выхода на вход разрешена.
1
1
0
1
1
1
Нет передачи по шине CAN. Обратное чтение. Не требуется внешнее подтверждение от внешнего устройства. По шине CAN не передается ни сообщение, ни подтверждение. Вход CANRX игнорируется. Внутренняя петля с выхода на вход разрешена.
[Хранилище данных]
Все относящиеся к CAN данные сохраняются в mailbox RAM. Здесь есть восемь 16-битных слов для каждого из 32 mailbox.
Значения идентификатора (базовая и расширенная часть), бит расширения идентификатора (identifier extension, IDE), бит запроса передачи дальнего окончания (remote transmission request, RTR), код длины данных (data length code, DLC) и поле данных каждого сообщения можно запрограммировать в области mailbox (см. рис. 19-7). Бит substitute remote request (SRR, всегда передается как рецессивный) и зарезервированные биты R0 и R1 (всегда отправляются как доминантные) автоматически генерируются внутренней логикой.
Рис. 19-7. Форматы сообщения CAN.
[Регистры слова идентификатора mailbox]
Каждый mailbox состоит из 8 слов и включает:
• 29-битный идентификатор (базовая часть плюс расширенная часть). • Бит разрешения маски фильтрации (acceptance mask enable, AME). • Бит запроса передачи с дальнего окончания (remote transmission request, RTR). • Бит расширения идентификатора (identifier extension, IDE). • Код длины сообщения (data length code, DLC). • До 8 байт для поля данных. • Два байта для значения метки времени (time stamp value, TSV).
Старшие 12 бит слова 4 каждого mailbox помечены зарезервированными. Эти биты всегда должны быть установлены в 0.
Если разрешена опция фильтрации по полю данных (DNM=1 в регистре CAN_CONTROL и FDF=1 с соответствующей acceptance mask), то биты [15:0] слова 6 (ExtId) повторно используется как код разрешения получения (acceptance code, DFC) для поля фильтрации данных.
Ниже во врезках приведено описание регистров mailbox. Буквы xx заменяются на значение номера mailbox от 00 до 31. В именах бит n заменяется на число от 0 до 31.
Обратите внимание, что регистры mailbox реализованы как RAM, и у них нет определенного значения после сброса. Поэтому каждый mailbox должен быть сброшен программно перед его разрешением установкой соответствующего бита в регистре CAN_MCx.
Рис. 19-8. Mailbox Identifier Word 7 (адреса MMR-регистров см. в таблице 19-3).
Таблица 19-3. Адреса регистров Mailbox Identifier Word 7.
Имя регистра
MMR-адрес
Имя регистра
MMR-адрес
CAN_MB00_ID1
0xFFC0 2C1C
CAN_MB16_ID1
0xFFC0 2E1C
CAN_MB01_ID1
0xFFC0 2C3C
CAN_MB17_ID1
0xFFC0 2E3C
CAN_MB02_ID1
0xFFC0 2C5C
CAN_MB18_ID1
0xFFC0 2E5C
CAN_MB03_ID1
0xFFC0 2C7C
CAN_MB19_ID1
0xFFC0 2E7C
CAN_MB04_ID1
0xFFC0 2C9C
CAN_MB20_ID1
0xFFC0 2E9C
CAN_MB05_ID1
0xFFC0 2CBC
CAN_MB21_ID1
0xFFC0 2EBC
CAN_MB06_ID1
0xFFC0 2CDC
CAN_MB22_ID1
0xFFC0 2EDC
CAN_MB07_ID1
0xFFC0 2CFC
CAN_MB23_ID1
0xFFC0 2EFC
CAN_MB08_ID1
0xFFC0 2D1C
CAN_MB24_ID1
0xFFC0 2F1C
CAN_MB09_ID1
0xFFC0 2D3C
CAN_MB25_ID1
0xFFC0 2F3C
CAN_MB10_ID1
0xFFC0 2D5C
CAN_MB26_ID1
0xFFC0 2F5C
CAN_MB11_ID1
0xFFC0 2D7C
CAN_MB27_ID1
0xFFC0 2F7C
CAN_MB12_ID1
0xFFC0 2D9C
CAN_MB28_ID1
0xFFC0 2F9C
CAN_MB13_ID1
0xFFC0 2DBC
CAN_MB29_ID1
0xFFC0 2FBC
CAN_MB14_ID1
0xFFC0 2DDC
CAN_MB30_ID1
0xFFC0 2FDC
CAN_MB15_ID1
0xFFC0 2DFC
CAN_MB31_ID1
0xFFC0 2FFC
Дополнительные биты регистров CAN_MBxxID1:
AME - Acceptance Mask Enable.
1: разрешает маску фильтрации по идентификатору для приходящих сообщений (возможен прием по группе адресов). 0: разрешает фильтрацию по идентификатору (полное совпадение идентификатора).
RTR - Remote Transmission Request.
1: разрешает сообщение в виде фрейма remote. 0: разрешает сообщение в виде фрейма данных.
Периферийное устройство CAN обменивается данными так, что самый "значащий" байт (который хранится по самому старшему адресу) передается первым. По этой причине регистры CAN_MBxx_DATAx используются таким образом, как если бы старший байт был первым. Например, если передан или принят только 1 байт (DLC = 1), то он сохраняется в самый значащий байт регистра CAN_MBxx_DATA3. Если переданы или приняты два байта, то они сохраняются в старшую и младшую половины CAN_MBxx_DATA3. См. рисунки 19-12, 19-13, 19-14 и 19-15. Поначалу это вностит известную путаницу, будьте внимательны!
Ниже показан код, который обеспечивает прогнозируемый порядок следования байт и в памяти, и при передаче - первый байт в памяти (по самому младшему адресу) передается первым:
Имейте в виду, что эта функция не обеспечивает гарантированный порядок следования друг за другом 8-байтных пакетов в том случае, если при входе в функцию некоторые ящики были заняты. Для обеспечения определенного порядка следования пакетов друг за другом используйте на передачу только один передающий ящик.
[CAN_MBxx_DATA3, первый и второй передаваемые байты]
Рис. 19-12. Mailbox Identifier Word 3 (адреса MMR-регистров см. в таблице 19-7).
Таблица 19-7. Адреса регистров Mailbox Identifier Word 3.
Имя регистра
MMR-адрес
Имя регистра
MMR-адрес
CAN_MB00_DATA3
0xFFC0 2C0C
CAN_MB16_DATA3
0xFFC0 2E0C
CAN_MB01_DATA3
0xFFC0 2C2C
CAN_MB17_DATA3
0xFFC0 2E2C
CAN_MB02_DATA3
0xFFC0 2C4C
CAN_MB18_DATA3
0xFFC0 2E4C
CAN_MB03_DATA3
0xFFC0 2C6C
CAN_MB19_DATA3
0xFFC0 2E6C
CAN_MB04_DATA3
0xFFC0 2C8C
CAN_MB20_DATA3
0xFFC0 2E8C
CAN_MB05_DATA3
0xFFC0 2CAC
CAN_MB21_DATA3
0xFFC0 2EAC
CAN_MB06_DATA3
0xFFC0 2CCC
CAN_MB22_DATA3
0xFFC0 2ECC
CAN_MB07_DATA3
0xFFC0 2CEC
CAN_MB23_DATA3
0xFFC0 2EEC
CAN_MB08_DATA3
0xFFC0 2D0C
CAN_MB24_DATA3
0xFFC0 2F0C
CAN_MB09_DATA3
0xFFC0 2D2C
CAN_MB25_DATA3
0xFFC0 2F2C
CAN_MB10_DATA3
0xFFC0 2D4C
CAN_MB26_DATA3
0xFFC0 2F4C
CAN_MB11_DATA3
0xFFC0 2D6C
CAN_MB27_DATA3
0xFFC0 2F6C
CAN_MB12_DATA3
0xFFC0 2D8C
CAN_MB28_DATA3
0xFFC0 2F8C
CAN_MB13_DATA3
0xFFC0 2DAC
CAN_MB29_DATA3
0xFFC0 2FAC
CAN_MB14_DATA3
0xFFC0 2DCC
CAN_MB30_DATA3
0xFFC0 2FCC
CAN_MB15_DATA3
0xFFC0 2DEC
CAN_MB31_DATA3
0xFFC0 2FEC
[CAN_MBxx_DATA2, третий и четвертый передаваемые байты]
Рис. 19-13. Mailbox Identifier Word 2 (адреса MMR-регистров см. в таблице 19-8).
Таблица 19-8. Адреса регистров Mailbox Identifier Word 2.
Имя регистра
MMR-адрес
Имя регистра
MMR-адрес
CAN_MB00_DATA2
0xFFC0 2C08
CAN_MB16_DATA2
0xFFC0 2E08
CAN_MB01_DATA2
0xFFC0 2C28
CAN_MB17_DATA2
0xFFC0 2E28
CAN_MB02_DATA2
0xFFC0 2C48
CAN_MB18_DATA2
0xFFC0 2E48
CAN_MB03_DATA2
0xFFC0 2C68
CAN_MB19_DATA2
0xFFC0 2E68
CAN_MB04_DATA2
0xFFC0 2C88
CAN_MB20_DATA2
0xFFC0 2E88
CAN_MB05_DATA2
0xFFC0 2CA8
CAN_MB21_DATA2
0xFFC0 2EA8
CAN_MB06_DATA2
0xFFC0 2CC8
CAN_MB22_DATA2
0xFFC0 2EC8
CAN_MB07_DATA2
0xFFC0 2CE8
CAN_MB23_DATA2
0xFFC0 2EE8
CAN_MB08_DATA2
0xFFC0 2D08
CAN_MB24_DATA2
0xFFC0 2F08
CAN_MB09_DATA2
0xFFC0 2D28
CAN_MB25_DATA2
0xFFC0 2F28
CAN_MB10_DATA2
0xFFC0 2D48
CAN_MB26_DATA2
0xFFC0 2F48
CAN_MB11_DATA2
0xFFC0 2D68
CAN_MB27_DATA2
0xFFC0 2F68
CAN_MB12_DATA2
0xFFC0 2D88
CAN_MB28_DATA2
0xFFC0 2F88
CAN_MB13_DATA2
0xFFC0 2DA8
CAN_MB29_DATA2
0xFFC0 2FA8
CAN_MB14_DATA2
0xFFC0 2DC8
CAN_MB30_DATA2
0xFFC0 2FC8
CAN_MB15_DATA2
0xFFC0 2DE8
CAN_MB31_DATA2
0xFFC0 2FE8
[CAN_MBxx_DATA1, пятый и шестой передаваемые байты]
Рис. 19-14. Mailbox Identifier Word 1 (адреса MMR-регистров см. в таблице 19-9).
Таблица 19-9. Адреса регистров Mailbox Identifier Word 1.
Имя регистра
MMR-адрес
Имя регистра
MMR-адрес
CAN_MB00_DATA1
0xFFC0 2C04
CAN_MB16_DATA1
0xFFC0 2E04
CAN_MB01_DATA1
0xFFC0 2C24
CAN_MB17_DATA1
0xFFC0 2E24
CAN_MB02_DATA1
0xFFC0 2C44
CAN_MB18_DATA1
0xFFC0 2E44
CAN_MB03_DATA1
0xFFC0 2C64
CAN_MB19_DATA1
0xFFC0 2E64
CAN_MB04_DATA1
0xFFC0 2C84
CAN_MB20_DATA1
0xFFC0 2E84
CAN_MB05_DATA1
0xFFC0 2CA4
CAN_MB21_DATA1
0xFFC0 2EA4
CAN_MB06_DATA1
0xFFC0 2CC4
CAN_MB22_DATA1
0xFFC0 2EC4
CAN_MB07_DATA1
0xFFC0 2CE4
CAN_MB23_DATA1
0xFFC0 2EE4
CAN_MB08_DATA1
0xFFC0 2D04
CAN_MB24_DATA1
0xFFC0 2F04
CAN_MB09_DATA1
0xFFC0 2D24
CAN_MB25_DATA1
0xFFC0 2F24
CAN_MB10_DATA1
0xFFC0 2D44
CAN_MB26_DATA1
0xFFC0 2F44
CAN_MB11_DATA1
0xFFC0 2D64
CAN_MB27_DATA1
0xFFC0 2F64
CAN_MB12_DATA1
0xFFC0 2D84
CAN_MB28_DATA1
0xFFC0 2F84
CAN_MB13_DATA1
0xFFC0 2DA4
CAN_MB29_DATA1
0xFFC0 2FA4
CAN_MB14_DATA1
0xFFC0 2DC4
CAN_MB30_DATA1
0xFFC0 2FC4
CAN_MB15_DATA1
0xFFC0 2DE4
CAN_MB31_DATA1
0xFFC0 2FE4
[CAN_MBxx_DATA0, седьмой и восьмой передаваемые байты]
Рис. 19-15. Mailbox Identifier Word 0 (адреса MMR-регистров см. в таблице 19-10).
Таблица 19-10. Адреса регистров Mailbox Identifier Word 0.
Имя регистра
MMR-адрес
Имя регистра
MMR-адрес
CAN_MB00_DATA0
0xFFC0 2C00
CAN_MB16_DATA0
0xFFC0 2E00
CAN_MB01_DATA0
0xFFC0 2C20
CAN_MB17_DATA0
0xFFC0 2E20
CAN_MB02_DATA0
0xFFC0 2C40
CAN_MB18_DATA0
0xFFC0 2E40
CAN_MB03_DATA0
0xFFC0 2C60
CAN_MB19_DATA0
0xFFC0 2E60
CAN_MB04_DATA0
0xFFC0 2C80
CAN_MB20_DATA0
0xFFC0 2E80
CAN_MB05_DATA0
0xFFC0 2CA0
CAN_MB21_DATA0
0xFFC0 2EA0
CAN_MB06_DATA0
0xFFC0 2CC0
CAN_MB22_DATA0
0xFFC0 2EC0
CAN_MB07_DATA0
0xFFC0 2CE0
CAN_MB23_DATA0
0xFFC0 2EE0
CAN_MB08_DATA0
0xFFC0 2D00
CAN_MB24_DATA0
0xFFC0 2F00
CAN_MB09_DATA0
0xFFC0 2D20
CAN_MB25_DATA0
0xFFC0 2F20
CAN_MB10_DATA0
0xFFC0 2D40
CAN_MB26_DATA0
0xFFC0 2F40
CAN_MB11_DATA0
0xFFC0 2D60
CAN_MB27_DATA0
0xFFC0 2F60
CAN_MB12_DATA0
0xFFC0 2D80
CAN_MB28_DATA0
0xFFC0 2F80
CAN_MB13_DATA0
0xFFC0 2DA0
CAN_MB29_DATA0
0xFFC0 2FA0
CAN_MB14_DATA0
0xFFC0 2DC0
CAN_MB30_DATA0
0xFFC0 2FC0
CAN_MB15_DATA0
0xFFC0 2DE0
CAN_MB31_DATA0
0xFFC0 2FE0
Приемные mailbox используют временный буфер приема, которые перезаписываются только на основе кода DLC сообщения. Для кодов DLC меньше 8 самые младшие байты не перезаписываются, и сохраняются в принимающем mailbox. Будут допустимы только данные, количество которых определено полем DLC.
Программа должна проверять код DLC принятого сообщения, чтобы определить, какие читать байты в регистрах CAN_MBxx_DATAx.
[Область mailbox]
Большинство CAN mailbox, но не все, можно конфигурировать на передачу или прием. У каждого mailbox есть маска фильтрации по идентификатору (acceptance mask). Mailbox 31 это mailbox со самым старшим номером.
Типы mailbox. Mailbox-ы используются для приема и передачи. 8 mailbox-ов предназначены только для передачи, еще 8 только для приема, и остальные 16 можно конфигурировать на передачу или прием. Только конфигурируемые mailbox поддерживают функцию фрейма запроса передачи от дальнего окончания (remote frame-request). Область регистров управления mailbox состоит из регистров:
• CAN_MC1 и CAN_MC2 (регистры разрешения mailbox). • CAN_MD1 и CAN_MD2 (регистры направления mailbox). • CAN_TA1 и CAN_TA2 (регистры подтверждения передачи). • CAN_AA1 и CAN_AA2 (регистры подтверждения abort). • CAN_TRS1 и CAN_TRS2 (регистры установки запроса подтверждения передачи). • CAN_TRR1 и CAN_TRR2 (регистры сброса запроса подтверждения передачи). • CAN_RMP1 и CAN_RMP2 (регистры ожидающих обработки принятых сообщений). • CAN_RML1 и CAN_RML2 (регистры принятых, но не обработанных сообщений). • CAN_RFH1 и CAN_RFH2 (регистры обработки remote frame). • CAN_OPSS1 и CAN_OPSS2 (регистры защиты от перезаписи / одиночной передачи). • CAN_MBIM1 и CAN_MBIM2 (регистры маски прерываний mailbox). • CAN_MBTIF1 and CAN_MBTIF2 (регистры флагов прерывания передачи mailbox). • CAN_MBRIF1 and CAN_MBRIF2 (регистры флагов прерывания приема mailbox).
Управление mailbox. Регистры конфигурации mailbox (CAN_MCx) и направления mailbox (CAN_MDx) конфигурируют основное поведение mailbox-ов CAN. Каждый mailbox может быть индивидуально разрешен или запрещен.
Регистры конфигурации mailbox (CAN_MCx) используются для разрешения или запрета каждого mailbox. Регистры направления mailbox (CAN_MDx) определяют, какие mailbox используются для передачи, а какие для приема. Если бит MCn в регистре CAN_MCx установлен в 0, то соответствующий mailbox с номером n будет запрещен. Mailbox должен быть запрещен перед записью его любого поля идентификатора. См. рисунки 19-16 и Figure 19-17.
Рис. 19-16. Mailbox Configuration Register 1 (для всех бит 0: mailbox запрещен, 1: разрешен).
Рис. 19-17. Mailbox Configuration Register 2 (для всех бит 0: mailbox запрещен, 1: разрешен).
Не записывайте идентификатор объекта сообщения, пока mailbox разрешен для модуля CAN (когда установлен соответствующий бит CAN_MCx). Mailbox-ы, которые запрещены, могут использоваться для CPU как дополнительная быстрая память.
Если mailbox используется для передачи, то соответствующий бит в регистре конфигурации (MCn) и регистре направления (MDn) должен быть установлен перед тем, как будет установлен бит запроса на передачу (TRSn).
Чтобы запретить передающий mailbox, соответствующий бит в регистре запроса сброса передачи (CAN_TRRx) и регистра установки запроса передачи (CAN_TRSx) должны быть сначала сброшены внутренней логикой. Установка бита TRRn регистра CAN_TRRx и бита
TRSn регистра CAN_TRSx а запрещенном mailbox может привести к неопределенному поведению модуля CAN.
Если mailbox используется для приема (MDn=1 в регистре CAN_MDx), и он запрещен, то принимаемое в настоящий момент сообщение для этого ящика теряется, даже если имеется другой mailbox, сконфигурированный на прием сообщения с таким же идентификатором. Это произойдет, если mailbox запрещается (MCn=0 в регистре CAN_MCx) после того, как внутренняя логика фильтрации (acceptance filtering) завершит обработку идентификатора и перед завершением приема этого сообщения.
Регистры CAN_MD1 и CAN_MD2 определяют направление работы каждого mailbox. По умолчанию mailbox-ы 7 .. 0 сконфигурированы на прием, и mailbox-ы 31 .. 8 сконфигурированы на передачу. Запись 1 в бит MDn для mailbox-ов 23 .. 8 конфигурирует соответствующий mailbox на прием. Mailbox-ы 31 .. 24 всегда работают на передачу. Не записывайте в MDn, если mailbox разрешен (когда установлен соответствующий бит в регистре конфигурации MCn). Таким образом, перед изменением MDn соответствующий mailbox n должен быть запрещен.
После программного сброса биты CAN_MD1 и CAN_MD2 очищаются, кроме бит 7–0 в регистре CAN_MD1.
Биты 7–0 в CAN_MD1 и биты 15–8 в CAN_MD2 предназначены только для чтения.
Рис. 19-18. Mailbox Direction Register 1 (для всех бит 0: mailbox сконфигурирован на передачу, 1: mailbox сконфигурирован на прием).
Рис. 19-19. Mailbox Direction Register 2 (для всех бит 0: mailbox сконфигурирован на передачу, 1: mailbox сконфигурирован на прием).
[Логика приема]
Если сообщение принято по шине CAN, и внутренней логикой сравнения был определен подходящий mailbox, то содержимое принятого сообщения сохраняется в центр совпадения сообщения (matching message center). Полностью принятый идентификатор, бит RTR и соответствующий бит расширенного идентификатора (IDE) сохраняются в первые два слова mailbox-а назначения. Конфигурационный бит разрешения фильтрующей маски (acceptance mask enable, AME) этого mailbox не меняется. Если принято базовое сообщение, то расширенная часть идентификатора сообщения в mailbox также не изменится. Значение DLC и значение метки времени сохранятся в следующие 2 слова, и принятые данные сохранятся в словах 3 .. 0 этого mailbox. Полное содержимое временного буфера приема сохраняется в mailbox независимо от значения DLC в принятом сообщении. Только те байты данных, которые определены полем DLC, содержат достоверные данные, содержимое остальных данных mailbox будет неопределенным. См. рисунки 19-18 и 19-19 во врезке "Регистры CAN Mailbox Configuration (CAN_MCx) и Direction (CAN_MDx)".
Ниже на картинке показана логика приема сообщения в mailbox xx (значение xx это номер ящика, он может быть от 00 до 23).
Здесь XNOR операция исключающее ИЛИ-НЕ, AND операция И, OR операция ИЛИ. Таким образом, логика приема получается следующая:
- Если AME=0, то сообщение будет принято только в том случае, когда ID в принятом сообщении полностью совпадает с ID, запрограммированном в регистрах CAN_MBxx_ID1 и CAN_MBxx_ID0 (конечно, в зависимости от типа сообщения - со стандартным 11-битным ID или расширенным 29-битным).
- Если AME=1, то сообщение может быть принято также в том случае, если маска в регистрах CAN_AMxx_H и CAN_AMxx_L разрешает прием сообщения. Логика в этом случае следущая - если в маске бит равен 1, то этот бит в идентификаторе сообщения может быть любым (он не проверяется на строгое соответствие). Если же бит в маске равен 0, то для совпадения приема этот бит ID в сообщении должен точно совпадать со значением бита в регистрах CAM_MB_xxID1 и CAM_MB_xxID0.
После того, как сообщение было сохранено в mailbox, установится соответствующий бит ожидания обработки принятого сообщения (receive message pending, RMPn в регистре CAN_RMPx register), и будет сгенерировано прерывание приема mailbox (если это разрешено).
Acceptance Filter/Data Acceptance Filter. Каждый приходящий фрейм данных сравнивается со всеми идентификаторами, сохраненными в активных принимающих mailbox (MDn=1 и MCn=1), и со всех активных передающих mailbox, у которых разрешена функция обработки запроса передачи от дальнего узла сети (remote frame handling feature). Если acceptance filter нашел совпадающий идентификатор, содержимое данных принятого фрейма сохраняется в этот mailbox, и установится бит в регистре принятых сообщений, ожидающих обработки (receive message pending register, CAN_RMPx). Принятое сообщение сохраняется только один раз, даже если несколько принимающих mailbox имеют такой же совпадающий идентификатор. Чтобы изменить такое поведение по умолчанию и использовать ящики как надежный буфер приема, нужно установить биты OPSSxx (xx это номер ящика от 00 до 23) в регистрах CAN_OPSS1 и CAN_OPSS2. Если текущий идентификатор не совпадает ни с одним mailbox, то сообщение не сохранится. Бит RMPn должен быть сброшен в 0.
Если для этого mailbox было принято второе сообщение, и бит RMPn уже установлен, и бит защиты от перезаписи (overwrite protection, OPSSn) не установлен, то установится соответствующий бит потери сообщения (receive message lost, RMLn). Если бит OPSSn установлен, то проверяются следующие mailbox-ы.
Если разрешена acceptance mask, то каждый бит принятого идентификатора игнорируется логикой сравнения, если соответствующий бит в acceptance mask установлен в 1.
Таблица 19-11. Mailbox, используемый для фильтрации с помощью Acceptance Mask.
MCn
MDn
RFHn
Mailbox n
Комментарий
0
x
x
Игнорируется
Mailbox n запрещен.
1
0
0
Mailbox n разрешен, сконфигурирован на передачу. Обработка фреймов remote запрещена.
1
0
1
Используется
Mailbox n разрешен, сконфигурирован на передачу. Обработка фреймов remote разрешена.
1
1
x
Используется
Mailbox n разрешен, сконфигурирован на прием.
Использование acceptance mask можно индивидуально разрешить/запретить для каждого mailbox.
Обратите внимание, что регистры acceptance mask реализованы как RAM, и у них нет определенного значения после сброса. Поэтому каждая acceptance mask должна быть сброшена программно перед разрешением установкой бита AME соответствующего mailbox.
Регистры acceptance mask CAN_AMxxH и CAN_AMxxL используются для фильтрации сообщений по их идентификатору.
Рис. 19-20. Acceptance Mask Register (H). Адреса MMR-регистров см. в таблице 19-12.
Таблица 19-12. Адреса Mask Register (H).
Имя регистра
MMR-адрес
Имя регистра
MMR-адрес
CAN_AM00H
0xFFC0 2B04
CAN_AM16H
0xFFC0 2B84
CAN_AM01H
0xFFC0 2B0C
CAN_AM17H
0xFFC0 2B8C
CAN_AM02H
0xFFC0 2B14
CAN_AM18H
0xFFC0 2B94
CAN_AM03H
0xFFC0 2B1C
CAN_AM19H
0xFFC0 2B9C
CAN_AM04H
0xFFC0 2B24
CAN_AM20H
0xFFC0 2BA4
CAN_AM05H
0xFFC0 2B2C
CAN_AM21H
0xFFC0 2BAC
CAN_AM06H
0xFFC0 2B34
CAN_AM22H
0xFFC0 2BB4
CAN_AM07H
0xFFC0 2B3C
CAN_AM23H
0xFFC0 2BBC
CAN_AM08H
0xFFC0 2B44
CAN_AM24H
0xFFC0 2BC4
CAN_AM09H
0xFFC0 2B4C
CAN_AM25H
0xFFC0 2BCC
CAN_AM10H
0xFFC0 2B54
CAN_AM26H
0xFFC0 2BD4
CAN_AM11H
0xFFC0 2B5C
CAN_AM27H
0xFFC0 2BDC
CAN_AM12H
0xFFC0 2B64
CAN_AM28H
0xFFC0 2BE4
CAN_AM13H
0xFFC0 2B6C
CAN_AM29H
0xFFC0 2BEC
CAN_AM14H
0xFFC0 2B74
CAN_AM30H
0xFFC0 2BF4
CAN_AM15H
0xFFC0 2B7C
CAN_AM31H
0xFFC0 2BFC
Если разрешен режим DeviceNet (бит DNM=1 в регистре CAN_CONTROL), и mailbox настроен для фильтрации по полю данных, то фильтрация осуществляется по стандартному ID сообщения и по полю данных. Фильтрация по полю данных может быть запрограммирована либо только для первого байта, либо для первых двух байт, как показано в таблице 19-13.
Таблица 19-13. Фильтрация по полю данных.
FDF Фильтр по полю данных
FMD Полная маска поля данных
Описание
0
0
По полю данных фильтрация не разрешена.
0
1
Недопустимо, FMD должно быть равно 0, если FDF равно 0.
1
0
Фильтрация только по первому байту данных.
1
1
Фильтрация по первым двум байтам данных.
Рис. 19-21. Acceptance Mask Register (L). Адреса MMR-регистров см. в таблице 19-14.
Таблица 19-14. Адреса Mask Register (L).
Имя регистра
MMR-адрес
Имя регистра
MMR-адрес
CAN_AM00L
0xFFC0 2B00
CAN_AM16L
0xFFC0 2B80
CAN_AM01L
0xFFC0 2B08
CAN_AM17L
0xFFC0 2B88
CAN_AM02L
0xFFC0 2B10
CAN_AM18L
0xFFC0 2B90
CAN_AM03L
0xFFC0 2B18
CAN_AM19L
0xFFC0 2B98
CAN_AM04L
0xFFC0 2B20
CAN_AM20L
0xFFC0 2BA0
CAN_AM05L
0xFFC0 2B28
CAN_AM21L
0xFFC0 2BA8
CAN_AM06L
0xFFC0 2B30
CAN_AM22L
0xFFC0 2BB0
CAN_AM07L
0xFFC0 2B38
CAN_AM23L
0xFFC0 2BB8
CAN_AM08L
0xFFC0 2B40
CAN_AM24L
0xFFC0 2BC0
CAN_AM09L
0xFFC0 2B48
CAN_AM25L
0xFFC0 2BC8
CAN_AM10L
0xFFC0 2B50
CAN_AM26L
0xFFC0 2BD0
CAN_AM11L
0xFFC0 2B58
CAN_AM27L
0xFFC0 2BD8
CAN_AM12L
0xFFC0 2B60
CAN_AM28L
0xFFC0 2BE0
CAN_AM13L
0xFFC0 2B68
CAN_AM29L
0xFFC0 2BE8
CAN_AM14L
0xFFC0 2B70
CAN_AM30L
0xFFC0 2BF0
CAN_AM15L
0xFFC0 2B78
CAN_AM31L
0xFFC0 2BF8
На рисунках 19-20 и 19-21 показана карта бит регистров acceptance mask (CAN_AMxxH и CAN_AMxxL).
Acceptance-фильтрация выполняется, чтобы позволить группировать сообщения, которые сохраняются в центр сообщений.
Пришедшее сообщение сохраняется в mailbox с самым старшим номером, у которого совпал идентификатор. Если этот mailbox уже содержит не обработанные данные (RMPn=1 в регистре CAN_RMPx), то дальнейшее поведение зависит от содержимого соответствующего бита защиты от перезаписи (overwrite protection, OPSSn). Пришедший идентификатор сравнивается с сохраненным в RAM, и биты, которые не должны сравниваться, маскируются. Лог. 1 в acceptance mask означает, что не имеет значение, совпал этот бит идентификатора, или нет, и лог. 0 в acceptance mask означает, что требуется точное совпадение этого бита идентификатора. Биты маски базового идентификатора сохраняются в битах 12 .. 2 регистров acceptance mask (CAN_AMxxH), и биты расширенного идентификатора в битах 1, 0 регистра CAN_AMxxH и 15 .. 0 регистра CAN_AMxxL. Бит 13 регистра CAN_AMxxH является битом маски для бита расширенного идентификатора (acceptance mask identifier extension, AMIDE).
После сброса при включении питания пользователь должен инициализировать все биты acceptance mask. Область acceptance mask реализована как отдельная маска фильтрации для каждого mailbox, так что значение после сброса как для программного сброса, таки для сброса при включении питания будет неопределенным (для сброса после включения питания), либо не изменившимся (если это был программный сброс). Если acceptance mask разрешена (AME=1 соответствующего mailbox), то она должна быть инициализирована.
Содержимое регистра acceptance mask может быть изменено только если соответствующий mailbox запрещен.
Следующие секции описывают регистры управления приемом модуля CAN.
Биты в регистре принятых сообщений, ожидающих обработки (receive message pending, CAN_RMPx) может быть установлены только внутренней логикой модуля CAN. Бит RMPn показывает, что в mailbox n находится сообщение, ожидающее обработки. Очистка бит RMPn работает по принципу "записать единичку для сброса" (write-1-to-clear, W1C). Очистка бита RMPn также очистит соответствующий бит потерянного сообщения (receive message lost, RMLn) в регистре CAN_RMLx. Бит RMPn может установить бит прерывания mailbox (MBRIFn) в регистре флагов прерываний mailbox (CAN_MBRIFx), если установлен соответствующий бит маски прерываний MBIMn в регистре маски прерываний (CAN_MBIMx). Флаг MBRIFn инициирует прерывание mailbox.
Биты в регистре потерянных сообщений (CAN_RMLx) могут быть только сброшены устройством и могут быть установлены внутренней логикой. Эти биты можно очистить записью 1 в бит RMPn регистра CAN_RMPx. Запись в регистр CAN_RMLx не оказывает никакого эффекта.
Если установлен один или большее количество бит в регистре CAN_RMLx, то также установится бит состояния потерянного сообщения в глобальном регистре состояния прерываний (CAN_GIS). Если соответствующий бит разрешения прерываний в регистре CAN_GIM установлен, то также установится флаг потери принятого сообщения (RMLIF) в глобальном регистре флагов прерываний (CAN_GIF).
Рис. 19-24. Receive Message Lost Register 1.
Рис. 19-25. Receive Message Lost Register 2.
RMLxx - пользователь не успел обработать предыдущее записанное в этот ящик сообщение, старое сообщение было потеряно и перезаписано новым.
OPSSxx. Если для mailbox принято сообщение, и в этом mailbox все еще содержатся принятые, но не прочитанные данные (RMPn=1), то пользователь должен решить, как поступать с таким старым сообщением - должно ли оно быть перезаписано новым сообщением, или нет. Если соответствующий бит защиты от перезаписи сброшен (OPSSn=0), то установится бит потери принятого сообщения (RMLn), и ранее сохраненное сообщение будет перезаписано.
Если было принято сообщение для mailbox, и этот mailbox все еще содержит не прочитанные данные (RMPn=1, OPSSn=1), то проверяются следующие mailbox-ы на другое совпадение с идентификатором сообщения.
Смысл бит в регистре защиты от перезаписи / однократной передачи (CAN_OPSSx) зависит от конфигурации соответствующего mailbox. Если mailbox сконфигурирован как приемный, то содержимое OPSSn интерпретируется как бит защиты от перезаписи (OPSSn). Если mailbox сконфигурирован как передающий, то OPSSn интерпретируется как бит режима однократной передачи (single shot transmission mode, OPSSn). Эти биты могут быть изменены только процессором. После сброса по питанию или программного сброса все биты очищаются.
Если изменена конфигурация mailbox (изменен прием на передачу, или наоборот), то использование содержимого регистра CAN_OPSSx должно быть соответствующим образом адаптировано пользователем.
Содержимое бит CAN_OPSSx не должно изменяться, если разрешен соответствующий mailbox.
Защита от перезаписи не может использоваться, если разрешена автоматическая обработка remote frame. В этом случае содержимое mailbox всегда перезапишется пришедшим сообщением.
Ниже приведен пример настройки ящиков 0..7 на прием. Функция Init_CAN_RX_mailboxes настраивает ящики для работы с 11-битным идентификатором, маска идентификатора приема он передается в функцию через параметр rxIDmask.
// будем использовать их.// Запретим ящики 0-7, если они были разрешены:*pCAN_MC1 =0x0000;
// Настроим маску приема для 11-битных идентификаторов:for (boxnum =0; boxnum < 8; boxnum++)
{
// Установим маску приема:
pCAN_Ptr = (u16*)CAN_AM00H + (4* boxnum);
*pCAN_Ptr = msgIDrxmask <<2;
pCAN_Ptr = (u16*)CAN_AM00L + (4* boxnum);
*pCAN_Ptr =0;
// Разрешим использование маски приема:
pCAN_Ptr = (u16*)CAN_MB00_ID1 + (0x10* boxnum);
*pCAN_Ptr = AME;
// Разрешим защиту приема установкой бита OSS:
pCAN_Ptr = (u16*)CAN_OPSS1;
*pCAN_Ptr |= (1 << boxnum);
}
u32 Result;
while(1)
{
u32 ivg;
// Вариант настройки на текущий IVG://Result = adi_int_SICGetIVG(ADI_INT_CAN_RX, &ivg);// Вариант настройки на свободный IVG13:
Result = adi_int_SICSetIVG(ADI_INT_CAN_RX, ADI_INT_IVG_13);
if (ADI_INT_RESULT_SUCCESS != Result)
break;
// Вариант настройки на текущий IVG://Result = adi_int_CECHook(ivg, canRXhandler, NULL, FALSE);// Вариант настройки на свободный IVG13:
Result = adi_int_CECHook(ADI_INT_IVG_13, canRXhandler, NULL, FALSE);
if (ADI_INT_RESULT_SUCCESS != Result)
break;
Result = adi_int_SICEnable(ADI_INT_CAN_RX);
if (ADI_INT_RESULT_SUCCESS != Result)
break;
// Настройка разрешения прерываний приема на ящики 0-7:
pCAN_Ptr = (u16*)CAN_MBIM1;
for (boxnum =0; boxnum<8; boxnum++)
{
// Разрешим прерывания приема ящиков:*pCAN_Ptr |= (1<<boxnum);
}
break;
}
if (ADI_INT_RESULT_SUCCESS != Result)
{
umsg("Ошибка настройки прерывания CAN RX");
}
// Разрешим ящики 0-7:*pCAN_MC1 =0x00FF;
}
Здесь canRXhandler это обработчик прерывания приема CAN (пример кода обработчика прерывания приема см. далее).
[Логика передачи]
Передаваемые данные записываются в mailbox, сконфигурированный на передачу. После записи данных и идентификатора в RAM-область mailbox, сообщение отправится, если соответствующий бит запроса передачи установлен, и mailbox разрешен. Регистр управления передачей поделен на 2 регистра: регистр установки запроса передачи (CAN_TRSx) и регистр сброса запроса передачи (CAN_TRRx).
Если установлено более одного запроса на передачу (pending transmit request), объекты сообщения отправляются так, как определено логикой приоритета передачи.
Когда передача осуществлена успешно, соответствующие биты в регистре CAN_TRSx и регистре CAN_TRRx очищаются, и установится соответствующий бит в регистре подтверждения передачи.
Управляющие биты для установки или сброса запроса на передачу (TRS и TRR соответственно) можно записывать независимо.
Повторная передача (Retransmission). Обычно текущий объект сообщения отправляется повторно в случае потери арбитража или появления фрейма ошибки на линии шины CAN. Если в настоящий момент ожидают отправки больше одного объекта сообщения, то первым будет отправлен объект с самым высоким приоритетом. Приоритет определяется соответствующей логикой приоритетов. Оборванное в настоящий момент сообщение перезапустится после того, как будет отправлено сообщение с более высоким приоритетом.
Сообщение, которое находится в процессе подготовки, не заменяется другим сообщением, записанным в mailbox. Сообщение в процессе подготовки копируется во временный буфер передачи, когда устанавливается внутренний запрос на передачу для модуля ядра CAN. Сообщение не заменяется, пока не будет успешно отправлено, пока потерян арбитраж на шине CAN, или на шине CAN появился фрейм ошибки.
Однократная передача (Single Shot Transmission). Если используется функция однократной передачи (OPSSn=1), то бит запроса на передачу (TRSn) в регистре CAN_TRSx очистится после того, как сообщение успешно отправлено. Бит TRSn также очищается, если передача оборвана из-за потери арбитража или появления фрейма ошибки на шине CAN. Таким образом, передача этого сообщения не будет повторена в случае потери арбитража или ошибки на шине CAN.
После успешной передачи установится соответствующий бит TAn в регистре CAN_TAx, и после обрыва передачи установится соответствующий бит AAn.
Приоритет передач на основе номера mailbox. Если находятся в ожидании больше одного запроса на передачу, то последовательность передачи начнется с самого старшего по номеру, разрешенного на передачу mailbox, продолжаясь на более низких по номеру, разрешенных на передачу mailbox. Указатель на следующее ожидающее передачи сообщение генерируется из содержимого регистров CAN_TRSx, CAN_TRRx, CAN_MDx и CAN_MCx. Этот указатель доступен через 1 цикл после изменения одного из этих регистров. Таким образом, новый указатель быстро генерируется перед тем, как содержимое отправляемого сообщения копируется во временный буфер передачи. Это обычно происходит во время области перерыва (intermission field) сообщения CAN. После генерации этого указателя все следующие изменения в области mailbox игнорируются до следующего события генерации указателя.
[Регистры управления передачей]
Если есть сообщение для отправки, то сначала должен быть сконфигурирован соответствующий mailbox как передающий. После того, как данные сохранены в этот mailbox, может быть инициирована передача путем установки соответствующего бита в регистре установки запроса передачи (CAN_TRSx). Запрошенная передача может быть оборвана соответствующим битом в регистре сброса запроса передачи (CAN_TRRx).
Биты в регистре CAN_TRSx могут быть установлены CPU и сброшены / установлены внутренней логикой модуля CAN. Биты CAN_TRSx устанавливаются записью 1. Запись 0 не дает эффекта. Они устанавливаются модулем CAN в случае поступления запроса remote frame (или в режиме auto-transmit). Это возможно только для mailbox-ов приема/передачи, если разрешена функция автоматической обработки remote frame (RFHn=1). Если TRSn=1, то доступ на запись в соответствующий доступ отклоняется (но не блокируется), и сообщение n передается. Несколько бит CAN_TRSx могут быть установлены одновременно, и сброшены либо после успешной передачи, либо после оборванной.
После сброса при включении питания или программного сброса все биты CAN_TRSx очищаются. Биты CAN_TRSx реализованы только для передающих mailbox и стандартных mailbox. Значение TRSn для принимающих mailbox всегда читается как 0.
Доступ на запись в mailbox возможен, даже если установлен соответствующий бит TRSn. Однако изменение данных в таком mailbox может привести к неопределенным передаваемым данным.
Установка TRSn, когда соответствующий mailbox запрещен (MCn=0) может привести к ошибочному поведению.
Неожиданное поведение также может произойти, если mailbox запрещается перед тем, как соответствующий бит TRSn сбросится внутренней логикой.
Перед установкой TRSn соответствующий mailbox должен содержать достоверные передаваемые данные.
Биты в регистрах CAN_TRRx могут быть только установлены устройством, и сброшены внутренней логикой. Биты CAN_TRR устанавливаются записью 1. Запись 0 не дает эффекта. После сброса по включению питания или программного сброса все биты очищаются.
Если бит TRRn установлен, то доступ на запись в соответствующий mailbox отклоняется, но не блокируется. Если бит TRRn установлен, и в настоящий момент пока не обрабатывается передача, которая была инициирована битом TRSn, то соответствующий запрос на передачу немедленно отменяется. Если соответствующее сообщение в настоящий момент обрабатывается, биты CAN_TRSx и CAN_TRRx остаются установленными до тех пор, пока передача не оборвется или не будет успешно завершена. Бит подтверждения обрыва (abort acknowledge, AAn), или бит подтверждения передачи (transmit acknowledge, TAn) не будет установлен, пока не произойдет следующее:
• Успешная передача. • Abort из-за потери арбитража. • Обнаружение появления ошибки на шине CAN.
Если передача была успешная, то установится бит подтверждения передачи (TAn). Если передача была оборвана, то установится соответствующий бит подтверждения обрыва (AAn). В обоих случаях сбросятся TRSn и TRRn.
Состояние бит TRR может быть прочитано из бит CAN_TRSx. Если CAN_TRSx установлен, и осуществляется передача, то CAN_TRRx можно сбросить только действиями, описанными выше. Если бит CAN_TRSx сброшен, и бит CAN_TRRx установлен, то это не дает эффекта, поскольку бит CAN_TRRx немедленно сбросится внутренней логикой.
После сброса при включении питания или программного сброса все биты в CAN_TRRx очищаются. Биты CAN_TRRx реализованы только для передающих mailbox и стандартных mailbox. Значение TRRn для приемного mailbox всегда читается как 0.
Бит TRRn не должен устанавливаться, если запрещен соответствующий mailbox (MCn=0).
Бит TRRn не должен устанавливаться, если соответствующий бит TRSn не установлен.
Обрабатываемое в настоящий момент сообщение продолжит передаваться, если соответствующие биты TRSn и TRRn установлены, потому что abort запрошен пользователем. Текущая операция передачи завершается, если установится бит TAn регистра CAN_TAx, или установится бит AAn регистра CAN_AAx.
Передача сообщения немедленно обрывается, если соответствующий mailbox временно запрещен, и установлен бит TRRn для этого сообщения (TRSn и TRRn сбрасываются, AAn устанавливается).
Регистр подтверждения обрыва (abort acknowledge, CAN_AAx) показывает, что была ли оборвана передача. Если передача сообщения в mailbox n была оборвана, то установится бит AAn. Очистка бит AAn работает по принципу "записать 1, чтобы сбросить" (write-1-to-clear, W1C). Запись 0 не оказывает эффекта. Бит подтверждения обрыва сбрасывается AAn, если бит TRSn снова устанавливается. Если mailbox запрещен (сброшен MCn), соответствующий бит AAn в регистре CAN_AAx установлен, то этот бит остается установленным. Бит AAn можно очистить только записью в него 1.
Установка бита в CAN_AAx установит флаг (AAIS) в глобальном регистре состояния прерываний (CAN_GIS). Если бит маски прерываний AAIM установлен (AAIM=1 означает, что прерывание разрешено), то также установится соответствующий бит в глобальном регистре флагов прерываний (CAN_GIF), и будет выставлено глобальное прерывание.
После сброса при включении питания или программного сброса все биты CAN_AAx очищаются.
Рис. 19-32. Abort Acknowledge Register 1 (все биты типа W1C).
Рис. 19-33. Abort Acknowledge Register 2 (все биты типа W1C).
Бит AAn не сбрасывается, если соответствующий бит TRSn установлен внутренней логикой. Бит AAn сбрасывается только если установлен бит TRSn.
Регистр подтверждения передачи (transmission acknowledge, CAN_TAx) показывает, завершилась ли успешно передача. Если сообщение в mailbox n было успешно отправлено, то установится бит подтверждения передачи (TAn). Биты TAn очищаются по принципу "записать 1, чтобы сбросить" (write-1-to-clear, W1C). Запись 0 не дает эффекта. Бит TAn также сбрасывается, если TRSn снова установится. Если mailbox запрещен (MCn сброшен) и установлен соответствующий бит в регистре CAN_TAx, то этот бит остается установленным. Бит TAn можно очистить только записью в него 1.
Установка бита в CAN_TA установит флаг прерывания передачи mailbox (MBTIFn), если установлен соответствующий бит маски прерывания (MBIMn в регистре CAN_MBIMx). MBIMn=1 означает, что прерывание разрешено.
После сброса при включении питания или программного сброса все биты CAN_TAx очищаются.
Рис. 19-34. Transmission Acknowledge Register 1 (все биты типа W1C).
Рис. 19-35. Transmission Acknowledge Register 2 (все биты типа W1C).
Бит TAn не сбрасывается, если соответствующий бит TRSn установлен внутренней логикой. Бит TAn сбрасывается только если установлен бит TRSn, или записью 1 в соответствующую позицию бита.
Может использоваться функция временного запрета mailbox путем программирования регистра временного запрета mailbox (CAN_MBTD). Если mailbox разрешен, и сконфигурирован на передачу, то доступ на запись в его поля данных отклоняется. Если этот mailbox используется для автоматической обработки remote frame, то поле данных должно быть обновлено без потери входящего фрейма remote request и без отправки противоречивых данных.
Указатель на запрашиваемый mailbox должен быть записан в биты 4 .. 0 регистра CAN_MBTD, и должен быть установлен бит TDR этого mailbox. Соответствующий флаг TDA mailbox установится внутренней логикой.
Если mailbox сконфигурирован на передачу (MDn=0), и флаг TDA устанавливается машиной конечных состояний (FSM), то содержимое поле данных этого mailbox может быть обновлено. Если поступил входящий фрейм remote-запроса, когда этот mailbox временно запрещен, то соответствующий бит TRSn установится FSM и DLC входящего сообщения запишется в соответствующий mailbox. Однако сообщение не будет отправлено, пока запрос временно запрета не будет сброшен.
Если mailbox сконфигурирован на прием (MDn=1), то флаг TDA устанавливается FSM, и mailbox в настоящий момент не обрабатывается. Если есть входящее сообщение для запрошенного mailbox n (номер mailbox n идентичен номеру временно запрещенного mailbox), то внутренняя логика ждет завершения приема, или появления ошибки шины CAN, или пока установлен флаг TDA. Если флаг TDA установлен, то mailbox может быть полностью запрещен (MCn=0) без риска потери входящего фрейма. Запрос временного запрета (TDR) должен быть сброшен при первой возможности.
Если флаг TDA для mailbox установлен внутренней логикой, то можно обновлять только поля данных в этом mailbox (последние 8 байт mailbox). Доступ к управляющим битам и идентификатору отклоняется.
Временно запрещенный mailbox игнорируется для передачи, пока установлен соответствующий бит запроса.
Рис. 19-36. Temporary Mailbox Disable Register.
Зарезервированные биты в регистре CAN_MBTD всегда читаются как 0. Когда происходит запись в регистр CAN_MBTD, всегда записывайте эти биты как 0.
Автоматическая обработка фреймов remote может быть разрешена/запрещена установкой/сбросом соответствующего бита в регистрах обработки remote frame (CAN_RFHx).
Фреймы remote это фреймы данных без поля данных и с установленным битом RTR. Поле длины данных этого фрейма равно DLC соответствующего фрейма remote. DLC может быть запрограммировано значениями в диапазоне 0 .. 15. Значение DLC, большее 8, обрабатывается так же, как значение 8. Фрейм remote содержит:
• Биты идентификатора. • Биты управления (т. е. код длины данных). • Бит запроса remote-передачи (RTR).
Фреймы remote могут обрабатывать только те mailbox-ы, которые могут быть и передающими, и приемными (стандартные mailbox-ы с номерами 8 .. 23).
Все центры сообщения могут принимать и передавать запросы запросы фрейма remote. Они могут автоматически отправлять запрос фрейма remote другому узлу и отвечать на входящие запросы remote.
Обратите внимание, что mailbox разрешается только для передачи или приема, если установлен его бит MCn в регистре конфигурации mailbox. Запрещенный mailbox не передает и не принимает никаких сообщений.
Рис. 19-37. Remote Frame Handling Register 1.
Рис. 19-38. Remote Frame Handling Register 2.
Доступ на запись в бит RFHn отклоняется (но не блокируется), если разрешен соответствующий mailbox n. Устройство может только читать и записывать регистр CAN_RFHx. Если бит RFHn установлен, то функция автоматической обработки фрейма remote разрешена для соответствующего mailbox.
После сброса при включении питания или программного сброса все биты очищаются.
Может произойти ошибочное поведение, когда бит RFHn изменяется, и в настоящее время обрабатывается соответствующий mailbox.
Длина фрейма данных определяется полем DLC соответствующего фрейма remote. Если принят фрейм remote, то DLC соответствующего mailbox перезаписывается принятым значением.
Ниже показан пример настройки передающих ящиков 24..31. Функция Init_CAN_TX_mailboxes настраивает ящики для работы с 11-битным идентификатором, он передается в неё через параметр msgIDtx.
// будем использовать их:
s16 boxnum;
for (boxnum =24; boxnum<32; boxnum++)
{
pCAN_Ptr = (unsignedshort*)CAN_MB00_DATA0 + (0x10* boxnum);
*(pCAN_Ptr +8) =8; // запись 8 в LENGTH*(pCAN_Ptr +10) =0; // запись 0 в TIMESTAMP*(pCAN_Ptr +12) =0; // запись 0 в ID0*(pCAN_Ptr +14) = (msgIDtx <<2);// запись msgID в ID1
}
// Разрешим ящики 24-31:*pCAN_MC2 =0xFF00;
}
После вызова этой функции ящики 24..31 полностью готовы к работе на передачу. Как осуществлять передачу, показано в примере кода врезки "Регистры CAN Mailbox Data (CAN_MBxx_DATAx)".
[Прерывания CAN]
Модуль CAN предоставляет 3 независимых прерывания: два прерывания mailbox (прерывание приема mailbox MBRIRQ и прерывание передачи mailbox MBTIRQ), и глобальное прерывание GIRQ. Значения этих трех прерываний также может быть прочитано в регистрах состояния прерываний.
Регистр прерываний CAN (CAN_INTR) хранит информацию о прерываниях CAN.
Бит состояния прерывания устанавливается, пока активна линия вывода прерывания. Все биты CAN_INTR предназначены только для чтения (read only, RO). Доступ на запись в этот регистр не дает эффекта (исключение: состояние пробуждения wake up, если был произведен вход в sleep mode). После сброса при включении питания или программного сброса все прерывания очищаются.
Зарезервированные биты регистра CAN_INTR всегда читаются как 0. Когда этот регистр записывается, всегда записывайте эти биты как 0.
С целью теста значения бит входа (CANRX) и выхода (CANTX) могут быть также прочитаны. Эти два бита показывают текущее состояние выводов CANRX и CANTX соответственно, в тот момент, когда этот регистр был прочитан.
Рис. 19-39. CAN Interrupt Register.
Биты регистра CAN_INTR:
• Serial Input From CAN Bus Line From Transceiver (CANRX).
Этот бит только для чтения.
1: текущее значение на шине CAN рецессивное. 0: текущее значение на шине CAN доминантное.
• Serial Output to CAN Bus Line to Transceiver (CANTX).
Этот бит только для чтения.
1: вывод на шину CAN рецессивный. 0: вывод на шину CAN доминантный.
• Global Interrupt Output (GIRQ).
1: установлен как минимум один флаг глобального прерывания в регистре CAN_GIF. 0: не установлен ни один из флагов регистра глобального прерывания.
• Sleep Mode Acknowledge (SMACK).
1: модуль CAN находится в состоянии пониженного потребления энергии (режим сна, sleep mode). 0: режим сна не активен.
• Mailbox Transmit Interrupt Output (MBTIRQ).
1: установлен как минимум один флаг прерывания передачи в регистре флагов прерывания передачи CAN_MBTIFx. 0: в регистре флагов прерывания передачи CAN_MBTIFx ни один флаг не установлен.
• Mailbox Receive Interrupt Output (MBRIRQ).
1: установлен как минимум один флаг прерывания приема в регистре флагов прерывания приема CAN_MBRIFx. 0: в регистре флагов прерывания приема CAN_MBRIFx ни один флаг не установлен.
[Прерывания mailbox]
Каждый из 32 mailbox-ов модуля CAN может генерировать прерывание как результат одного из двух прерываний mailbox. Эти прерывания могут быть прерываниями приема или передачи, в зависимости от конфигурации mailbox.
Флаг прерывания передачи (MBTIFn) или приема (MBRIFn) mailbox может быть установлен только если установлен соответствующий бит MBIMn в регистре маски прерываний mailbox (CAN_MBIMx).
Если mailbox сконфигурирован как приемный, то устанавливается соответствующий флаг прерывания (MBRIFn) после того, как принятое сообщение сохранено в mailbox n. Если используется функция автоматической обработки фрейма remote, то флаг прерывания приема установится после того, как запрошенный фрейм данных сохранен в mailbox. Прерывание приема mailbox (MBRIFn) всегда выставляется, если новое принятое сообщение записано в mailbox n, и установлен бит MBIMn.
Если mailbox сконфигурирован как передающий, то устанавливается соответствующий флаг прерывания передачи (MBTIFn) после того, как сообщение в mailbox n корректно отправлено. Если используется функция автоматической обработки фрейма remote, то флаг прерывания передачи установится после того, как запрошенный фрейм данных будет отправлен из этого mailbox.
Регистры маски прерываний mailbox (CAN_MBIMx) управляют тем, будет или нет установлен флаг прерывания mailbox. Для каждого mailbox имеется 1 флаг прерывания. Это может быть прерывание приема или передачи, в зависимости от настройки регистра конфигурации. Если бит MBIMn равен 1, то прерывание генерируется, если сообщение было успешно отправлено (для передающего mailbox) или сообщение было принято без ошибок (для приемного mailbox). После сброса при включении питания или после программного сброса все биты маски прерываний очищаются, и все прерывания оказываются запрещены.
Флаг прерываний передачи (MBTIFn) в регистре прерываний передачи mailbox (CAN_MBTIFx) установится, если сообщение было корректно отправлено из mailbox, установлен соответствующий бит MBIMn, и mailbox сконфигурирован как передающий. Если mailbox сконфигурирован как приемный (MDn=1), или если mailbox запрещен (MCn=0), то соответствующий бит в регистре флагов прерывания передачи (MBTIFn) останется установленным.
Бит MBTIFn можно сбросить записью 1 (операция W1C) в соответствующую позицию бита. Запись 0 не дает эффекта. Бит MBTIFn также сбрасывается, если сбрасывается бит конфигурации mailbox (MCn) в регистре CAN_MCx, или сбрасывается соответствующий бит в регистре маски прерываний mailbox (CAN_MBIMx).
Выход прерывания передачи mailbox (MBTIRQ) активен, пока установлен как минимум один бит в регистре CAN_MBTIFx.
Если бит направления mailbox (MDn) изменяется после того, как установился соответствующий бит MBTIFn, то значение бита MBTIFn сбрасывается, и установится соответствующий бит MBRIFn в регистре CAN_MBRIFx.
Рис. 19-42. Mailbox Transmit Interrupt Flag Register 1.
Рис. 19-43. Mailbox Transmit Interrupt Flag Register 2.
Бит флага прерывания приема (MBRIFn) в регистре флагов прерывания приема mailbox (CAN_MBRIFx) установится, если сообщение корректно принято и сохранено в mailbox n, установлен соответствующий бит MBIMn, и mailbox сконфигурирован как принимающий. Если mailbox сконфигурирован как передающий(MDn=0), или mailbox запрещен (MCn=0), то бит MBRIFn в регистре флагов прерывания приема mailbox остается установленным.
Флаг прерывания приема (MBRIFn) может быть сброшен записью 1 (операция W1C) в соответствующую позицию бита. Запись 0 не дает эффекта. Бит MBRIFn также сбрасывается, если сброшен бит MCn в регистре конфигурации mailbox (CAN_MCx), или если сброшен соответствующий бит MBIMn в регистре маски прерываний mailbox.
Выход прерывания приема mailbox (MBRIRQ) остается активным, пока установлен как минимум один бит в регистре CAN_MBRIFx.
Если направление mailbox (MDn) изменено после того, как установлен бит MBRIFn, значение MBRIFn сбрасывается и соответствующий бит MBTIFn устанавливается.
Рис. 19-44. Mailbox Receive Interrupt Flag Register 1.
Рис. 19-45. Mailbox Receive Interrupt Flag Register 2.
Ниже приведен пример кода обработчика прерывания приема для mailbox 0..7. Осуществляется прием сообщений со стандартным 11-битным идентфикатором.
typedefunion
{
u16 d16;
u8 d8[2];
}TCanDataSwap;
typedefstruct
{
u16 id;
u8 data[8];
}TCanPacket;
#define CANRXBUFSIZE 8
#define CANRXBUFMASK (CANRXBUFSIZE-1)
// Кольцевой буфер приема:
TCanPacket canrxbuf[CANRXBUFSIZE];
// Индексы кольцевого буфера:
u8 canInIdx, canOutIdx;
// Обработчик прерывания приема для ящиков MB00..MB07. Принятые данные
// записываются в кольцевой буфер canrxbuf.
staticADI_INT_HANDLER (canRXhandler)
{
// Переменная для флагов, показывающая, в каком// ящике лежит принятое сообщение:
u16 flags;
// Указатель на данные ящика:volatile u16 *pCAN_Ptr;
// Указатель на данные полезной нагрузки в кольцевом
// буфере (место сохранения 8 байт принятых данных):
u8 *pData;
// Структура для перестановки байт:
TCanDataSwap tmp;
flags =*pCAN_MBRIF1;
if (flags)
{
// Обработка mailbox приема. В каком mailbox лежит сообщение?
u16 boxnum;
u16 flagmask;
for (boxnum=0; boxnum < 8; boxnum++)
{
flagmask =1 << boxnum;
if (flags & flagmask)
{
// В этом mailbox что-то есть. Сохраним идентификатор// принятого сообщения:
pCAN_Ptr = (u16*)CAN_MB00_ID1 + (0x10 * boxnum);
canrxbuf[canInIdx].id = (*pCAN_Ptr >>2) &0x7FF;
// Сохраним данные принятого сообщения:
pCAN_Ptr = (u16*)CAN_MB00_DATA0 + (0x10* boxnum);
pData = canrxbuf[canInIdx].data;
tmp.d16 =*(pCAN_Ptr +6);
*pData++= tmp.d8[1];
*pData++= tmp.d8[0];
tmp.d16 =*(pCAN_Ptr +4);
*pData++= tmp.d8[1];
*pData++= tmp.d8[0];
tmp.d16 =*(pCAN_Ptr +2);
*pData++= tmp.d8[1];
*pData++= tmp.d8[0];
tmp.d16 =*(pCAN_Ptr +0);
*pData++= tmp.d8[1];
*pData++= tmp.d8[0];
canInIdx++;
canInIdx &= CANRXBUFMASK;
*pCAN_MBRIF1 = flagmask;
*pCAN_RMP1 = flagmask;
}
}
}
// Остальные ящики нас не интересуют:
flags =*pCAN_MBRIF2;
if (flags)
{
*pCAN_MBRIF2 = flags;
*pCAN_RMP2 = flags;
}
return(ADI_INT_RESULT_PROCESSED);
}
[Глобальное прерывание]
В дополнение к прерываниям от mailbox-ов модуль CAN предоставляет глобальное прерывание. Есть несколько событий прерывания, которые могут активировать это глобальное прерывание. Глобальное прерывание генерируется, если происходит изменение некоторых бит состояния модуля контроллера CAN. Каждый источник прерывания можно маскировать по отдельности. Все биты в регистрах состояния прерывания и флагов прерывания остаются установленными, пока они не очищены программой, или пока не произойдет программный сброс.
Внутри кода ISR защелка прерывания должна быть очищена операцией W1C для соответствующего бита регистра CAN_GIS. Это очистит связанный бит в обоих регистрах CAN_GIS и CAN_GIF.
Источники прерывания следующие:
• Прерывание запрета доступа (Access Denied Interrupt ADIM, ADIS, ADIF).
1: произошел как минимум один доступ к mailbox RAM, когда данные обновляются внутренней логикой. 0: все доступы в mailbox RAM допустимы.
Было переполнение универсального счетчика (в режиме метки времени time stamp или в режиме счетчика событий event counter), или счетчик достиг значения 0x0000 (в режиме сторожевого таймера, watchdog mode).
1: был превышен универсальный счетчик. 0: универсальный счетчик не был превышен.
• Receive Message Lost Interrupt (RMLIM, RMLIS, RMLIF).
Было принято сообщение для mailbox, который уже содержит не прочитанные данные. Установлен как минимум один бит в регистре потерянных сообщений (CAN_RMLx). Если бит в CAN_GIS (и CAN_GIF) сброшен, и есть как минимум один все еще установленный бит в CAN_RML, то бит в CAN_GIS (и CAN_GIF) снова установится. Внутренний сигнал источника прерывания активен только если установлен новый бит в CAN_RML.
1: как минимум одно сообщение было потеряно. 0: не было событий потерянных сообщений.
• Abort Acknowledge Interrupt (AAIM, AAIS, AAIF).
Был успешный обрыв запрошенной передачи. Был установлен как минимум один бит в регистрах CAN_AAx. Если бит в CAN_GIS (и CAN_GIF) сброшен, и как минимум один бит в CAN_AAx все еще установлен, то бит CAN_GIS (и CAN_GIF) установится снова. Внутренний сигнал источника прерывания активен только если установлен новый бит в CAN_AAx.
1: как минимум один запрос передачи был успешно оборван. 0: не было оборванных передач.
• Access to Unimplemented Address Interrupt (UIAIM, UIAIS, UIAIF).
Был доступ CPU по адресу, который не реализован в модуле контроллера.
1: обнаружен доступ по не реализованному адресу. 0: не было обнаружен доступ к не реализованному адресу.
• Wake-up Interrupt (WUIM, WUIS, WUIF).
1: модуль CAN вышел из sleep mode, потому что была обнаружена активность на шине CAN. 0: событие пробуждения не активно.
• Bus-Off Interrupt (BOIM, BOIS, BOIF).
Модуль CAN вошел в состояние отключения от шины (bus-off). Этот источник прерывания активен, если состояние ядра CAN меняется от нормального функционирования в режим bus-off. Если бит в CAN_GIS (и CAN_GIF) сбрасывается, и режим bus-off все еще активен, то этот бит установится заново. Если модуль вышел из режима bus-off, бит в CAN_GIS (и CAN_GIF) остается установленным.
1: модуль CAN вошел в режим bus-off. 0: модуль CAN не вошел в режим bus-off.
• Error-Passive Interrupt (EPIM, EPIS, EPIF).
Модуль CAN вошел в состояние пассивной ошибки (error-passive). Этот источник прерывания активен, если состояние модуля CAN меняется от режима error-active на режим error-passive. Если бит в CAN_GIS (и CAN_GIF) сбрасывается, и режим error-passive все еще активен, то этот бит не установится снова. Если модуль покидает состояние режима error-passive, то бит в CAN_GIS (и CAN_GIF) останется установленным.
1: модуль CAN в режиме error-passive. 0: модуль CAN не вошел в режим error-passive.
Счетчик ошибок приема CAN (RXECNT) достиг предела предупреждения (warning limit). Если бит в CAN_GIS (и CAN_GIF) сбрасывается, и режим предупреждения об ошибках все еще активен, то этот бит не установится снова. Если модуль покинет режим error warning, то бит в CAN_GIS (и CAN_GIF) останется установленным.
1: был превышен уровень предупреждения для счетчика ошибок приема CAN. 0: не был превышен уровень предупреждения для счетчика ошибок приема CAN.
Счетчик ошибок передачи CAN (TXECNT) достиг предела предупреждения (warning limit). Если бит в CAN_GIS (и CAN_GIF) сброшен, и режим предупреждения об ошибке все еще активен, то этот бит не установится снова. Если модуль покинет режим предупреждения об ошибках, то бит CAN_GIS (и CAN_GIF) останется установленным. После программного сброса все биты в CAN_GIF, CAN_GIS и CAN_GIM очищаются.
1: был превышен уровень предупреждения для счетчика ошибок передачи CAN. 0: не был превышен уровень предупреждения для счетчика ошибок передачи CAN.
Логика глобального прерывания. Логика реализована с тремя регистрами:
• Регистр маски глобальных прерываний (CAN_GIM), где каждый источник прерывания можно разрешить или запретить по отдельности. • Регистр состояния глобальных прерываний (CAN_GIS). • Регистр флагов глобальных прерываний (CAN_GIF).
Биты маски прерываний влияют только на содержимое регистра флагов прерываний (CAN_GIF). Биты состояния прерываний в регистре CAN_GIS всегда установятся, если произойдет соответствующее событие прерывания, независимо от битов маски. Таким образом, биты состояния можно использовать для опроса наличия событий прерывания (без непосредственного возникновения прерываний). Прерывание в регистре глобального состояния прерываний будет выставлено только в том случае, если установится бит в регистре флагов CAN_GIF. Глобальное прерывание остается активным, пока установлен как минимум один бит в регистре флагов прерываний CAN_GIF.
Каждый источник для глобального состояния прерываний (GIRQ) может быть индивидуально разрешен или запрещен с помощью регистра глобальной маски прерываний (CAN_GIM). Если бит в регистре CAN_GIM установлен, то соответствующий источник прерывания для GIRQ разрешен. Старшие биты (15 .. 11) не реализованы, и всегда читаются как 0. После сброса при включении питания или программного сброса все биты очищаются, поэтому все прерывания глобального состояния запрещены.
Если произойдет событие глобального прерывания, то установится соответствующий бит в регистре состояния глобальных прерываний (CAN_GIS), независимо от содержимого регистра глобальной маски прерываний (CAN_GIM). Если бит в регистре CAN_GIS очищен, и соответствующее событие прерывания остается активным, то этот бит не установится снова. Если бит в CAN_GIS очищен, то соответствующий бит в CAN_GIF также очищается (если он был ранее установлен).
Бит в регистре CAN_GIS может быть очищен записью 1 (операция W1C) в соответствующую позицию бита. Запись 0 не дает эффекта. Старшие биты (15 .. 11) не реализованы, и всегда читаются как 0. После сброса при включении питания или программного сброса все биты очищаются.
Рис. 19-47. Global Interrupt Status Register (все биты типа W1C).
Если произойдет событие глобального прерывания, то соответствующий бит в регистре флагов глобальных прерываний (CAN_GIF) установится только в том случае, если также установлен соответствующий бит в регистре маски глобальных прерываний (CAN_GIM). Если бит в регистре CAN_GIF очищен, и соответствующее событие прерывания все еще активно, то этот бит не установится заново.
Если установлен как минимум один бит в регистре флагов глобальных прерываний, то прерывание остается активным. Прерывание остается активным до тех пор, пока не будут очищены все биты в CAN_GIF.
Биты флагов прерывания в CAN_GIF можно очистить по отдельности записью 1 (операция W1C) в соответствующую позицию бита в регистре состояния глобальных прерываний (CAN_GIS). Доступ на запись в CAN_GIF не дает никакого эффекта. Старшие биты (15 .. 11) не реализованы, и всегда читаются как 0. После сброса при включении питания или программного сброса все биты очищаются.
Если источник прерывания активен, и соответствующий бит в регистре CAN_GIF все еще установлен, то этот бит останется не измененным. Если бит в регистре CAN_GIF установлен, и затем установится другой бит в регистре CAN_GIF, то прерывание останется активным (установлен только новый бит в CAN_GIF). Если бит в регистре CAN_GIF сброшен, и затем другой бит в регистре CAN_GIF все еще остается установленным, то прерывание остается активным.
Если бит состояния прерываний в регистре CAN_GIF установлен, и соответствующий бит маски прерываний в регистре CAN_GIM установлен/сброшен после того, как установлен бит состояния прерывания, то бит флага прерывания в регистре CAN_GIF также установится/сбросится. Если больше не установится другой бит в регистре CAN_GIF, то выход активации прерывания (GIRQ) ведет себя в соответствии с запрограммированным состоянием регистра маски CAN_GIM.
Рис. 19-48. Global Interrupt Flag Register.
[Модуль универсального счетчика]
Универсальный 16-битный счетчик работает с той же самой частотой, что и частота бит ядра модуля CAN. Этот счетчик тактируется с теми же параметрами, которые используются для прескалера bit rate (BRP, TSEG1 и TSEG2).
Универсальный счетчик может быть использован в некоторых режимах, определенных значениями в регистре CAN_UCCNF. Это режимы метки времени (time stamp mode), сторожевого таймера (watchdog mode), автоматической передачи (auto transmit mode) и счетчика событий (event counter mode).
Time Stamp Mode. Чтобы получить индикацию времени приема или времени передачи каждого сообщения, значение 16-битного непрерывно работающего счетчика (CAN_UCCNT) записывается в регистр CAN_MBxx_TIMESTAMP соответствующего mailbox, когда принятое сообщение сохранено, или когда передано.
Значение метки времени захватывается в точке появления бита начала фрейма (start of frame, SOF) каждого приходящего или исходящего сообщения. Впоследствии это значение метки времени копируется в регистр CAN_MBxx_TIMESTAMP соответствующего mailbox.
Если mailbox сконфигурирован для автоматической обработки фрейма remote, то значение метки времени записывается для передачи фрейма данных (когда mailbox сконфигурирован как передающий) или для приема запрошенного фрейма данных (когда mailbox сконфигурирован как принимающий).
Счетчик может быть очищен или запрещен записью в регистр CAN_UCCNF. Счетчик также может быть загружен значением путем записи в сам регистр счетчика (CAN_UCCNT).
Также можно очистить счетчик (CAN_UCCNT) путем приема сообщения в mailbox 4 (синхронизация всех счетчиков метки времени в системе). Это осуществляется путем установки бита UCCT в регистре CAN_UCCNT.
Переполнение счетчика установит бит UCEIS в регистре состояния глобальных прерываний CAN_GIS. Опционально в этот момент может произойти глобальное прерывание путем демаскирования бита в маске глобальных прерываний (бит UCEIM в регистре CAN_GIM). Если источник прерывания демаскирован, то также установится бит в регистре флагов глобальных прерываний (UCEIF в регистре CAN_GIF).
Watchdog Mode. Режим сторожевого таймера (Watchdog Mode) используется, чтобы гарантировать периодический прием сообщений. При входе в режим watchdog счетчик CAN_UCCNT загружается определенным значением, содержащимся в регистре перезагрузки/захвата универсального счетчика CAN (CAN_UCRC). Этот счетчик тогда декрементируется с частотой следования бит CAN. Если бит UCCT в регистре CAN_UCCNT установлен, и принято сообщение в mailbox 4 до того, как счетчик досчитает вниз до 0, то счетчик перезагрузится содержимым регистра CAN_UCRC. Если счетчик досчитал до 0 без приема сообщения в mailbox 4, то установится бит UCEIS в регистре состояния глобальных прерываний (CAN_GIS), и счетчик также автоматически перезагрузится содержимым регистра CAN_UCRC. Если в этот момент нужно возникновение прерываний, должен быть установлен бит маски прерывания UCEIM в регистре CAN_GIM. При установленном бите маски, когда возникнет прерывание watchdog, также установится бит UCEIF в регистре CAN_GIF.
Счетчик может быть перезагружен содержимым регистра CAN_UCRC, или запрещен записью в регистр CAN_UCCNF.
Период времени, через который произойдет прерывание watchdog, управляется значением, записанным пользователем в регистр CAN_UCRC.
Auto Transmit Mode. В режиме автоматической передачи универсальный счетчик инициирует циклическую передачу сообщения CAN. Счетчик (CAN_UCCNT) загружается значением, сохраненным в регистр CAN_UCRC. Счетчик декрементируется до 0, и перезагружается автоматически. Когда счетчик достигает значения 0, бит TRS11 для mailbox 11 автоматически установится внутренней логикой. Соответствующее сообщение автоматически отправится.
Mailbox 11 должен быть сконфигурирован как передающий, и должен содержать достоверные данные (идентификатор, биты управления и данные).
Поскольку бит TRS11 для mailbox 11 устанавливается внутренней логикой, соответствующие биты TA11 and AA11 останутся не измененными. Эти биты должны быть сброшены программой CPU.
Event Counter Mode. Для целей диагностики можно использовать универсальный счетчик как счетчик событий. Счетчик может быть запрограммирован на инкремент при следующих условиях:
• Счетчик фреймов ошибки CAN, который инкрементируется, если на шине CAN появляется error frame. • Счетчик фреймов перегрузки CAN, который инкрементируется, если на шине CAN появляется overload frame. • Когда при передаче потерян арбитраж по шине CAN. • Когда передача оборвана (установлен бит AAn). • При успешной передаче без обнаруженных ошибок (установлен бит TAn). • Принятое сообщение отброшено (сообщение принято без обнаруженных ошибок, однако оно не сохранено в mailbox, потому что не был найден совпадающий идентификатор). • Успешный прием сообщения без обнаруженных ошибок. Счетчик инкрементируется, если принятое сообщение было отброшено или сохранено в mailbox. • Принятое сообщение потеряно: сообщение принято без обнаруженных ошибок, однако оно не сохранено в mailbox, потому что этот mailbox содержит не прочитанные данные (установлен бит RMLn). • Успешный прием и совпадение идентификатора. Сообщение было принято для одного из сконфигурированных mailbox. Счетчик инкрементируется, если сообщение сохраняется в соответствующий mailbox (установлен бит RMPn). • На шине CAN обнаружено допустимое сообщение. Это может быть прием или передача.
1: счетчик разрешен и инкрементируется/декрементируется с запрограммированной частотой (такты бит модуля CAN). 0: счетчик запрещен.
• Universal Counter CAN Trigger (UCCT).
1: в режиме watchdog счетчик перезагружается, если принято сообщение для mailbox 4. В режиме time stamp счетчик очищается, если принято сообщение для mailbox 4 (синхронизация всех меток времени в системе). Этот бит не оказывает никакого эффекта в любом другом режиме. 0: нет никакого эффекта при приеме сообщения CAN.
• Universal Counter Reload/Clear (UCRC).
1: в режиме watchdog запись 1 в этот бит перезагрузит счетчик значением регистра перезагрузки/захвата. В режиме time stamp запись 1 в этот бит сбрасывает счетчик в 0. Во всех других режимах запись 1 в этот бит сбрасывает счетчик. Обратите внимание, что этот бит регистра всегда читается как 0. 0: запись 0 не дает никакого эффекта.
• Universal Counter Mode (UCCNF).
0: зарезервировано.
1: режим метки времени (Time Stamp Mode). Содержимое регистра захвата записывается в текущий mailbox, если для этого mailbox произошел прием или из него была передача.
2: режим сторожевого таймера (Watchdog Mode). Универсальный счетчик перезагрузится значением регистра перезагрузки CAN_UCRC, если был допустимый прием сообщения для mailbox 4 (по умолчанию).
3: режим автоматической передачи (Auto Transmit Mode). Универсальный счетчик всегда перезагружается значением регистра перезагрузки CAN_UCRC, если счетчик (этот счетчик считает вниз) достиг значения 0x0000. При перезагрузке автоматически (внутренней логикой) установится бит запроса передачи TRS11 (по умолчанию), и отправится соответствующее сообщение из mailbox 11.
4: зарезервировано.
5: зарезервировано.
6: режим счетчика событий. Инкремент произойдет, если на шине CAN появился error frame.
7: режим счетчика событий. Инкремент произойдет, если на шине CAN появится overload frame.
8: режим счетчика событий. Инкремент произойдет, если при передаче на шине CAN потерян арбитраж.
9: режим счетчика событий. Инкремент произойдет, если передача оборвана (установлен бит AAn).
A: режим счетчика событий. Инкремент произойдет, если прошла успешная передача без обнаруженных ошибок (установлен бит TAn)
B: режим счетчика событий. Инкремент произойдет, если принятое сообщение отброшено (сообщение принято без обнаруженных ошибок, но не сохранено в mailbox, потому что не было совпадения идентификатора).
C: режим счетчика событий. Инкремент произойдет, если принятое сообщение потеряно - сообщение было принято без обнаруженных ошибок, однако оно не было сохранено в mailbox, потому что в этом mailbox содержались не прочитанные данные (установлен бит RMLn).
D: режим счетчика событий. Инкремент произойдет, если был успешный прием сообщения без обнаруженных ошибок, и сообщение было либо отброшено, либо сохранено в mailbox.
E: режим счетчика событий. Был успешный прием и совпадение идентификатора (было принято сообщение для одного из сконфигурированных mailbox). Счетчик инкрементируется, если сообщение было сохранено в соответствующий mailbox (установлен бит RMPn).
F: режим счетчика событий. Инкремент произойдет, если детектировано достоверное сообщение на шине CAN. Это может быть прием или передача.
Регистр универсального счетчика CAN (CAN_UCCNT), где хранится значение счетчика. В режиме метки времени этот счетчик очищается записью 1 в бит UCRC регистра CAN_UCCNF. В режиме сторожевого таймера счетчик очищается записью в этот регистр 0x0000.
Регистр перезагрузки/захвата универсального счетчика CAN (CAN_UCRC) хранит значение счетчика, которое может использоваться для перезагрузки регистра CAN_UCCNT. В режиме метки времени чтение этого регистра дает значение CAN_UCCNT в момент успешного приема или передачи. В режиме сторожевого таймера чтение этого регистра дает значение перезагрузки.
Можно отдельно запрограммировать уровень предупреждения для EWTIS (прерывание состояния предупреждения об ошибках передачи) и для EWRIS (прерывание состояния предупреждения об ошибках приема).
После сброса при включении питания этот регистр установится уровнем по умолчанию 96 для обоих счетчиков ошибок. После программного сброса содержимое этого регистра останется не измененным.
Ошибки и предупреждения CAN управляются с помощью регистров CAN_CEC, CAN_ESR и CAN_EWR.
Регистр счетчика ошибок CAN (CAN_CEC) хранит счетчики ошибок передачи и приема. Значения этих счетчиков не могут быть изменены в нормальном рабочем режиме. Значение CAN_CEC сохранено во время доступа на чтение. После сброса при включении питания все биты очищаются. Программный сброс (битом SRS в CAN_CONTROL) не влияет на этот регистр.
Рис. 19-52. CAN Error Counter Register.
Значение CAN_CEC не определено, если модуль CAN находится в режиме отключения от шины CAN (bus-off mode).
После выхода из режимов отключения от шины или конфигурирования счетчик ошибок CAN сбрасываются. Однако программный сброс установит бит запроса режима конфигурации CAN (CCR=1 в регистре CAN_CONTROL), и модуль поменяет состояние в запрошенный режим после завершения всех выполняемых текущих активностей (передача / прием сообщения CAN message).
Регистр состояния ошибки (CAN_ESR) используется для отображения ошибок, которые произошли во время работы. Сохраняется только первая ошибка, любые последующие ошибки не меняют состояние этого регистра. Биты этого регистра очищаются записью 1 (операция W1C), кроме бита SA0, который очищается любым рецессивным битом на шине.
Рис. 19-53. Error Status Register.
Биты регистра CAN_ESR:
• Form Error Flag (FER).
1: на шине обнаружена ошибка формы. Это означает, что одно или большее количество битовых полей фиксированной формы имеют на шине неправильный уровень. 0: модуль CAN мог корректно передавать и принимать.
• Bit Error Flag (BEF).
1: принятый бит не соответствует переданному биту вне поля арбитража, или во время передачи поля арбитража был отправлен доминантный бит, однако был принят рецессивный бит. 0: модуль CAN мог корректно передавать и принимать.
• Stuck at Dominant Error (SA0).
1: бит SA0 установится, если модуль CAN находится в режиме конфигурации, или модуль вошел в режим bus-off. Бит сбросится, если модуль получил рецессивный бит на входной линии CANRX. 0: модуль CAN определил рецессивный бит.
• CRC Error (CRCE).
1: модуль CAN принял неправильную контрольную сумму. 0: модуль CAN ни разу не принял неправильную контрольную сумму.
• Stuff Error (SER).
1: нарушено правило stuff-бита. 0: не было ошибок stuff-бита.
• Acknowledge Error (ACKE).
1: модуль CAN получил отсутствие подтверждения. 0: модуль CAN получил корректное подтверждение.
Биты прерывания предупреждения об ошибках EWRIS и EWTIS в регистре CAN_GIS установятся, если один из счетчиков ошибок CAN достигнет уровня предупреждения (по умолчанию 96 ошибок для обоих счетчиков ошибок). Регистр уровня предупреждения об ошибках (CAN_EWR) позволяет отдельно запрограммировать уровень предупреждения для событий EWTIS и EWRIS. После сброса при включении питания регистр установится в значение по умолчанию 96 для обоих счетчиков ошибок. После программного сброса содержимое этого регистра не изменится.
Рис. 19-54. CAN Error Counter Warning Level Register.
Поля регистра CAN_EWR:
• Error Warning Level for Receive Error Count (EWLREC).
Количество ошибок приема, которое должно произойти перед генерацией прерывания предупреждения об ошибках приема (EWRIS).
• Error Warning Level for Transmit Error Count (EWLTEC).
Количество ошибок передачи, которое должно произойти перед генерацией прерывания предупреждения об ошибках передачи (EWTIS).