Программирование DSP ADSP-BF538: контроллер шины CAN Sat, May 25 2019  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


ADSP-BF538: контроллер шины CAN Печать
Добавил(а) microsin   

Здесь приведен перевод части документации [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 (вход)

ADSP BF538 CAN pins

Основные возможности и параметры модуля 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).

ADSP BF538 CAN transceiver interconnection fig19 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.

ADSP BF538 CAN CONTROL fig19 02

Рис. 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 не дает никакого эффекта.

ADSP BF538 CAN STATUS fig19 03

Рис. 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.

ADSP BF538 CAN CLOCK fig19 04

Рис. 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.

ADSP BF538 CAN TIMING fig19 05

Рис. 19-5. CAN Timing Register (RO, только чтение).

Рис. 19-6 показывает 3 фазы бита CAN: сегмент синхронизации, сегмент перед точкой выборки уровня (sample point) и сегмент после точки выборки уровня.

ADSP BF538 CAN three bit phases fig19 06

Рис. 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 килобит/сек.

typedef struct
{
   u16 speed;        // Скорость, килобит/сек.
   u16 can_clock;    // Значение для регистра CAN_CLOCK.
   u16 can_timing;   // Значение для регистра CAN_TIMING.
}TCanParam;
 
// Таблица параметров для стандартных скоростей CAN и частоты SCLK = 50 МГц,
// вычисленная на ресурсе http://www.bittiming.can-wiki.info/ [5]:
static const 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}
};
 
/*********************************************************************************
** Функция Init_CAN_Timing - настраивает регистры CAN_TIMING и CAN_CLOCK.       **
** Предоставленные комментарии показывают, как вычислить поле BRP по известной  **
** частоте SCLK value (подробнее см. главу CAN в аппаратном руководстве).       **
** Вернет false, если speed (указана в килобитах/сек) не найдена в таблице      **
** стандартных частот canparam.                                                 **
*********************************************************************************/
static bool Init_CAN_Timing(u16 speed)
{
   // Вход в режим конфигурации CAN (установка CCR):
   *pCAN_CONTROL = CCR;
   while(0 == (*pCAN_STATUS & CCA))
   {
      // Цикл ожидания входа в режим конфигурации.
      ssync();
   }
   /* ===================================================
    * Параметры времени бита, пример расчета:
    *
    * CAN_TIMING : SJW = 3, TSEG2 = 3, TSEG1 = 4
    * SJW <= TSEG2 <= TSEG1
    * ===================================================
    * CAN_CLOCK  : прескалер (BRP)
    * ===================================================
    * Для 500 кГц CAN Clock :: tBIT = 2 мкс
    * ===================================================
    * tBIT = TQ * (1 + (TSEG1 + 1) + (TSEG2 + 1))
    * 2e-6 = TQ * (1 + 5 + 4)    * TQ = 2e-7
    *
    * TQ = (BRP+1) / SCLK
    * 2e-7 = (BRP+1) / 112.5e6
    * (BRP+1) = 22.5
    * BRP = 21.5 = ~22 = CAN_CLOCK
    * ==================================================*/
   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 полностью готов к работе.

ADSP BF538 CAN DEBUG

В модуле 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 (всегда отправляются как доминантные) автоматически генерируются внутренней логикой.

ADSP BF538 CAN message formats fig19 07

Рис. 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.

ADSP BF538 CAN MBxx ID1 fig19 08

Рис. 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: разрешает сообщение в виде фрейма данных.

IDE - Identifier Extension.

1: разрешает 29-битный идентификатор.
0: разрешает 11-битный идентификатор.

ADSP BF538 CAN MBxx ID0 fig19 09

Рис. 19-9. Mailbox Identifier Word 6 (адреса MMR-регистров см. в таблице 19-4).

EXTID -  это дополнительные биты расширенного 29-битного идентификатора сообщения.

Таблица 19-4. Адреса регистров Mailbox Identifier Word 6.

Имя регистра MMR-адрес Имя регистра MMR-адрес
CAN_MB00_ID0 0xFFC0 2C18 CAN_MB16_ID0 0xFFC0 2E18
CAN_MB01_ID0 0xFFC0 2C38 CAN_MB17_ID0 0xFFC0 2E38
CAN_MB02_ID0 0xFFC0 2C58 CAN_MB18_ID0 0xFFC0 2E58
CAN_MB03_ID0 0xFFC0 2C78 CAN_MB19_ID0 0xFFC0 2E78
CAN_MB04_ID0 0xFFC0 2C98 CAN_MB20_ID0 0xFFC0 2E98
CAN_MB05_ID0 0xFFC0 2CB8 CAN_MB21_ID0 0xFFC0 2EB8
CAN_MB06_ID0 0xFFC0 2CD8 CAN_MB22_ID0 0xFFC0 2ED8
CAN_MB07_ID0 0xFFC0 2CF8 CAN_MB23_ID0 0xFFC0 2EF8
CAN_MB08_ID0 0xFFC0 2D18 CAN_MB24_ID0 0xFFC0 2F18
CAN_MB09_ID0 0xFFC0 2D38 CAN_MB25_ID0 0xFFC0 2F38
CAN_MB10_ID0 0xFFC0 2D58 CAN_MB26_ID0 0xFFC0 2F58
CAN_MB11_ID0 0xFFC0 2D78 CAN_MB27_ID0 0xFFC0 2F78
CAN_MB12_ID0 0xFFC0 2D98 CAN_MB28_ID0 0xFFC0 2F98
CAN_MB13_ID0 0xFFC0 2DB8 CAN_MB29_ID0 0xFFC0 2FB8
CAN_MB14_ID0 0xFFC0 2DD8 CAN_MB30_ID0 0xFFC0 2FD8
CAN_MB15_ID0 0xFFC0 2DF8 CAN_MB31_ID0 0xFFC0 2FF8

ADSP BF538 CAN MBxx TIMESTAMP fig19 10

Рис. 19-10. Mailbox Identifier Word 5 (адреса MMR-регистров см. в таблице 19-5).

TSV - метка времени сообщения.

Таблица 19-5. Адреса регистров Mailbox Identifier Word 5.

Имя регистра MMR-адрес Имя регистра MMR-адрес
CAN_MB00_TIMESTAMP 0xFFC0 2C14 CAN_MB16_TIMESTAMP 0xFFC0 2E14
CAN_MB01_TIMESTAMP 0xFFC0 2C34 CAN_MB17_TIMESTAMP 0xFFC0 2E34
CAN_MB02_TIMESTAMP 0xFFC0 2C54 CAN_MB18_TIMESTAMP 0xFFC0 2E54
CAN_MB03_TIMESTAMP 0xFFC0 2C74 CAN_MB19_TIMESTAMP 0xFFC0 2E74
CAN_MB04_TIMESTAMP 0xFFC0 2C94 CAN_MB20_TIMESTAMP 0xFFC0 2E94
CAN_MB05_TIMESTAMP 0xFFC0 2CB4 CAN_MB21_TIMESTAMP 0xFFC0 2EB4
CAN_MB06_TIMESTAMP 0xFFC0 2CD4 CAN_MB22_TIMESTAMP 0xFFC0 2ED4
CAN_MB07_TIMESTAMP 0xFFC0 2CF4 CAN_MB23_TIMESTAMP 0xFFC0 2EF4
CAN_MB08_TIMESTAMP 0xFFC0 2D14 CAN_MB24_TIMESTAMP 0xFFC0 2F14
CAN_MB09_TIMESTAMP 0xFFC0 2D34 CAN_MB25_TIMESTAMP 0xFFC0 2F34
CAN_MB10_TIMESTAMP 0xFFC0 2D54 CAN_MB26_TIMESTAMP 0xFFC0 2F54
CAN_MB11_TIMESTAMP 0xFFC0 2D74 CAN_MB27_TIMESTAMP 0xFFC0 2F74
CAN_MB12_TIMESTAMP 0xFFC0 2D94 CAN_MB28_TIMESTAMP 0xFFC0 2F94
CAN_MB13_TIMESTAMP 0xFFC0 2DB4 CAN_MB29_TIMESTAMP 0xFFC0 2FB4
CAN_MB14_TIMESTAMP 0xFFC0 2DD4 CAN_MB30_TIMESTAMP 0xFFC0 2FD4
CAN_MB15_TIMESTAMP 0xFFC0 2DF4 CAN_MB31_TIMESTAMP 0xFFC0 2FF4

Любое значение DLC, большее 8, обрабатывается так же, как значение 8.

ADSP BF538 CAN MBxx LENGTH fig19 11

Рис. 19-11. Mailbox Identifier Word 4 (адреса MMR-регистров см. в таблице 19-6).

DLC - длина сообщения в байтах.

Таблица 19-6. Адреса регистров Mailbox Identifier Word 4.

Имя регистра MMR-адрес Имя регистра MMR-адрес
CAN_MB00_LENGTH 0xFFC0 2C10 CAN_MB16_LENGTH 0xFFC0 2E10
CAN_MB01_LENGTH 0xFFC0 2C30 CAN_MB17_LENGTH 0xFFC0 2E30
CAN_MB02_LENGTH 0xFFC0 2C50 CAN_MB18_LENGTH 0xFFC0 2E50
CAN_MB03_LENGTH 0xFFC0 2C70 CAN_MB19_LENGTH 0xFFC0 2E70
CAN_MB04_LENGTH 0xFFC0 2C90 CAN_MB20_LENGTH 0xFFC0 2E90
CAN_MB05_LENGTH 0xFFC0 2CB0 CAN_MB21_LENGTH 0xFFC0 2EB0
CAN_MB06_LENGTH 0xFFC0 2CD0 CAN_MB22_LENGTH 0xFFC0 2ED0
CAN_MB07_LENGTH 0xFFC0 2CF0 CAN_MB23_LENGTH 0xFFC0 2EF0
CAN_MB08_LENGTH 0xFFC0 2D10 CAN_MB24_LENGTH 0xFFC0 2F10
CAN_MB09_LENGTH 0xFFC0 2D30 CAN_MB25_LENGTH 0xFFC0 2F30
CAN_MB10_LENGTH 0xFFC0 2D50 CAN_MB26_LENGTH 0xFFC0 2F50
CAN_MB11_LENGTH 0xFFC0 2D70 CAN_MB27_LENGTH 0xFFC0 2F70
CAN_MB12_LENGTH 0xFFC0 2D90 CAN_MB28_LENGTH 0xFFC0 2F90
CAN_MB13_LENGTH 0xFFC0 2DB0 CAN_MB29_LENGTH 0xFFC0 2FB0
CAN_MB14_LENGTH 0xFFC0 2DD0 CAN_MB30_LENGTH 0xFFC0 2FD0
CAN_MB15_LENGTH 0xFFC0 2DF0 CAN_MB31_LENGTH 0xFFC0 2FF0

Периферийное устройство CAN обменивается данными так, что самый "значащий" байт (который хранится по самому старшему адресу) передается первым. По этой причине регистры CAN_MBxx_DATAx используются таким образом, как если бы старший байт был первым. Например, если передан или принят только 1 байт (DLC = 1), то он сохраняется в самый значащий байт регистра CAN_MBxx_DATA3. Если переданы или приняты два байта, то они сохраняются в старшую и младшую половины CAN_MBxx_DATA3. См. рисунки 19-12, 19-13, 19-14 и 19-15. Поначалу это вностит известную путаницу, будьте внимательны!

Ниже показан код, который обеспечивает прогнозируемый порядок следования байт и в памяти, и при передаче - первый байт в памяти (по самому младшему адресу) передается первым:

// Объединение для перестановки байт:
typedef union
{
   u16 d16;
   u8  d8[2];
}TCanDataSwap;
 
////////////////////////////////////////////////////////////////////
// Функция использует на передачу восемь ящиков 24..31. Вернет true,
// если передача завершилась успешно и false, если передать
// не удалось, потому что все эти восемь ящиков заняты передачей.
// Байты передаются в том же порядке, как они находятся в памяти
// по адресу data.
bool canTX (u8* data)
{
   // Указатель на регистр DATA0 найденного свободного
   // передающего ящика CAN_MBxx:
   volatile u16 *pCAN_Ptr;
   
   // Поиск свободного ящика для передачи:
   s16 boxnum;
   u16 boxmask = 0x0100;   // маска бита ящика 24 в регистре CAN_TRS2
   u16 boxmaskfinded = 0;
   for (boxnum=24; boxnum<32; boxnum++)
   {
      if (0==(*pCAN_TRS2 & boxmask))
      {
         boxmaskfinded = boxmask;
         break;
      }
boxmask <= 1; } if (boxmaskfinded) { pCAN_Ptr = (u16*)CAN_MB00_DATA0 + (0x10 * boxnum); TCanDataSwap tmp; // Заполнение данных в найденном ящике: tmp.d8[1] = *data++; tmp.d8[0] = *data++; *(pCAN_Ptr + 6) = tmp.d16; tmp.d8[1] = *data++; tmp.d8[0] = *data++; *(pCAN_Ptr + 4) = tmp.d16; tmp.d8[1] = *data++; tmp.d8[0] = *data++; *(pCAN_Ptr + 2) = tmp.d16; tmp.d8[1] = *data++; tmp.d8[0] = *data++; *(pCAN_Ptr + 0) = tmp.d16; // Запуск передачи: *pCAN_TRS2 = boxmaskfinded; } return (0!=boxmaskfinded); }

Имейте в виду, что эта функция не обеспечивает гарантированный порядок следования друг за другом 8-байтных пакетов в том случае, если при входе в функцию некоторые ящики были заняты. Для обеспечения определенного порядка следования пакетов друг за другом используйте на передачу только один передающий ящик.

[CAN_MBxx_DATA3, первый и второй передаваемые байты]

ADSP BF538 CAN MBxx DATA3 fig19 12

Рис. 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, третий и четвертый передаваемые байты]

ADSP BF538 CAN MBxx DATA2 fig19 13

Рис. 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, пятый и шестой передаваемые байты]

ADSP BF538 CAN MBxx DATA1 fig19 14

Рис. 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, седьмой и восьмой передаваемые байты]

ADSP BF538 CAN MBxx DATA0 fig19 15

Рис. 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.

ADSP BF538 CAN MC1 fig19 16

Рис. 19-16. Mailbox Configuration Register 1 (для всех бит 0: mailbox запрещен, 1: разрешен).

ADSP BF538 CAN MC2 fig19 17

Рис. 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 предназначены только для чтения.

ADSP BF538 CAN MD1 fig19 18

Рис. 19-18. Mailbox Direction Register 1 (для всех бит 0: mailbox сконфигурирован на передачу, 1: mailbox сконфигурирован на прием).

ADSP BF538 CAN MD2 fig19 19

Рис. 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).

Blackfin CAN RX logic

Здесь 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 используются для фильтрации сообщений по их идентификатору.

ADSP BF538 CAN AMxxH fig19 20

Рис. 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 Фильтрация по первым двум байтам данных.

ADSP BF538 CAN AMxxL fig19 21

Рис. 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.

ADSP BF538 CAN RMP1 fig19 22

Рис. 19-22. Receive Message Pending Register 1 (все биты типа W1C).

ADSP BF538 CAN RMP2 fig19 23

Рис. 19-23. Receive Message Pending Register 2 (все биты типа W1C).

RMPxx - этот бит показывает, в ящике xx находится сообщение, ожидающее обработки.

Биты в регистре потерянных сообщений (CAN_RMLx) могут быть только сброшены устройством и могут быть установлены внутренней логикой. Эти биты можно очистить записью 1 в бит RMPn регистра CAN_RMPx. Запись в регистр CAN_RMLx не оказывает никакого эффекта.

Если установлен один или большее количество бит в регистре CAN_RMLx, то также установится бит состояния потерянного сообщения в глобальном регистре состояния прерываний (CAN_GIS). Если соответствующий бит разрешения прерываний в регистре CAN_GIM установлен, то также установится флаг потери принятого сообщения (RMLIF) в глобальном регистре флагов прерываний (CAN_GIF).

ADSP BF538 CAN RML1 fig19 24

Рис. 19-24. Receive Message Lost Register 1.

ADSP BF538 CAN RML2 fig19 25

Рис. 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). Эти биты могут быть изменены только процессором. После сброса по питанию или программного сброса все биты очищаются.

ADSP BF538 CAN OPSS1 fig19 26

Рис. 19-26. Overwrite Protection/Single Shot Transmission Register 1.

ADSP BF538 CAN OPSS2 fig19 27

Рис. 19-27. Overwrite Protection/Single Shot Transmission Register 2.

Если изменена конфигурация mailbox (изменен прием на передачу, или наоборот), то использование содержимого регистра CAN_OPSSx должно быть соответствующим образом адаптировано пользователем.

Содержимое бит CAN_OPSSx не должно изменяться, если разрешен соответствующий mailbox.

Защита от перезаписи не может использоваться, если разрешена автоматическая обработка remote frame. В этом случае содержимое mailbox всегда перезапишется пришедшим сообщением.

Ниже приведен пример настройки ящиков 0..7 на прием. Функция Init_CAN_RX_mailboxes настраивает ящики для работы с 11-битным идентификатором, маска идентификатора приема он передается в функцию через параметр rxIDmask.

void Init_CAN_RX_mailmoxes (u16 rxIDmask)
{
   volatile u16 *pCAN_Ptr;
 
//////////////////////////////////////////////////////////////////////////////
// Настройка приемных ящиков.
// Ящики 0-7 работают только на прием,
// будем использовать их.
   // Запретим ящики 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 должен содержать достоверные передаваемые данные.

ADSP BF538 CAN TRS1 fig19 28

Рис. 19-28. Transmission Request Set Register 1.

ADSP BF538 CAN TRS2 fig19 29

Рис. 19-29. Transmission Request Set Register 2.

Биты в регистрах 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 устанавливается).

ADSP BF538 CAN TRR1 fig19 30

Рис. 19-30. Transmission Request Reset Register 1.

ADSP BF538 CAN TRR2 fig19 31

Рис. 19-31. Transmission Request Reset Register 2.

Регистр подтверждения обрыва (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 очищаются.

ADSP BF538 CAN AA1 fig19 32

Рис. 19-32. Abort Acknowledge Register 1 (все биты типа W1C).

ADSP BF538 CAN AA2 fig19 33

Рис. 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 очищаются.

ADSP BF538 CAN TA1 fig19 34

Рис. 19-34. Transmission Acknowledge Register 1 (все биты типа W1C).

ADSP BF538 CAN TA2 fig19 35

Рис. 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 игнорируется для передачи, пока установлен соответствующий бит запроса.

ADSP BF538 CAN MBTD fig19 36

Рис. 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 не передает и не принимает никаких сообщений.

ADSP BF538 CAN RFH1 fig19 37

Рис. 19-37. Remote Frame Handling Register 1.

ADSP BF538 CAN RFH2 fig19 38

Рис. 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.

void Init_CAN_TX_mailmoxes (u16 msgIDtx)
{
   volatile u16 *pCAN_Ptr;
 
//////////////////////////////////////////////////////////////////////////////
// Настройка передающих ящиков.
// Ящики 24-31 работают только на передачу,
// будем использовать их:
   s16 boxnum;
   for (boxnum = 24; boxnum<32; boxnum++)
   {
      pCAN_Ptr = (unsigned short *)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 соответственно, в тот момент, когда этот регистр был прочитан.

ADSP BF538 CAN INTR fig19 39

Рис. 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). После сброса при включении питания или после программного сброса все биты маски прерываний очищаются, и все прерывания оказываются запрещены.

ADSP BF538 CAN MBIM1 fig19 40

Рис. 19-40. Mailbox Interrupt Mask Register 1.

ADSP BF538 CAN MBIM2 fig19 41

Рис. 19-41. Mailbox Interrupt Mask Register 2.

Флаг прерываний передачи (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.

ADSP BF538 CAN MBTIF1 fig19 42

Рис. 19-42. Mailbox Transmit Interrupt Flag Register 1.

ADSP BF538 CAN MBTIF2 fig19 43

Рис. 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 устанавливается.

ADSP BF538 CAN MBRIF1 fig19 44

Рис. 19-44. Mailbox Receive Interrupt Flag Register 1.

ADSP BF538 CAN MBRIF2 fig19 45

Рис. 19-45. Mailbox Receive Interrupt Flag Register 2.

Ниже приведен пример кода обработчика прерывания приема для mailbox 0..7. Осуществляется прием сообщений со стандартным 11-битным идентфикатором.

typedef union
{
   u16 d16;
   u8  d8[2];
}TCanDataSwap;
 
typedef struct
{
   u16 id;
   u8 data[8];
}TCanPacket;
 
#define CANRXBUFSIZE 8
#define CANRXBUFMASK (CANRXBUFSIZE-1)
 
// Кольцевой буфер приема:
TCanPacket canrxbuf[CANRXBUFSIZE];
// Индексы кольцевого буфера:
u8 canInIdx, canOutIdx;
 
// Обработчик прерывания приема для ящиков MB00..MB07. Принятые данные
// записываются в кольцевой буфер canrxbuf.
static ADI_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 допустимы.

• External Trigger Output Interrupt (EXTIM, EXTIS, EXTIF).

1: произошло событие внешнего триггера.
0: не было события внешнего триггера.

• Universal Counter Exceeded Interrupt (UCEIM, UCEIS, UCEIF).

Было переполнение универсального счетчика (в режиме метки времени 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.

• Error Warning Receive Interrupt (EWRIM, EWRIS, EWRIF).

Счетчик ошибок приема CAN (RXECNT) достиг предела предупреждения (warning limit). Если бит в CAN_GIS (и CAN_GIF) сбрасывается, и режим предупреждения об ошибках все еще активен, то этот бит не установится снова. Если модуль покинет режим error warning, то бит в CAN_GIS (и CAN_GIF) останется установленным.

1: был превышен уровень предупреждения для счетчика ошибок приема CAN.
0: не был превышен уровень предупреждения для счетчика ошибок приема CAN.

• Error Warning Transmit Interrupt (EWTIM, EWTIS, EWTIF).

Счетчик ошибок передачи 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. После сброса при включении питания или программного сброса все биты очищаются, поэтому все прерывания глобального состояния запрещены.

ADSP BF538 CAN GIM fig19 46

Рис. 19-46. Global Interrupt Mask Register.

Если произойдет событие глобального прерывания, то установится соответствующий бит в регистре состояния глобальных прерываний (CAN_GIS), независимо от содержимого регистра глобальной маски прерываний (CAN_GIM). Если бит в регистре CAN_GIS очищен, и соответствующее событие прерывания остается активным, то этот бит не установится снова. Если бит в CAN_GIS очищен, то соответствующий бит в CAN_GIF также очищается (если он был ранее установлен).

Бит в регистре CAN_GIS может быть очищен записью 1 (операция W1C) в соответствующую позицию бита. Запись 0 не дает эффекта. Старшие биты (15 .. 11) не реализованы, и всегда читаются как 0. После сброса при включении питания или программного сброса все биты очищаются.

ADSP BF538 CAN GIS fig19 47

Рис. 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.

ADSP BF538 CAN GIF fig19 48

Рис. 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 обнаружено допустимое сообщение. Это может быть прием или передача.

ADSP BF538 CAN UCCNF fig19 49

Рис. 19-49. Universal Counter Configuration Mode Register.

Биты CAN_UCCNF:

• Universal Counter Enable (UCE).

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.

ADSP BF538 CAN UCCNT fig19 50

Рис. 19-50. Universal Counter Register.

Регистр перезагрузки/захвата универсального счетчика CAN (CAN_UCRC) хранит значение счетчика, которое может использоваться для перезагрузки регистра CAN_UCCNT. В режиме метки времени чтение этого регистра дает значение CAN_UCCNT в момент успешного приема или передачи. В режиме сторожевого таймера чтение этого регистра дает значение перезагрузки.

ADSP BF538 CAN UCRC fig19 51

Рис. 19-51. Universal Counter Reload/Capture Register.

[Ошибки и предупреждения CAN]

Можно отдельно запрограммировать уровень предупреждения для EWTIS (прерывание состояния предупреждения об ошибках передачи) и для EWRIS (прерывание состояния предупреждения об ошибках приема).

После сброса при включении питания этот регистр установится уровнем по умолчанию 96 для обоих счетчиков ошибок. После программного сброса содержимое этого регистра останется не измененным.

Ошибки и предупреждения CAN управляются с помощью регистров CAN_CEC, CAN_ESR и CAN_EWR.

Регистр счетчика ошибок CAN (CAN_CEC) хранит счетчики ошибок передачи и приема. Значения этих счетчиков не могут быть изменены в нормальном рабочем режиме. Значение CAN_CEC сохранено во время доступа на чтение. После сброса при включении питания все биты очищаются. Программный сброс (битом SRS в CAN_CONTROL) не влияет на этот регистр.

ADSP BF538 CAN CEC fig19 52

Рис. 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, который очищается любым рецессивным битом на шине.

ADSP BF538 CAN ESR fig19 53

Рис. 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 для обоих счетчиков ошибок. После программного сброса содержимое этого регистра не изменится.

ADSP BF538 CAN EWR fig19 54

Рис. 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).

[Ссылки]

1. ADSP-BF538/ADSP-BF538F Blackfin® Processor Hardware Reference site:analog.com.
2. ADSP-BF538: управление портами GPIO C, D, E.
3. ADSP-BF538: динамическое управление питанием.
4. Трансиверы CAN.
5. CAN Bit Time Calculation.
6. 190304TestCAN.zip - исходный код проекта, демонстрирующего работу с CAN.

 

Добавить комментарий


Защитный код
Обновить

Top of Page