Программирование DSP Интерфейс CAN ADSP-BF50x Thu, March 28 2024  

Поделиться

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

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

Интерфейс CAN ADSP-BF50x Печать
Добавил(а) microsin   

Процессоры ADSP-BF50x (ADSP-BF504, ADSP-BF504F, ADSP-BF506) предоставляют контроллер CAN, обслуживающий обмен данными по протоколу Controller Area Network (CAN) V2.0B. Это асинхронный протокол коммуникации, используемый в промышленных и автомобильных системах управления приложениях. CAN хорошо подходит для приложений управления, потому что он способен осуществить надежный обмен данными со встроенной проверкой их целостности кодами CRC, трекингом сообщений об ошибках и определением отказа узла сети.

Контроллер CAN основан на ОЗУ почтовых ящиков (mailbox RAM), состоящем из 32 ячеек (8 ящиков только на передачу, 8 только на прием, и еще 16 конфигурируемых в любом направлении), поддерживает форматы стандартных (11 бит) и расширенных (29 бит) идентификаторов (ID) сообщений, как это определено в спецификации протокола CAN revision 2.0 part B, и поддерживает скорости обмена данных до 1 мегабита/сек. Благодаря такому большому количеству аппаратных ящиков и высокой производительности Blackfin практически полностью отпадает необходимость дополнительной буферизации приема и/или передачи.

Каждый mailbox состоит из восьми 16-битных слова данных. Данные разделены на поля, которые включают идентификатор сообщения (message identifier), метку времени (time stamp), счетчик байт (byte count), до 8 байт данных полезной нагрузки и несколько бит управления. Каждый узел CAN отслеживает сообщения, передаваемые по сети. Каждый ящик имеет индивидуальную маску для приема сообщения по его идентификатору. Если идентификатор, передаваемый в сообщении, совпал с идентификатором в одном из mailbox (попал под условия выбора, задаваемое маской), то модуль контроллера определяет, что сообщение было предназначено для него, передает данные сообщения в соответствующий mailbox, и с помощью прерывания дает сигнал процессору о поступлении сообщения.

В контроллер дополнительно встроена (опционально включаемая) фильтрация сообщений по первым 2 байтам данных, что может быть использовано для фильтрации приема протокола DeviceNet™. Есть регистры состояния и регистры сообщений предупреждения, универсальный модуль счетчика. Контроллер может считывать логические уровни на выводах передачи и приема.

Контроллер CAN может разбудить процессор из режима сна (sleep mode) путем генерации события пробуждения (wake-up event), так что процессор может находиться в состоянии пониженного энергопотребления, когда он ждет прихода сообщения CAN. Дополнительно CAN wake-up event может разбудить встроенный в кристалл процессора внутренний регулятор напряжения, чтобы вывести его из состояния "выключено" (powered-down hibernate state).

Электрические характеристики каждого сетевого соединения как правило очень жесткие. Поэтому интерфейс CAN обычно делится на 2 части: контроллер и трансивер (приемопередатчик). Это позволяет одному контроллеру поддерживать разные драйверы и типы сетей CAN. Модуль CAN процессора ADSP-BF50x представляет часть контроллера. Его сетевой интерфейс ввода/вывода состоит из одного передающего выхода и одного приемного входа, которые подключаются к трансиверу линии CAN.

Тактирование CAN осуществляется от тактов системной шины процессора (SCLK) через программируемый делитель, так что дополнительный кварцевый резонатор для этого не требуется.

[Обзор модуля интерфейса CAN]

Интерфейс с шиной CAN это простая двухпроводная линия. На рис. 17-1 показано символическое представление соединения контроллера CAN с трансивером CAN, и на рис. 17-2 показана блок-диаграмма модуля CAN. Выход (CANTX) и вход (CANRX) процессора Blackfin подключаются к внешнему трансиверу CAN соответственно через его выводы TX and RX. Выводы CANTX и CANRX работают на уровнях TTL, и соответствующие им операции трансивера на физическом слое шины CAN соответствуют стандарту ISO/DIS 11898.

Blackfin CAN transceiver interconnection fig17 1

Рис. 17-1. Подключение модуля CAN процессора ADSP-BF50x к трансиверу.

Важное замечание, если применен трансивер: для того, чтобы избежать блокировки шины CAN доминантным уровнем в случае перезагрузки процессора, рекомендуется сделать подтяжку PG2 (CANTX) к уровню лог. 1. Причина в том, вывод порта PG2 по умолчанию (после сброса или включения питания) автоматически настраивается как ножка порта GPIO, работающая на вход, поэтому на входе TX трансивера может образоваться лог. 0 (доминантный уровень), что приведет к временной блокировке шины.

Можно также предусмотреть другой способ отмены блокировки шины при сбросе процессора. Например, трансивер PCA82C250 компании NXP имеет специальный вход Rs для управления скоростью переключения выхода и перевода трансивера в режим STANDBY. Этот вход можно подтянуть к лог. 1 резистором pull-up, и подключить к нему один из свободных портов GPIO процессора. При сбросе процессора на выводе Rs образуется лог. 1, потому что порт GPIO будет работать по умолчанию как вход, что отключит трансивер от шины CAN. После того, как процессор будет готов к работе, он должен настроить свой вывод порта, подключенный к Rs, как выход, и подать на него лог. 0. После этого трансивер активируется и подключится к шине CAN.

Blackfin CAN Block Diagram fig17 2

Рис. 17-2. Блок-диаграмма модуля CAN процессора ADSP-BF50x.

Сигналы CANRX и CANTX находятся на GPIO Port G, выводы PG1 и PG2 соответственно. Уровень данных CAN определен либо как доминантный (лог. 0), либо как рецессивный (лог. 1). Состояние по умолчанию для выхода CANTX - рецессивное. Что такое "доминантный" и "рецессивный" уровни - подробнее см. ниже в разделе "Базовые сведения о протоколе CAN".

Вывод PG1 (вход CANRX) также внутри чипа разведен на альтернативный вход захвата таймера общего назначения 5 (alternated capture input TACI5 GP timer 5). Это дает способ использовать таймер 5 для автоматического определения скорости на шине CAN и её автоматической настройки.

[Область CAN Mailbox]

Полнофункциональный контроллер CAN имеет на борту 32 буфера для сообщений, которые называют в протоколе CAN почтовыми ящиками (mailboxes). 8 ящиков жестко предназначены только для передачи, еще 8 только на прием, и еще 16 можно программировать в любое направление. Соответственно архитектура модуля CAN основана на mailbox RAM из 32 ячеек памяти. К ящикам осуществляется доступ через последовательный интерфейс CAN или через доступ со стороны ядра процессора Blackfin. Каждый ящик состоит из восьми 16-битных регистров данных и управления, и двух опциональных 16-битных регистров маски приема (acceptance mask registers), каждый из которых должен быть сконфигурирован перед тем, как ящик будет разрешен. Поскольку область ящиков реализована как RAM, значения в этих регистрах после сброса является неопределенным. Данные делятся на поля, которые включают идентификатор сообщения, метку времени, счетчик байт и до 8 байт данных, и также несколько бит управления (см. рис. 17-3).

Регистровые пары идентификатора ящика (CAN mailbox identification, CAN_MBxx_ID0/CAN_MBxx_ID1) включают:

• 29-битный идентификатор (базовая часть идентификатора BASEID плюс часть, относящаяся к расширенному идентификатору EXTID_LO/EXTID_HI).
• Бит разрешения маски приема (acceptance mask enable, AME).
• Бит запроса передачи с дальнего узла сети (remote transmission request, RTR).
• Бит расширенного идентификатора (identifier extension, IDE).

Внимание: не записывайте в объект идентификатора сообщения, когда ящик разрешен (т. е. когда установлен соответствующий бит CAN_MCx).

Blackfin CAN Mailbox Area fig17 3

Рис. 17-3. CAN Mailbox Area (регистры ящика CAN).

Примечание: xx в именах регистров (CAN_MBxx_ID0, CAN_MBxx_ID1 и других) означают десятичный номер ящика от 00 до 32.

Другие регистры ящика содержат:

• Код длины сообщения (data length code, DLC) в CAN_MBxx_LENGTH. Старшие 12 бит CAN_MBxx_LENGTH каждого mailbox помечены как зарезервированные. Эти 12 бит должны быть всегда установлены в 0. Если DLC запрограммировано в значение, которое превышает 8, то внутренняя логика контроллера сбрасывает значение DLC в 8.
• До 8 байт поля данных, которые посылаются старшим байтом (MSB). Они находятся соответственно в регистрах CAN_MBxx_DATA3, CAN_MBxx_DATA2, CAN_MBxx_DATA1, CAN_MBxx_DATA0, данные читаются оттуда на основе количества байтов, определенного в поле DLC. Например, если передан или принят только 1 байт (DLC=1), то он должен быть прочитан из старшего байта регистра CAN_MBxx_DATA3.
• 2 байта метки времени (time stamp value, TSV) в регистре CAN_MBxx_TIMESTAMP.

Оставшиеся регистры относятся к маске приема (acceptance mask registers, CAN_AMxxH и CAN_AMxxL). Работа маски разрешается, когда в регистре CAN_MBxx_ID1 установлен бит AME. Если разрешена опция фильтрации по байтам данных "filtering on data field" (когда DNM=1 в регистре CAN_CONTROL, и FDF=1 в соответствующей маске приема), то биты EXTID_HI[15:0] регистра CAN_MBxx_ID0 дополнительно используются как код разрешения приема (acceptance code, DFC) для дополнительной фильтрации по данным. Подробнее про фильтрацию по ID и данным см. раздел "Как работает прием".

[Управление CAN Mailbox]

Ящики управляются через MMR-регистры, которые работают как регистры управления и статуса для 32 ящиков. Каждый бит в этих регистрах представляет один определенный ящик. Поскольку MMR-регистры CAN все 16-битные, то для обеспечения определенной функциональности для всех 32 ящиков требуются пары таких регистров. Ящики 0-15 конфигурируются / мониторятся регистрами, у которых имена с суффиксом 1. Подобным образом ящики 16-31 используют те же имена регистров, но с суффиксом 2. Например, регистры направления (CAN mailbox direction registers, CAN_MDx) должны управлять ящиками, как показано на рис. 17-4.

Blackfin CAN register pairs fig17 4

Рис. 17-4. Пары регистров CAN.

Имеются следующие пары регистров CAN управления ящиками:

CAN_MC1,
CAN_MC2
Регистры разрешения (mailbox enable registers).
CAN_MD1,
CAN_MD2
Регистры направления (mailbox direction registers).
CAN_TA1,
CAN_TA2
Регистры подтверждения передачи (transmit acknowledge registers).
CAN_AA1,
CAN_AA2
Регистры подтверждения обрыва (abort acknowledge registers).
CAN_TRS1,
CAN_TRS2
Регистры установки запроса на передачу (transmit request set registers).
CAN_TRR1,
CAN_TRR2
Регистры сброса запроса на передачу (transmit request reset registers).
CAN_RMP1,
CAN_RMP2
Регистры ожидания приема сообщения (receive message pending registers).
CAN_RML1,
CAN_RML2
Регистры потери сообщения на приеме (receive message lost registers).
CAN_RFH1,
CAN_RFH2
Регистры поддержки фрейма RTR (remote frame handling registers).
CAN_OPSS1,
CAN_OPSS2
Регистры защиты от перезаписи / одиночной передачи (overwrite protection/single shot transmission registers).
CAN_MBIM1,
CAN_MBIM2
Регистры маски прерывания (mailbox interrupt mask registers).
CAN_MBTIF1,
CAN_MBTIF2
Регистры флага прерывания передачи (mailbox transmit interrupt flag registers).
CAN_MBRIF1,
CAN_MBRIF2
Регистры флага прерывания приема (mailbox receive interrupt flag registers).

Поскольку ящики 24–31 работают только на передачу, и ящики 0–7 только на прием, то младшие 8 бит в регистрах с суффиксом "1" и старшие 8 бит в регистрах с суффиксом "2" иногда зарезервированы, и их использование запрещено.

[Базовые сведения о протоколе CAN]

Хотя выводы CANRX и CANTX работают как TTL-совместимые сигналы, драйвер выходного сигнала передачи асимметричный (см. рис. 17-1). Подтяжка к лог. 0 (нижний ключ драйвера) для выхода CANTX мощная (выдерживает большой внешний втекающий ток), а подтяжка к лог. 1 (верхний ключ драйвера) слабая (обеспечиваемый вытекающий ток мал). Это сделано специально для организации так называемого монтажного ИЛИ при параллельном соединении выходов передачи. Соответственно активный лог. 0 связывается с "доминантным" состоянием бита, поскольку оно отменяет любой уровень лог. 1, и уровень лог. 1 связывается с "рецессивным" состоянием, потому что его может отменить уровень лог. 0. Если модуль CAN пассивный, то вывод CANTX всегда находится в состоянии лог. 1. Если 2 узла шины CAN передают одновременно, то доминантный бит перезаписывает рецессивный.

Протокол CAN определяет, что все узлы пытаются отправить свой фрейм сообщения по шине только тогда, когда было определено, что шина CAN стала свободна. Индикатор start of frame (SOF) сигнализирует о начале нового фрейма. Тогда каждый узел CAN начинает передачу своего сообщения, начиная с идентификатора сообщения ID. Во время передачи контроллер CAN одновременно анализирует вывод CANRX, чтобы проверить, что его уровень такой же, как им был выставлен на выводе CANTX. Это как раз то место, где оправдывают свое название имена уровней. Если передающий узел помещает рецессивную лог. 1 на CANTX, и при этом определил доминантный 0 на выводе CANRX, то ему известно, что другой узел поместил доминантный бит на шину, и это означает, что у другого узла приоритет выше. Таким образом, если узлом было определено значение на CANRX такое же, как было им выставлено на CANTX, то узел продолжает передачу, иначе контроллер CAN узла определяет, что на этом фрейме арбитраж потерян, прекращает передачу и предпринимает действия по ожиданию попытки передачи своего фрейма в следующий раз, когда шина CAN освободится. См. рис. 17-5, где более подробно показана структура фрейма CAN.

Blackfin CAN Standard Frame fig17 5

Рис. 17-5. Стандартный фрейм CAN.

SOF Start Of Frame, сигнал начала фрейма (один бит = 0).
RTR Remote Transmission Request, запрос дальнего сетевого узла на передачу данных локальным узлом (REMOTE FRAME = 1).
IDE IDentifier Extension (для расширенного фрейма = 1).
r0 зарезервировано для расширения в будущем.
DLC Data Length Control (определяет количество байт данных в фрейме).
CRC контрольная сумма бит фрейма.
ACK ACKnowledge (приемник для подтверждения выставляет здесь доминантный бит).
EOF End Of Frame, конец фрейма (последовательность из 7 рецессивных бит = 1111111).
IFS InterFrame Space, интервал между фреймами (3 рецессивных бита = 111).

Рис. 17-5 показывает базовый фрейм с 11-битным идентификатором. После SOF и идентификатора идет бит RTR, который показывает, содержит ли фрейм данные (data frame), или же это запрос на получение данных, связанных с идентификатором сообщения во фрейме, который отправляется (remote frame).

Замечание: из-за неотъемлемой природы протокола CAN доминантный бит в поле RTR выиграет арбитраж у запроса передачи дальнего узла (remote frame request, RTR=1) для того же самого ID сообщения, так что фрейм RTR имеет приоритет ниже, чем обычный фрейм данных.

Следующее поле это IDE. Когда этот бит установлен, это показывает, что передается сообщение с расширенным фреймом, у которого не 11-битный, а 29-битный идентификатор. В расширенном фрейме (extended frame) первая часть сообщения показана на рис. 17-6.

Blackfin CAN Extended Frame fig17 6

Рис. 17-6. Расширенный фрейм CAN с 29-битным идентификатором (показана первая часть фрейма, отличающаяся от стандартного фрейма с 11-битным идентификатором).

Как это было с полем RTR, доминантный бит в поле IDE выиграет арбитраж перед расширенным фреймом. Таким образом, стандартные фреймы имеют приоритет выше, чем расширенные фреймы. Бит, заменяющий бит RTR (substitute remote request, SRR, который всегда отправляется как рецессивный), резервированные биты r0 и r1 (всегда отправляются как доминантные) и контрольная сумма (CRC) генерируется автоматически внутренней логикой.

[Работа CAN]

Контроллер CAN находится в режиме конфигурирования, когда процессор выходит из состояния сброса или гибернации. Поведение аппаратуры можно поменять только тогда, когда CAN находится в этом режиме конфигурации. Перед инициализацией самих ящиков нужно установить длительность бита CAN, чтобы скорость работы CAN была ожидаемой, соответствующей другим узлам, подключенным к шине CAN.

Длительность бита. У контроллера CAN нет своего собственного источника тактирования. Вместо этого тактовая частота CAN получается из частоты системной шины (SCLK) на основании конфигурируемого количества квантов времени (time quanta). Параметр Time Quantum (TQ) вычисляется по формуле TQ = (BRP+1)/SCLK, где BRP это 10-битное поле BRP регистра CAN_CLOCK. Хотя поле BRP можно установить в любое значение, рекомендуется значение большее или равное 4, потому что накладываются ограничения на конфигурацию длительности бита, когда BRP меньше 4.

Регистр CAN_CLOCK определяет значение TQ, и определенное количество квантов времени составляют длительность бита на шине CAN. Регистр CAN_TIMING управляет номинальным временем бита и точку выборки отдельных бит в протоколе CAN. Рис. 17-7 показывает 3 фазы бита CAN - сегмент синхронизации, сегмент перед точкой выборки значения бита и сегмент после точки выборки.

Blackfin CAN bit phases fig17 7

Рис. 17-7. Три фазы бита CAN.

Длительность сегмента синхронизации всегда фиксировано равна 1 TQ. Это требуется для синхронизации узлов на шине CAN. Все перепады уровня сигналов ожидаются в пределах этого сегмента.

Поля TSEG1 и TSEG2 регистра CAN_TIMING управляют количеством TQ, которые входят в соответствующие интервалы бит CAN, и от этого зависит полученная скорость бит CAN. Номинальное время бита может быть получена по формуле:

tBIT = TQ * (1 + (1 + TSEG1) + (1 + TSEG2))

Для безопасного приема в физических сетях точка выборки программируется полем TSEG1. Поле TSEG2 содержит количество TQ, требуемое для завершения времени бита. Часто самая лучшая надежность достижима с точками выборки, расположенными в верхнем 80% диапазоне времени бита. Не используйте точки выборки меньше 50%. Таким образом, TSEG1 должен быть всегда больше или равным TSEG2.

Модуль CAN процессора не различает сегмент распространения (propagation segment) и сегмент фазы 1 (phase segment 2), как это определено в стандарте. Значение TSEG1 предназначено для обоих этих параметров. Значение TSEG2 предназначено для настройки сегмента фазы 2 (phase segment 2).

Если модуль CAN определил переход от рецессивного к доминантному биту вне сегмента синхронизации, то он автоматически переносит точку выборки так, что будет все еще правильно обрабатываться бит CAN. Поле ширины прыжка синхронизации (synchronization jump width, SJW) задает максимальное количество интервалов TQ в диапазоне от 1 до 4 (SJW + 1), чем разрешаются попытки повторной синхронизации. Значение SJW не должно превышать TSEG2 или TSEG1. Таким образом, фундаментальное правило для записи в CAN_TIMING следующее:

SJW ≤ TSEG2 ≤ TSEG1

В дополнение к этому фундаментальному правилу сегмент фазы 2 также должен быть больше или равен времени обработки информации (Information Processing Time, IPT). Это время, требуемое логикой для оцифровки входа CANRX. На модуле CAN процессора Blackfin это время составляет 3 такта SCLK. По этой причине накладываются ограничения на минимальное значение TSEG2, если у прескалера тактов BRP значение меньше 2. Если BRP установлен в 0, поле TSEG2 должно быть больше или равно 2. Если прескалер установлен в 1, то минимальное значение для TSEG2 будет 1.

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

Когда установлены все параметры интервалов времени, требуется последнее соображение о том, как выполнять выборку значения бита (оцифровка, sampling). Поведение по умолчанию состоит в том, что контроллер CAN делает выборку бита CAN один раз в точке выборки, описанной регистром CAN_TIMING, что управляется битом SAM. Однако если бит SAM установлен, то входной сигнал передискретизируется трехкратной выборкой с частотой SCLK результирующее значение генерируется по принципу наибольшего количества выборок в определенном уровне (если из этих трех выборок было больше единиц, то считается значение бита за единицу, если больше нулей, то ноль). Всегда оставляйте бит SAM сброшенным, если значение BRP меньше 4.

Во время нормальной работы не пытайтесь менять регистры CAN_CLOCK или CAN_TIMING. Для изменения всегда сначала входите в режим конфигурации. Запись в эти регистры не даст эффекта, если контроллер находится не в режиме конфигурации или отладки. Если процессор не выходил из состояния сброса или гибернации, то введите контроллер CAN в режим конфигурации установкой бита CCR в главном регистре управления (master control, CAN_CONTROL) и опрашивайте регистр глобального статуса CAN (CAN_STATUS) в ожидании установки бита CCA.

Замечание: если поле TSEG1 запрограммировано в 0, то модуль CAN не выйдет из режима конфигурации.

Во время режима конфигурации модуль не активен на линии шины CAN. Вывод выхода CANTX остается в рецессивном состоянии и модуль не передает и не принимает сообщения или фреймы ошибки (error frames). После того, как произошел выход из режима конфигурации, все внутренние регистры ядра CAN и счетчики ошибок CAN устанавливается в свое первоначальное состояние.

Программный сброс (software reset) не меняет значения регистров CAN_CLOCK и CAN_TIMING. Таким образом, происходящая передача через шину CAN не будет повреждена изменением параметров времени бита или инициацией программного сброса (SRS=1 в регистре CAN_CONTROL).

[Как работает передача]

Рис. 17-8 показывает функционирование передачи CAN. Ящики 24-31 назначены передающими. Ящики 8-23 можно сконфигурировать как передающие записью 0 в соответствующий бит регистра CAN_MDx. После записи данных и идентификатора в область ящика сообщение будет отправлено после того, как будет разрешен ящик n (MCn=1 в регистре CAN_MCx) и впоследствии установлен соответствующий бит запроса передачи (transmit request, TRSn=1 в регистре CAN_TRSx).

Когда передача завершена, очищаются соответствующие биты в регистре запроса передачи и регистре сброса передачи (transmit request reset, TRRn в регистре CAN_TRRx). Если передача была успешна, установится соответствующий бит в регистре подтверждения передачи (transmit acknowledge, TAn в регистре CAN_TAx). Если передача была оборвана из-за проигрыша арбитража по приоритету или ошибки CAN, установится соответствующий бит в регистре подтверждения обрыва (abort acknowledge, AAn в регистре CAN_AAx). Запрошенная передача также может быть оборвана вручную установкой соответствующего бита TRRn в регистре CAN_TRRx.

Программно можно одновременно установить несколько бит CAN_TRSx, и эти биты сбрасываются либо после успешной передачи, либо после оборванной. Биты TRSn также могут быть установлены аппаратурой CAN, когда используется режим автоматической передачи (auto-transmit mode) универсального счетчика, когда сообщение проиграло арбитраж и бит одиночной передачи не установлен (single-shot bit, OPSSn=0 в регистре CAN_OPSSx), или в событии RTR (remote frame request). Последнее возможно только для ящиков приема/передачи, если разрешена функция автоматической обработки remote frame (RFHn=1 в регистре CAN_RFHx).

Специальное внимание должно уделяться обработке области регистров ящика, когда установлен бит TRSn. Доступ на запись к ящику с установленным TRSn разрешен, но изменение данных в таком ящике может привести к непредсказуемым данным во время передачи.

Включение и отключение ящиков оказывает влияние на запросы передачи. Установка бита TRSn, связанного с запрещенным ящиком, может привести к ошибочному поведению. Точно так же запрет ящика до того, как внутренней логикой будет сброшен бит TRSn, может привести к непредсказуемым результатам.

Retransmission (повторная передача). Обычно текущий объект сообщения отправляется снова после проигрыша арбитража, или после определения ошибочного фрейма на шине CAN. Если ожидает своей передачи больше одного объекта сообщения, то будет отправлено то сообщение, ящик которого имеет больший номер (см. рис. 17-8). Оборванная в настоящий момент передача перезапускается после того, как будут отправлены любые сообщения с более высоким приоритетом.

Blackfin CAN Transmit operation flow chart fig17 8

Рис. 17-8. Алгоритм работы передачи CAN.

Сообщение, которое находится в настоящее время в процессе подготовки, не заменяется другим сообщением, которое записано в почтовый ящик. Подготавливаемое сообщение - то, которое скопировано во временный буфер, когда установлен внутренний запрос передачи для модуля ядра CAN. Сообщение в буфере не будет заменено пока оно не будет успешно отправлено, проигран арбитраж на линии шины CAN, или появится фрейм ошибки на линии шины CAN.

Одиночная передача (Single Shot Transmission). Если используется функция однократной отправки (OPSSn=1 в регистре CAN_OPSSx), то соответствующий бит TRSn очищается после успешной отправки сообщения, или если передача была оборвана из-за проигрыша арбитража или появления фрейма ошибки на линии шины CAN. Таким образом, больше не будет попыток снова передать это сообщение, если первая попытка была неудачной, и об этом сообщается флагом ошибки обрыва (abort error, AAn=1 в регистре CAN_AAx).

Автоматическая передача (Auto-Transmission). В режиме автоматической передачи сообщение в ящике 11 может отправляться автоматически с использованием универсального счетчика. Этот режим часто используется для широковещательных сообщений сердцебиения (broadcast heartbeats), отправляемых на все узлы CAN. Соответственно отправляемые таким способом сообщения обычно имеют высокий приоритет.

Значение периода записывается в регистр CAN_UCRC. Когда этот режим разрешен (установкой UCCNF[3:0]=0x3 в регистре CAN_UCCNF), то счетчик (регистр CAN_UCCNT) загружается значением из регистра CAN_UCRC. Счетчик декрементируется с частотой следования бит CAN до 0, и затем перезагружается из регистра CAN_UCRC. Каждый раз, когда счетчик достигает значения 0, внутренней логикой автоматически устанавливается бит TRS11, и отправляется соответствующее сообщение из ящика 11.

Для правильной работы автоматической передачи ящик 11 должен быть сконфигурирован как передающий, и должен содержать правильные данные (идентификатор, биты управления и данные) до того, как счетчик первый раз досчитает до 0, когда этот режим разрешен.

[Как работает прием]

Аппаратура CAN автономно принимает сообщения, отбрасывая при этом недопустимые сообщения. Как только допустимое сообщение было успешно принято, логика приема последовательно опрашивает все разрешенные на прием ящики от ящика 23 вниз, до ящика 0, и определяет, представляет ли сообщение интерес для локального узла, или нет.

Каждый входящий фрейм данных сравнивается со всеми идентификаторами, сохраненными в активных ящиках приема (MDn=1 и MCn=1), и для всех активных передающих ящиках, у которых разрешена функция обработки remote frame (RFHn=1 в регистре CAN_RFHx).

Идентификатор принятого сообщения вместе с битом расширения идентификатора (identifier extension, IDE) и битом запроса remote transmission (RTR) сравниваются с настройками регистров каждого ящика. Если бит AME не установлен, то совпадение определяется только по битам IDE, RTR и всем битам идентификаторов. Однако если установлен бит AME, то регистры маски соответствия (acceptance mask) определяют, какой идентификатор и биты IDE и RTR нуждаются в совпадении. Накладываемая логика: Received Message XNOR CAN_IDx или AME AND CAN_AMx. Единица в соответствующей битовой позиции регистров маски CAN_AMxx означает, что этот бит не нуждается в совпадении, когда AME=1. Таким способом ящик получает возможность принимать группы сообщений по их идентификаторам.

Примечание: в контексте фильтрации по ID сообщения есть исключение, почему-то не описанное в даташите на аппаратуру ADSP-BF50x. Несмотря на биты маски, сообщение с нулевым ID будет принято всегда.

Таблица 17-1. Ящики, используемые для входной фильтрации сообщений по маске (Acceptance Mask Filtering).

MCn MDn RFHn Ящик n Комментарий
0 x x Игнорируется Ящик n запрещен
1 0 0 Игнорируется Ящик n разрешен
Ящик n сконфигурирован для передачи
Обработка фрейма remote запрещена
1 0 1 Используется Ящик n разрешен
Ящик n сконфигурирован для передачи
Обработка фрейма remote разрешена
1 1 x Используется Ящик n разрешен
Ящик n сконфигурирован для приема

Если фильтр приема найдет подходящий идентификатор, то содержимое его принятого фрейма данных сохраняется в соответствующем ящике. Принятое сообщение будет сохранено только один раз, даже если для нескольких приемных ящиков идентификатор будет подходящим. Если текущий идентификатор сообщения не подходит ни для какого ящика, то сообщение не будет сохранено.

Рис. 17-9 показывает дерево принятия решения логики приема, когда идет обработка отдельных ящиков.

Blackfin CAN Receive operation flow chart fig17 9

Рис. 17-9. Алгоритм работы приема CAN.

Если сообщение принято для ящика, и этот ящик все еще содержит не прочитанные данные (RMPn=1), то пользователь решает, должно ли быть старое сообщение перезаписано новым, или нет. Если OPSSn=0, то установится бит потери принятого сообщения (receive message lost, бит RMLn в регистре CAN_RMLx), и старое сохраненное в ящике сообщение будет перезаписано. Это приведет к генерации прерывания потери принятого сообщения в глобальном регистре статуса прерываний CAN (RMLIS=1 в регистре CAN_GIS). Если OPSSn=1, то будут проверены следующие ящики на предмет совпадения по идентификатору. Если такое совпадение не было найдено, то сообщение будет отброшено, и произойдет переход к проверке следующего сообщения.

Важное замечание: если ящик приема запрещен, то пришедшее принимаемое сообщение для этого ящика будет потеряно, даже если второй ящик сконфигурирован для приема того же самого идентификатора.

Фильтр по данным (Data Acceptance Filter). Если разрешен режим DeviceNet (DNM=1 в регистре CAN_CONTROL), и ящик настроен на фильтрацию по полю данных, фильтрация осуществляется по полю стандартного идентификатора ID и по полю данных сообщения. Фильтрация по полю данных может быть запрограммирована либо только по первому байту, либо по первым двум байтам, как показано в таблице 17-2.

Таблица 17-2. Фильтрация по полю данных сообщения (Data Field Filtering).

FDF
Фильтр по полю данных
FMD
Полная маска по полю данных
Описание
0 0 Фильтрация по полю данных не разрешена.
0 1 Не разрешено. FMD должно быть 0, если FDF=0.
1 0 Фильтр только по первому байту данных.
1 1 Фильтр по двум байтам данных.

Если установлен бит FDF в соответствующем регистре CAN_AMxxH, то регистр CAN_AMxxL содержит маску фильтрации по данным (data field mask, DFM[15:0]). Если бит FDF очищен в соответствующем регистре CAN_AMxxH, то регистр CAN_AMxxL содержит маску для расширенного идентификатора (extended identifier mask, EXTID_HI[15:0]).

Обработка RTR (Remote Frame Handling). Автоматическая обработка фреймов remote может быть разрешена/запрещена путем установки/очистки соответствующего бита в регистрах обработки remote frame (CAN_RFHx) передающего ящика.

Фреймы remote это фреймы данных, у которых нет поля данных, и у которых установлен бит RTR. Код длины данных (data length code, DLC) отвечающего фрейма данных аннулируется кодом DLC запрашивающего фрейма remote. Код DLC может быть запрограммирован значениями от 0 до 15, но значения DLC больше 8 считаются как значение 8. Фрейм remote содержит:

• Биты идентификатора.
• Управляющее поле DLC.
• Бит запроса на передачу с дальнего узла (remote transmission request, RTR).

Фреймы remote могут обрабатывать только конфигурируемые ящики 8–23, но все ящики могут принимать и передавать запросы remote frame. Когда осуществлена настройка для автоматической обработки remote frame, регистр CAN_OPSSx не оказывает влияния. Все содержимое ящика всегда перезаписывается входящим сообщением.

Замечание: если принят фрейм remote, то DLC соответствующего ящика перезаписывается принятым значением.

Может быть ошибочное поведение контроллера, когда изменяется бит обработки фрейма remote (RFHn), и в настоящее время обрабатывается соответствующий ящик. См. далее раздел "Временный запрет ящиков" для безопасной обработки ящика.

Сторожевой режим (Watchdog Mode). Используется для гарантии, что сообщения принимаются периодически. Это часто используется, чтобы отслеживать, что определенный узел в сети работает правильно, и если это не так, то детектировать это и соответствующим образом обработать такой случай отказа.

Согласно программированию универсального счетчика в сторожевой режим (установка UCCNF[3:0]=0x2 в регистре CAN_UCCNF), счетчик в регистре CAN_UCCNT загружается заранее заданной величиной, содержащейся в регистре перезагрузки/захвата универсального счетчика CAN (universal counter reload/capture, CAN_UCRC). Затем этот счетчик декрементируется с частотой бит CAN. Если биты UCCT и UCRC в регистре CAN_UCCNF установлены, и будет принято сообщение в ящик 4 до того, как счетчик досчитает вниз до 0, счетчик перезагрузится содержимым регистра CAN_UCRC и продолжит счет вниз. Если же счетчик досчитал до 0 без приема сообщения в ящик 4, то установится бит UCEIS в регистре глобального статуса прерываний CAN (CAN_GIS), и счетчик автоматически будет перезагружен значением из регистра CAN_UCRC. Если в этот момент нужна генерация прерывания, должен быть установлен бит UCEIM в регистре CAN_GIM. С установленным битом маски, когда произойдет прерывание, то также установится бит UCEIF в регистре CAN_GIF.

Счетчик может быть перезагружен содержимым CAN_UCRC или запрещен записью в регистр CAN_UCCNF.

Период времени до возникновения сторожевого прерывания управляется значением, записанным пользователем в регистр CAN_UCRC.

[Метки времени]

Чтобы получить индикацию времени приема или времени передачи для каждого сообщения, программируют универсальный счетчик CAN в режим метки времени (time stamp mode, установка UCCNF[3:0]=0x1 в регистре CAN_UCCNF). Тогда 16-битное значение из свободно считающего счетчика (регистр CAN_UCCNT) записывается в регистр CAN_MBxx_TIMESTAMP соответствующего ящика, когда принятое сообщение было сохранено или когда сообщение было передано.

Значение метки времени захватывается в момент точки выборки бита начала фрейма (start of frame, SOF) для каждого приходящего или уходящего сообщения. Позже это значение метки времени копируется в регистр CAN_MBxx_TIMESTAMP соответствующего ящика.

Если ящик сконфигурирован для автоматической обработки фреймов remote, то значение метки времени записывается для передачи фрейма данных (в ящик, сконфигурированный для передачи) или приема запрашиваемого фрейма данных (ящик, сконфигурированный для приема).

Счетчик может быть очищен (установкой в 1 бита UCRC) или запрещен (установкой в 0 бита UCE) записью в регистр CAN_UCCNF. Счетчик также может быть загружен значением путем записи в сам регистр счетчика (CAN_UCCNT).

Также можно очистить счетчик (CAN_UCCNT) при приеме сообщения в ящик 4 (синхронизация всех счетчиков меток времени в системе). Это осуществляется установкой бита UCCT в регистре CAN_UCCNF.

Переполнение счетчика установит бит в глобальном регистре прерываний CAN (бит UCEIS в регистре CAN_GIS). Глобальное прерывание CAN может опционально произойти путем демаскирования бита в регистре маски глобальных прерываний CAN (бит UCEIM в регистре CAN_GIM). Если источник прерывания демаскирован, то также установится бит в глобальном регистре флагов прерываний CAN (бит UCEIF в регистре CAN_GIF).

[Временный запрет ящиков]

Если этот ящик используется для автоматической обработки фреймов remote, то поле данных в нем должно быть обновлено без потери входящего запрашивающего фрейма remote, и без отправки неправильных данных. Таким образом, контроллер CAN позволяет временно запретить ящик, что может быть осуществлено программированием регистра временного запрета ящика (mailbox temporary disable, регистр CAN_MBTD).

Указатель на запрашиваемый ящик должен быть записан в биты TDPTR[4:0] регистра CAN_MBTD, и должен быть установлен бит запроса временного запрета ящика (temporary disable request, TDR). Внутренней логикой будет впоследствии установлен бит временного запрета ящика (temporary disable, TDA).

Если ящик сконфигурирован как передающий (MDn=0), и установлен бит TDA, то содержимое поля данных этого ящика можно обновлять. Если в этот момент придет запрос фрейма remote, пока ящик временно запрещен, то соответствующий бит запроса передачи (TRSn) установится внутренней логикой, и код DLC пришедшего сообщения запишется в соответствующий ящик. Однако запрашиваемое сообщение не будет отправлено, пока не будет очищен запрос временного запрета (TDR=0). Подобным образом все запросы на передачу для временно запрещенных ящиков будут игнорироваться до момента очистки TDR. Дополнительно передача сообщения будет немедленно оборвана, если ящик временно запрещен, и установлен соответствующий бит TRRn для этого ящика.

Если ящик сконфигурирован на прием (MDn=1), флаг временного запроса установлен и этот ящик не обрабатывается. Если пришло сообщение для ящика n, который временно запрещен, то внутренняя логика ждет до завершения приема или есть ошибка шины CAN для установки TDA. Как только TDA установлен, ящик может быть полностью запрещен (MCn=0) без риска потери входящего сообщения. Бит запроса на временный запрет (TDR) должен быть сброшен так быстро, как это только возможно.

Когда бит TDA установлен для имеющегося ящика, можно обновлять только поле данных этого ящика. Доступ к управляющим битам и идентификатору запрещен.

[Прерывания CAN]

Модуль CAN предоставляет 3 независимых прерывания: 2 прерывания ящика (прерывание приема ящика MBRIRQ и прерывание передачи ящика MBTIRQ), и глобальное прерывание CAN GIRQ. Значения этих трех прерываний могут быть прочитаны в регистрах статуса прерываний.

Прерывания ящика. Каждый из 32 ящиков модуля CAN может генерировать прерывание приема или передачи, в зависимости от конфигурации ящика. Чтобы разрешить ящику генерировать прерывание, установите соответствующий бит MBIMn в регистре CAN_MBIMx.

Если ящик сконфигурирован на прием, то соответствующий флаг прерывания приема установится (MBRIFn=1 в регистре CAN_MBRIFx) после того, как принятое сообщение будет сохранено в ящик n (RMPn=1 в регистре CAN_RMPx). Если используется автоматическая обработка фрейма remote, то флаг прерывания приема установится после того, как запрашиваемый фрейм данных будет сохранен в ящик. Если установлен любой бит MBRIFn в регистре CAN_MBRIFx, то выход прерывания MBRIRQ будет сгенерирован в регистре CAN_INTR. Чтобы очистить запрос на прерывание MBRIRQ, все установленные биты MBRIFn должны быть очищены программно записью 1 в эти биты регистра CAN_MBRIFx.

Если ящик сконфигурирован на передачу, установится соответствующий флаг прерывания (MBTIFn=1 в регистре CAN_MBTIFx) после того, как сообщение в ящике n будет успешно отправлено (TAn=1 в регистре CAN_TAx). Биты TAn сохранят состояние даже после того, как соответствующий ящик n запрещен (MCn=0). Если используется автоматическая обработка фрейма remote, флаг прерывания передачи установится после того, как запрашиваемый фрейм данных будет отправлен из этого ящика. Если установлен любой бит MBTIFn в регистре CAN_MBTIFx, будет сгенерирован выход прерывания MBTIRQ в регистре CAN_INTR. Чтобы очистить запрос на прерывание MBTIRQ, все установленные биты MBTIFn должны быть очищены программно записью 1 в эти биты регистра CAN_MBTIFx.

Глобальное прерывания статуса CAN. Логика глобального прерывания состояния CAN (global CAN status interrupt) реализована с тремя регистрами - регистр глобальной маски прерываний CAN (global CAN interrupt mask, CAN_GIM), где каждый источник прерывания может быть разрешен или запрещен индивидуально; глобальный регистр состояния прерывания CAN (global CAN interrupt status, CAN_GIS); и глобальный регистр флагов прерывания CAN (global CAN interrupt flag, CAN_GIF). Биты маски прерывания влияют только на содержимое глобального регистра флагов CAN (CAN_GIF). Если бит маски не установлен, то соответствующий бит флага не установится, когда произошло соответствующее событие. Однако биты состояния в глобальном регистре статуса прерываний (CAN_GIS) все равно установятся, если произошло соответствующее событие прерывания, независимо от состояния бит маски. Таким образом, биты статуса можно использовать для опроса наличия событий прерывания.

Бит выхода глобального статуса прерывания CAN (global CAN status interrupt output, GIRQ) в регистре глобального статуса прерываний CAN (регистр CAN_GIS) установится только если установится бит в регистре CAN_GIF. Бит GIRQ останется установленным, пока установлен хотя бы один бит в регистре флагов CAN_GIF. Все биты в регистрах статуса прерывания и флагов прерывания останутся установленными, пока они не будут очищены программно, или пока не произойдет программный сброс.

Замечание: в обработчике прерывания (ISR) защелка прерывания должна быть очищена операцией записи W1C в соответствующий бит регистра CAN_GIS. Это очистит соответствующие биты в обоих регистрах CAN_GIS и CAN_GIF.

Несколько событий прерывания могут активировать это прерывание GIRQ:

• Прерывание запрета доступа (access denied interrupt, ADIM, ADIS, ADIF). Как минимум один доступ к RAM ящика произошел во время обновления данных внутренней логикой.
• Прерывание срабатывания внешнего выхода (external trigger output interrupt, EXTIM, EXTIS, EXTIF). Произошло событие внешнего триггера.
• Прерывание превышения значения универсального счетчика (universal counter exceeded interrupt, UCEIM, UCEIS, UCEIF). Было переполнение универсального счетчика (в режиме метки времени time stamp или в режиме подсчета событий event counter) или счетчик достиг значения 0x0000 (в сторожевом режиме, watchdog mode).
• Прерывание потери принятого сообщения (receive message lost interrupt, RMLIM, RMLIS, RMLIF). Сообщение было принято для ящика, который содержал не прочитанные данные. Установится как минимум 1 бит регистра потерянного сообщения приема (receive message lost, CAN_RMLx). Если бит в CAN_GIS (и CAN_GIF) сброшен, и как минимум один бит в CAN_RMLx все еще установлен, бит в CAN_GIS (и CAN_GIF) не установится снова. Сигнал внутреннего источника прерывания активен только если установится новый бит в CAN_RMLx.
• Прерывание подтверждения обрыва (abort acknowledge interrupt, AAIM, AAIS, AAIF). Установился как минимум один бит AAn в регистрах подтверждения обрыва (abort acknowledge, CAN_AAx). Если бит в CAN_GIS (и CAN_GIF) сброшен, и как минимум один бит в CAN_AAx все еще установлен, то бит в CAN_GIS (и CAN_GIF) не установится снова. Внутренний сигнал источника прерывания активен только при установке нового бита в CAN_AAx. Биты AAn сохранят свое состояние даже после запрета соответствующего ящика n (MCn=0).
• Прерывания при попытке доступа к не реализованному адресу (access to unimplemented address interrupt, UIAIM, UIAIS, UIAIF). Был доступ со стороны CPU к адресу, который не реализован в модуле контроллера.
• Прерывание пробуждения (wakeup interrupt, WUIM, WUIS, WUIF). Модуль CAN вышел из режима сна, потому что была определена активность на линии шины CAN.
• Прерывание выключения шины (Bus-Off interrupt, BOIM, BOIS, BOIF). Модуль CAN вошел в состояние bus-off. Этот источник прерывания активен, если статус ядра CAN поменялось от нормального рабочего режима (normal operation mode) к режиму отключения шины (bus-off mode). Если бит в CAN_GIS (и CAN_GIF) сброшен, и состояние режима bus-off все еще активно, то этот бит не будет установлен снова. Если модуль выйдет из режима bus-off, то бит в CAN_GIS (и CAN_GIF) останется установленным.
• Прерывание пассивной ошибки (Error-Passive interrupt, EPIM, EPIS, EPIF). Модуль CAN вошел в состояние error-passive. Этот источник прерывание активен, если модуль CAN поменял свое состояние от режима активной ошибки (error-active mode) на режим пассивной ошибки (error-passive mode). Если бит CAN_GIS (и CAN_GIF) сброшен, и режим error-passive все еще активен, то этот бит не установится снова. Если модуль выйдет из режима error-passive, бит CAN_GIS (и CAN_GIF) останется установленным.
• Прерывание предупреждения ошибки приема (Error warning receive interrupt, EWRIM, EWRIS, EWRIF). Счетчик ошибок CAN (CAN receive error counter, RXECNT) достиг предела предупреждения. Если бит в CAN_GIS (и CAN_GIF) сброшен, и режим error warning все еще активен, то этот бит не установится снова. Если модуль выйдет из режима error warning, то бит CAN_GIS (и CAN_GIF) останется установленным.
• Прерывание предупреждения ошибки передачи (Error warning transmit interrupt, EWTIM, EWTIS, EWTIF). Счетчик ошибок передачи CAN (CAN transmit error counter, TXECNT) достиг предела предупреждения. Если бит в CAN_GIS (и CAN_GIF) сброшен, и режим error warning все еще активен, этот бит не установится снова. Если модуль выйдет из режима error warning, бит в CAN_GIS (и CAN_GIF) останется установленным.

[Счетчик событий]

Для диагностических функций можно использовать универсальный счетчик CAN как счетчик событий (event counter). Счетчик может быть запрограммирован 4-битным полем UCCNF[3:0] регистра CAN_UCCNF чтобы он инкрементировался при одном из этих событий:

• UCCNF[3:0] = 0x6 – CAN error frame. Счетчик инкрементируется, если на линии шины CAN появляется фрейм ошибки.
• UCCNF[3:0] = 0x7 – CAN overload frame. Счетчик инкрементируется, если на линии шины CAN появляется фрейм перегрузки (overload frame).
• UCCNF[3:0] = 0x8 – Lost arbitration. Счетчик инкрементируется каждый раз, когда происходит проигрыш арбитража на линии CAN во время передачи.
• UCCNF[3:0] = 0x9 – Transmission aborted. Счетчик инкрементируется каждый раз, когда происходит проигрыш арбитража или запрос на передачу отменен (установлен AAn).
• UCCNF[3:0] = 0xA – Transmission succeeded. Счетчик инкрементируется каждый раз, когда сообщение было отправлено без детектированных ошибок (успешная передача, установлен TAn).
• UCCNF[3:0] = 0xB – Receive message rejected. Счетчик инкрементируется каждый раз, когда сообщение принято без детектирования ошибок, но оно не было сохранено в ящике, потому что не было найдено совпадающих идентификаторов.
• UCCNF[3:0] = 0xC – Receive message lost. Счетчик инкрементируется каждый раз, когда сообщение принято без детектирования ошибок, но оно не было сохранено в ящике, потому что ящик содержит не прочитанные данные (установлен RMLn).
• UCCNF[3:0] = 0xD – Message received. Счетчик инкрементируется каждый раз, когда сообщение было принято без детектированных ошибок, было ли оно отброшено или сохранено в ящике.
• UCCNF[3:0] = 0xE – Message stored. Счетчик инкрементируется каждый раз, когда сообщение было принято без детектированных ошибок, имеется совпадающий идентификатор на разрешенном ящике, и сообщение сохранено в приемном ящике (установлен RMPn).
• UCCNF[3:0] = 0xF – Valid message. Счетчик инкрементируется каждый раз, когда на линии шины CAN было детектировано допустимое переданное или принятое сообщение.

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

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

Программируемые пределы генерации предупреждений (Programmable Warning Limits). Можно запрограммировать уровень предупреждений раздельно для EWTIS (error warning transmit interrupt status) и EWRIS (error warning receive interrupt status) путем записи в поля уровня счетчика предупреждений об ошибках для приема (EWLREC) и передачи (EWLTEC) в регистре уровня предупреждения счетчика ошибок CAN (CAN_EWR). После сброса при включении питания регистр CAN_EWR установится в свой уровень предупреждений по умолчанию 96 для обоих счетчиков ошибок. После программного сброса содержимое этого регистра не изменяется.

CAN Error Handling (обработка ошибок CAN). Управление ошибками является интегральной частью стандарта CAN. При передачах могут возникать 5 разных видов ошибок:

• Bit error (ошибка бита). Эта ошибка может быть детектирована только передающем узлом. Каждый раз, когда узел передает, он постоянно мониторит вывод приема (CANRX) и сравнивает принятые данные с переданными. Во время фазы арбитража узел просто откладывает передачу, если принятые и переданные данные не совпадают (при несовпадении предполагается потеря арбитража). Однако после фазы арбитража (т. е. как только бит RTR был успешно отправлен), ошибка бита сигнализирует в любое время от том, что значение на CANRX не равно переданному через CANTX.
• Form error (ошибка формы). Эта ошибка происходит в любое время, когда позиция бита фиксированной формы во фрейме CAN содержит один или большее количество недопустимых бит, т. е. когда был детектирован недопустимый доминантный бит на разделителе (delimiter) или в позиции бит конца фрейма (end-of-frame).
• Acknowledge error (ошибка подтверждения). Эта ошибка возникает всякий раз, когда сообщение было отправлено, но ни один из приемников не притянул к доминантному уровню бит подтверждения (acknowledge bit).
• CRC error (ошибка контрольной суммы). Эта ошибка возникает всякий раз, когда приемник вычислил CRC по данным и обнаружил различие в CRC, которое было передано по шине.
• Stuff error (ошибка вставки бита). Спецификация CAN требует, чтобы передатчик вставлял дополнительный бит (stuff bit) в противоположное значение после того, как было передано 5 бит одинакового значения. Приемник игнорирует эти stuff-биты. Однако он использует перепады этого бита для уточнения собственной синхронизации по сигналу. Ошибка stuff возникает всякий раз, когда принимающий узел обнаруживает 6 следующих друг за другом бит одинакового значения.

Как только модуль CAN детектирует любую из вышеописанных ошибок, он обновляет регистр статуса ошибки CAN_ESR, а также регистр счетчика ошибок CAN_CEC. В дополнение к стандартным ошибкам регистр CAN_ESR предоставляет флаг, который сигнализирует, когда вывод CANRX залип на доминантный уровень, показывая возможное короткое замыкание проводов линии.

Error Frames (фреймы ошибки). Первоочередное значение имеет тот факт, что все узлы на шине CAN игнорируют фреймы данных, который один из узлов не смог принять. Чтобы это реализовать, каждый узел посылает фрейм ошибки, как только он определил ошибку (см. рис. 17-10).

Как только устройство определило ошибку, оно все еще завершает исходящий бит, и инициирует фрейм ошибки путем отправки 6 доминантных бит и 8 рецессивных бит на шине. Это нарушает правило бит-стаффинга, и информирует все узлы, что исходящий фрейм должен быть отброшен.

Все приемники, которые не определили ошибку передачи, прежде всего теперь определять ошибку stuff-бита. Передатчик раньше может детектировать обычную ошибку бита. Он оборвет передачу исходящего фрейма, и попробует его снова отправить позже.

В завершение все узлы на шине определят ошибку. Следовательно, все они также пошлют 6 доминантных и 8 рецессивных бит на шину. Получившийся фрейм ошибки состоит из двух разных полей. Первое поле получено путем наложения флагов ошибки, полученных от разных станций, и является последовательностью из доминантных бит, от 6 до 12. Второе поле это разделитель ошибки, и оно состоит из 8 рецессивных бит, показывающих конец фрейма.

Blackfin CAN Error scenario example fig17 10

Рис. 17-10. Пример сценария ошибки CAN.

Для ошибок CRC фрейм ошибки инициируется в конце фрейма, вместо немедленной инициации после ошибочного бита.

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

Из-за того, что передача error frame разрушает фрейм в процессе передачи, отказавший узел ошибочно детектировавший ошибку, может блокировать шину. По этой причине есть 2 состояния узла, которые определяют право узла сигнализировать об ошибке - error active и error passive. Error active узлы это те, у которых частота определения ошибок ниже определенного лимита. Эти узлы притягивают флаг активной ошибки (active error flag) из 6 доминантных бит.

Узлы с более высокой частотой детектирования ошибок подозреваются на наличие у них локальных проблем, и таким образом у них ограниченное право сигнализировать об ошибках. Это узлы пассивной ошибки (error passive nodes), которые выдают флаг пассивной ошибки (passive error flag), состоящий из 6 рецессивных бит. Таким образом, передающий узел с пассивной ошибкой все еще может информировать другие узлы об обрыве своего передаваемого фрейма, но он больше не может уничтожать совместно принимаемые фреймы от других узлов.

Error Levels (уровни ошибок). Спецификация CAN требует, чтобы каждый узел в системе работал на оном из 3 уровней (см. таблицу 17-3). Это предотвращает блокировку узлами всей сети при высокой частоте возникновения ошибок, поскольку ошибки могут быть вызваны локальными неисправностями аппаратуры узла. Модуль CAN процессора Blackfin предоставляет счетчик ошибок для передачи (TEC), и счетчик ошибок для приема (REC). Регистр счетчика ошибок CAN (error count register, CAN_CEC) размещает в себе оба этих счетчика.

После инициализации оба счетчика, и TEC и REC, содержат 0. Каждый раз, когда произошла ошибка, один из этих счетчиков увеличивается либо на 1, либо на 8, в зависимости от ситуации ошибки (документировано в версии 2.0 спецификации CAN). Успешная работа передачи и приема декрементирует соответствующий счетчик на 1.

Если любой из счетчиков превысит значение 127, то модуль CAN переходит в пассивное состояние и установится бит пассивного состояния ошибки CAN (error passive mode, EP) в регистре CAN_STATUS. После этого узлу не разрешается больше посылать активные фреймы ошибки (содержащие доминантные биты). Однако узлу все еще разрешено передавать сообщения и сигнализировать фреймами пассивной ошибки в тех случаях, когда передача потерпела неудачу из-за ошибки бита (bit error).

Если один из счетчиков превысит 255 (т. е. когда переполнится 8-битный счетчик ошибки), то модуль CAN отключается от шины. Он переходит в состояние отключения шины (bus-off mode), и установится бит CAN error bus-off mode (EBO) в регистре CAN_STATUS. Для восстановления из этого состояния требуется вмешательство программного обеспечения.

Таблица 17-3. Описание уровней ошибки CAN (CAN Error Level).

Уровень Условие Описание
Error Active Счетчик ошибок передачи или счетчик ошибок приема < 128 Это начальный уровень условия возникновения ошибок. Пока количество ошибок в любом из счетчиков меньше 128, узел будет выдавать флаги активной ошибки (с доминантными уровнями) во время генерации фреймов ошибки.
Error Passive Счетчик ошибок передачи или счетчик ошибок приема ≥ 128, но меньше 256. Ошибки накопились до уровня, на котором узел выдает флаги пассивной ошибки (с рецессивными уровнями) во время генерации фреймов ошибки.
Bus Off Переполнился любой из счетчиков ошибок приема или передачи (при инкременте значения 255 счетчика). Модуль CAN перешел в режим отключения от шины.

В дополнение к этим уровням модуль CAN также предоставляет механизм предупреждений, который расширяет спецификацию CAN. Есть отдельные предупреждения для передачи и приёма. По умолчанию, когда один из счетчиков превысит 96, поступает сигнал предупреждения в регистре CAN_STATUS либо битом флага CAN receive warning (WR), либо битом флага CAN transmit warning (WT). Уровень предупреждения может быть запрограммирован с использованием регистра предупреждения об ошибке (error warning register, CAN_EWR). Более подробно этот регистр описан во врезке "Регистры ошибки".

Дополнительно может произойти прерывание для всех этих уровней путем демаскирования их в регистре глобальной маски прерываний CAN (CAN interrupt mask register, CAN_GIM), показанный во врезке "Глобальные регистры CAN". Прерывания включают: bus-off interrupt (BOIM), error-passive interrupt (EPIM), error warning receive interrupt (EWRIM) и error warning transmit interrupt (EWTIM).

Во время последовательности восстановления из состояния отключения от шины (bus-off), бит запроса режима конфигурирования в регистре CAN_CONTROL устанавливается внутренней логикой (CCR=1), поэтому ядро модуля CAN не выйдет автоматически из режима bus-off. Бит CCR не может быть сброшен, пока не завершится последовательность восстановления из состояния bus-off.

Замечание: это поведение можно отменить установкой бита автоматического подключения к шине (auto-bus on, ABO) в регистре CAN_CONTROL. После выхода из режима bus-off или из режима конфигурации, счетчики ошибок CAN сбросятся.

Модуль CAN содержит функции режима тестирования, которые помогают в отладке программного обеспечения и системы CAN. Листинг 17-1 предоставляет пример разрешения функций отладки CAN.

Замечание: когда используются эти возможности, модуль CAN может быть не совместимымм со спецификацией CAN. Все режимы тестирования должны быть разрешены или запрещены только когда модуль находится в режиме конфигурации (CCA=1 в регистре CAN_STATUS) или в режиме приостановки (suspend mode, CSA=1 в регистре CAN_STATUS).

Бит CDE используется для получения доступа ко всем возможностям отладки. Этот бит должен быть установлен для разрешения режима тестирования, и должен быть записан первым перед последующими записями в регистр CAN_DEBUG. Когда бит CDE очищен, все функции отладки запрещены.

//Листинг 17-1. Разрешение функций CAN Debug на языке C.
#include < cdefBF537.h >
/* Разрешение debug mode, CDE должен быть установлен перед тем,
   как будут изменены другие флаги в регистре */
*pCAN_DEBUG |= CDE;
/* Установка флагов отладки (debug flags) */
*pCAN_DEBUG &= ~DTO;*pCAN_DEBUG |= MRB | MAA | DIL;
 
/* Запуск кода тестирования */
 
/* Запрет debug mode */
*pCAN_DEBUG &= ~CDE;

Когда бит CDE установлен, это разрешает записи в другие биты регистра CAN_DEBUG. Это также разрешает следующие функции, не совместимые со стандартом CAN:

• Регистры параметров длительности бита (Bit timing registers) могут быть изменены в любой момент времени, не только во время режима конфигурации. Это включает регистры CAN_CLOCK и CAN_TIMING.
• Разрешен доступ на запись в регистр счетчиков ошибок передачи/приема CAN_CEC, который в нормальном режиме доступен только на чтение.

Бит mode read back (MRB) используется для разрешения режима зацикливания. В этом режиме сообщение, передаваемое по шине CAN (или через internal loop back mode) принимается обратно непосредственно во внутренний буфер приема. После корректной передачи внутренняя логика рассматривает это как нормально принятое сообщение. Эта функция позволяет пользователю тестировать тестировать функции CAN без наличия внешнего устройства.

Бит mode auto acknowledge (MAA) позволяет модулю CAN генерировать свое собственное подтверждение в время слота ACK фрейма CAN. Не требуется внешних устройств или соединений для обратного чтения переданного сообщения. В этом режиме сообщение, которое было отправлено, автоматически сохранится во внутренний буфер приема. В режиме auto acknowledge mode модуль сам себе передает подтверждение. Это подтверждение может быть запрограммировано для появления на выводе CANTX, если DIL=1 и DTO=0. Если подтверждение используется только внутри, то эти биты режима тестирования должны быть установлены в значения DIL=0 и DTO=1.

Бит disable internal loop (DIL) используется для того, чтобы внутри микросхемы замкнуть выход передачи на вход приема.

Бит disable transmit output (DTO) используется для запрета вывода выхода CANTX. Когда этот бит установлен, вывод CANTX постоянно выдает рецессивные биты.

Бит disable receive input (DRI) используется для запрета вывода входа CANRX. Когда этот бит установлен, внутренняя логика принимает рецессивные биты или принимает генерируемое внутри модуля передаваемое значение в случае, когда разрешено внутреннее зацикливание (internal loop enabled, DIL=0). В любом случае, значения уровней, поступающих снаружи на вывод CANRX, игнорируются.

Бит disable error counters (DEC) используется для запрета счетчиков ошибок передачи и приема в регистре CAN_CEC. Когда этот бит установлен, CAN_CEC содержит текущее значение счетчиков, и не разрешен инкремент или декремент счетчиков ошибок. Этот режиме не удовлетворяет спецификации CAN.

Замечание: записи в счетчики ошибок должны осуществляться только в режиме отладки. Доступ на запись во время приема может привести к неопределенным значениям. Максимальное значение, которое можно записать в счетчики ошибок, равно 255. Таким образом значение счетчика ошибок 256, которое переводит модуль в состояние bus-off, не может быть записано в счетчики ошибок.

В таблице 17-4 показаны общие комбинации бит режима тестирования.

Таблица 17-4. Режимы CAN Test.

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.
Обратное чтение (read back) разрешено.
Требуется подтверждение от внешнего устройства.
1 1 1 0 0 1 Обычная передача по линии шины CAN.
Обратное чтение (read back) разрешено.
Не требуется внешнее подтверждение.
Переданное сообщение и подтверждение передается по линии шины CAN.
Разрешен вход CANRX.
1 1 0 0 0 1 Обычная передача по линии шины CAN.
Обратное чтение (read back) разрешено.
Не требуется внешнее подтверждение.
Переданное сообщение и подтверждение передается по линии шины CAN.
Разрешен вход CANRX и разрешено внутреннее зацикливание с выхода на вход (internal loop, логическое ИЛИ сигналов TX и RX).
1 1 0 0 1 1 Обычная передача по линии шины CAN.
Обратное чтение (read back) разрешено.
Не требуется внешнее подтверждение.
Переданное сообщение и подтверждение передается по линии шины CAN.
Вход CANRX игнорируется.
Разрешено внутреннее зацикливание (internal loop).
1 1 0 1 1 1 Нет передачи по линии шины CAN.
Не требуется внешнее подтверждение.
Ни передаваемое сообщение, ни подтверждение не передается через CANTX.
Вход CANRX игнорируется.
Разрешено внутреннее зацикливание (internal loop).

Процессор Blackfin предоставляет состояние гибернации с низким потреблением мощности (low power hibernate state), и модуль CAN включает встроенные режимы сна и приостановки (sleep, suspend modes) для экономии энергии. Поведение модуля CAN в этих трех режимах описано в следующих секциях.

CAN Built-In Suspend Mode (встроенный режим приостановки). Самым скромным по энергопотреблению из всех режимов low power - suspend mode. В этот режим входят установкой бита запроса приостановки (suspend mode request, CSR) в регистре CAN_CONTROL. Модуль войдет в suspend mode после завершения текущей операции на шине CAN, в этот момент внутренняя логика установит бит подтверждения входа в приостановку (suspend mode acknowledge, CSA) в регистре CAN_STATUS.

Замечание: если режим suspend запрошен во время последовательности восстановления из состояния отключения от шины (bus-off recovery sequence), то модуль остановится после того, как будет завершена последовательность bus-off recovery. Модуль не войдет в suspend mode, и бит CSA не установится. Программа должна вручную очистить бит CSR, чтобы перезапустить модуль.

После входа в этот режим модуль больше не активен на линии шины CAN, что незначительно снижает потребляемую мощность. Когда модуль CAN находится в suspend mode, вывод выхода CANTX остается на рецессивном уровне, и модуль не принимает и не передает сообщения или фреймы ошибки. Содержимое счетчиков ошибок CAN остается неизменным.

Из suspend mode можно впоследствии выйти очисткой бита CSR в регистре CAN_CONTROL. Отличие между suspend mode и configuration mode только в том, что запись в CAN_CLOCK и CAN_TIMING в suspend mode все еще заблокирована, и регистры управления и статуса CAN не сбрасываются, когда осуществляется выход из suspend mode.

CAN Built-In Sleep Mode (встроенный режим сна). Следующий уровень энергопотребления может быть реализован использованием встроенного в модуль CAN режима сна (sleep mode). В этот режим входят установкой бита запроса входа в режим сна (sleep mode request, SMR) в регистре CAN_CONTROL. Модуль войдет в sleep mode после того, как завершится текущая операция на шине CAN. Как только произошел вход в этот режим, многие сигналы тактов модуля CAN выключаются, снижая потребление мощности, и установится бит подтверждения режима сна (sleep mode acknowledge, SMACK) в регистре CAN_INTR. Когда модуль CAN находится в режиме сна, чтения всех регистров вернут содержимое CAN_INTR вместо обычного своего содержимого. Записи во все регистры игнорируются, кроме регистра CAN_INTR.

Малая часть модуля продолжает тактироваться, чтобы оставить возможность вывести аппаратуру CAN из сна. Запись в регистр CAN_INTR завершает режим сна. Если бит WBA в регистре CAN_CONTROL установлен перед входом в режим сна, появление доминантного бита на выводе CANRX также завершит режим сна.

CAN Wakeup From Hibernate State (пробуждение из состояния гиберанции). Самая большая экономия энергии осуществляется, когда процессор Blackfin находится в состоянии гибернации (hibernate state), в котором внутренний регулятор напряжения выключается, снимается питание с ядра, и внутренние системные такты выключаются. В этом режиме потребление энергии дают только ток ожидания (примерно 50 mkA), который используется схемой регулятора для возможного события пробуждения из гибернации. Одним из таких событий пробуждения может быть появление активности на шине CAN. После выхода из гибернации модуль CAN должен быть повторно инициализирован.

Для разработок с малым потреблением мощности внешний трансивер шины CAN обычно переводится в режим standby с помощью одного из выводов порта общего назначения процессора Blackfin (general purpose I/O, GPIO). В режиме standby трансивер CAN постоянно поддерживает рецессивный уровень лог. 1 на выводе CANRX. Если затем трансивер определил активность шины CAN, то он переведет вывод CANRX в доминантный уровень лог. 0. Это дает сигнал процессору Blackfin, что была детектирована активность на шине CAN. Если внутренний регулятор напряжения запрограммирован для распознавания активности шины CAN в качестве события для выхода из hibernate state, то аппаратура ответит соответствующим образом. Иначе активность на выводе CANRX не окажет никакого влияния на состояние процессора.

Чтобы разрешить эту функциональность, регистр управления напряжением (voltage control register, VR_CTL) должен быть запрограммирован с установленным битом CAN wakeup enable. Типовая последовательность использования функции пробуждения от CAN (CAN wakeup):

1. Используйте вывод порта GPIO для перевода внешней микросхемы трансивера CAN в режим standby.
2. Запрограммируйте регистр VR_CTL с установленным битом разрешения пробуждения CAN (CAN wakeup enable, CANWE), и установите в 0 бит HIBERNATEB.

[Регистры CAN]

Следующие секции описывают регистры CAN:

• Глобальные регистры CAN.
• Регистры Mailbox/Mask.
• Регистры управления Mailbox.
• Регистры универсального счетчика.
• Регистры ошибки.

Таблицы от 17-5 до 17-9 показывают функции регистров CAN.

Таблица 17-5. Глобальные регистры CAN.

Имя регистра Функция Замечания
CAN_CONTROL Master control register (главный регистр управления) Зарезервированные биты 15:8 и 3 должны всегда записываться как лог. 0.
CAN_STATUS Global CAN status register (регистр глобального состояния CAN) Доступ на запись не дает никакого эффекта.
CAN_DEBUG CAN debug register (регистр отладки CAN) Использование режимов отладки не является совместимым со стандартом CAN.
CAN_CLOCK CAN clock register (регистр настройки тактирования CAN) Доступ возможен только в режиме конфигурации контроллера CAN.
CAN_TIMING CAN timing register (регистр настройки интервалов времени бита CAN) Доступ возможен только в режиме конфигурации контроллера CAN.
CAN_INTR CAN interrupt register (регистр прерываний CAN) Зарезервированные биты 15:8 и 5:4 должны всегда записываться как лог. 0.
CAN_GIM Global CAN interrupt mask register (регистр глобальной маски прерываний) Биты 15:11 зарезервированы.
CAN_GIS Global CAN interrupt status register (регистр глобального состояния прерываний) Биты 15:11 зарезервированы.
CAN_GIF Global CAN interrupt flag register (регистр глобальных флагов прерываний) Биты 15:11 зарезервированы.

Эти регистры называются "глобальными", потому что они влияют на работу контроллера CAN целиком, и на все его ящики.

[CAN_CONTROL]

Blackfin CAN CONTROL fig17 11

Рис. 17-11. Главный регистр управления CAN_CONTROL.

[CAN_STATUS]

Blackfin CAN STATUS fig17 12

Рис. 17-12. Глобальный регистр состояния CAN_STATUS (доступ только на чтение, RO).

• Mail box pointer (MBPTR[4:0]), указатель ящика. Представляет номер ящика текущего передаваемого сообщения. После успешной передачи эти биты остаются неизменными.

11111 означает, что сейчас обрабатывается сообщение ящика 31.
...
...
00000 означает, что сейчас обрабатывается сообщение ящика 0.

[CAN_DEBUG]

Blackfin CAN DEBUG fig17 13

Рис. 17-13. Регистр отладки CAN_DEBUG.

[CAN_CLOCK]

Blackfin CAN CLOCK fig17 14

Рис. 17-14. Регистр тактирования CAN_CLOCK.

[CAN_TIMING]

Blackfin CAN TIMING fig17 15

Рис. 17-15. Регистр настройки интервалов бита CAN_TIMING.

[CAN_INTR]

Blackfin CAN INTR fig17 16

Рис. 17-16. Регистр прерываний CAN_INTR (доступ только на чтение, RO).

[CAN_GIM]

Blackfin CAN GIM fig17 17

Рис. 17-17. Регистр глобальной маски прерываний CAN_GIM.

[CAN_GIS]

Blackfin CAN GIS fig17 18

Рис. 17-18. Регистр глобального статуса прерываний CAN_GIS (все биты этого регистра могут быть очищены операцией W1C).

[CAN_GIF]

Blackfin CAN GIF fig17 19

Рис. 17-19. Регистр глобальных флагов прерываний CAN_GIF.

Таблица 17-6. Регистры Mailbox/Mask.

Имя регистра Функция Замечания
CAN_AMxxH,
CAN_AMxxL
Acceptance mask registers (регистры фильтра приема) Изменяются только когда ящик MBxx запрещен.
CAN_MBxx_ID1,
CAN_MBxx_ID0
Mailbox word 7/6 register (регистр слов 7, 6 области памяти ящика) Не записывайте, когда ящик MBxx разрешен.
CAN_MBxx_TIMESTAMP Mailbox word 5 register (регистр слова 5 области памяти ящика) Содержит метку времени, когда активен режим time stamp.
CAN_MBxx_LENGTH Mailbox word 4 register (регистр слова 4 области памяти ящика) Значение больше 8 обрабатывается как значение 8.
CAN_MBxx_DATA3,
CAN_MBxx_DATA2,
CAN_MBxx_DATA1,
CAN_MBxx_DATA0
Mailbox word 3/2/1/0 register (регистр слов 3, 2, 1, 0 области памяти ящика) Программа управляет корректным чтением поля данных на основе значения DLC.

[CAN_AMxxH, CAN_AMxxL]

В этих регистрах хранятся настройки фильтрации ящиков на приеме. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера).

Blackfin CAN AMxxH fig17 20

Рис. 17-20. Регистр маски фильтра приема CAN_AMxxH, старшая часть (Acceptance Mask Register).

Значение регистра acceptance mask не имеет значения, когда бит AME сброшен (находится в регистре CAN_MBxx_ID1). Если бит AME установлен, то эти биты маски сравниваются с принятым идентификаторам в тех позициях бит, где бит маски очищен. В позиции бита, где бит маски единица, совпадение бита идентификатора не требуется. С помощью этой функции можно настроить ящик на прием группы идентификаторов сообщений.

Таблица 17-10. MMR-адреса регистров Acceptance Mask (старшая часть маски).

Имя регистра Memory-Mapped адрес регистра
CAN_AM00H 0xFFC0 2B04
CAN_AM01H 0xFFC0 2B0C
CAN_AM02H 0xFFC0 2B14
CAN_AM03H 0xFFC0 2B1C
CAN_AM04H 0xFFC0 2B24
CAN_AM05H 0xFFC0 2B2C
CAN_AM06H 0xFFC0 2B34
CAN_AM07H 0xFFC0 2B3C
CAN_AM08H 0xFFC0 2B44
CAN_AM09H 0xFFC0 2B4C
CAN_AM10H 0xFFC0 2B54
CAN_AM11H 0xFFC0 2B5C
CAN_AM12H 0xFFC0 2B64
CAN_AM13H 0xFFC0 2B6C
CAN_AM14H 0xFFC0 2B74
CAN_AM15H 0xFFC0 2B7C
CAN_AM16H 0xFFC0 2B84
CAN_AM17H 0xFFC0 2B8C
CAN_AM18H 0xFFC0 2B94
CAN_AM19H 0xFFC0 2B9C
CAN_AM20H 0xFFC0 2BA4
CAN_AM21H 0xFFC0 2BAC
CAN_AM22H 0xFFC0 2BB4
CAN_AM23H 0xFFC0 2BBC
CAN_AM24H 0xFFC0 2BC4
CAN_AM25H 0xFFC0 2BCC
CAN_AM26H 0xFFC0 2BD4
CAN_AM27H 0xFFC0 2BDC
CAN_AM28H 0xFFC0 2BE4
CAN_AM29H 0xFFC0 2BEC
CAN_AM30H 0xFFC0 2BF4
CAN_AM31H 0xFFC0 2BFC

Blackfin CAN AMxxL fig17 21

Рис. 17-21. Регистр маски фильтра приема CAN_AMxxL, младшая часть (Acceptance Mask Register).

Таблица 17-11. MMR-адреса регистров Acceptance Mask (младшая часть маски).

Имя регистра Memory-Mapped адрес регистра
CAN_AM00L 0xFFC0 2B00
CAN_AM01L 0xFFC0 2B08
CAN_AM02L 0xFFC0 2B10
CAN_AM03L 0xFFC0 2B18
CAN_AM04L 0xFFC0 2B20
CAN_AM05L 0xFFC0 2B28
CAN_AM06L 0xFFC0 2B30
CAN_AM07L 0xFFC0 2B38
CAN_AM08L 0xFFC0 2B40
CAN_AM09L 0xFFC0 2B48
CAN_AM10L 0xFFC0 2B50
CAN_AM11L 0xFFC0 2B58
CAN_AM12L 0xFFC0 2B60
CAN_AM13L 0xFFC0 2B68
CAN_AM14L 0xFFC0 2B70
CAN_AM15L 0xFFC0 2B78
CAN_AM16L 0xFFC0 2B80
CAN_AM17L 0xFFC0 2B88
CAN_AM18L 0xFFC0 2B90
CAN_AM19L 0xFFC0 2B98
CAN_AM20L 0xFFC0 2BA0
CAN_AM21L 0xFFC0 2BA8
CAN_AM22L 0xFFC0 2BB0
CAN_AM23L 0xFFC0 2BB8
CAN_AM24L 0xFFC0 2BC0
CAN_AM25L 0xFFC0 2BC8
CAN_AM26L 0xFFC0 2BD0
CAN_AM27L 0xFFC0 2BD8
CAN_AM28L 0xFFC0 2BE0
CAN_AM29L 0xFFC0 2BE8
CAN_AM30L 0xFFC0 2BF0
CAN_AM31L 0xFFC0 2BF8

[CAN_MBxx_ID1]

В этом регистре хранится базовый (11-битный) идентификатор ящика, часть расширенного (29-битного) идентификатора, а также биты, управляющие типом идентификатора, типом ящика и включением фильтрации. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера).

Blackfin CAN MBxx ID1 fig17 22

Рис. 17-22. Регистр Mailbox Word 7, CAN_MBxx_ID1.

Таблица 17-12. MMR-адреса регистров Mailbox Word 7.

Имя регистра Memory-Mapped адрес регистра
CAN_MB00_ID1 0xFFC0 2C1C
CAN_MB01_ID1 0xFFC0 2C3C
CAN_MB02_ID1 0xFFC0 2C5C
CAN_MB03_ID1 0xFFC0 2C7C
CAN_MB04_ID1 0xFFC0 2C9C
CAN_MB05_ID1 0xFFC0 2CBC
CAN_MB06_ID1 0xFFC0 2CDC
CAN_MB07_ID1 0xFFC0 2CFC
CAN_MB08_ID1 0xFFC0 2D1C
CAN_MB09_ID1 0xFFC0 2D3C
CAN_MB10_ID1 0xFFC0 2D5C
CAN_MB11_ID1 0xFFC0 2D7C
CAN_MB12_ID1 0xFFC0 2D9C
CAN_MB13_ID1 0xFFC0 2DBC
CAN_MB14_ID1 0xFFC0 2DDC
CAN_MB15_ID1 0xFFC0 2DFC
CAN_MB16_ID1 0xFFC0 2E1C
CAN_MB17_ID1 0xFFC0 2E3C
CAN_MB18_ID1 0xFFC0 2E5C
CAN_MB19_ID1 0xFFC0 2E7C
CAN_MB20_ID1 0xFFC0 2E9C
CAN_MB21_ID1 0xFFC0 2EBC
CAN_MB22_ID1 0xFFC0 2EDC
CAN_MB23_ID1 0xFFC0 2EFC
CAN_MB24_ID1 0xFFC0 2F1C
CAN_MB25_ID1 0xFFC0 2F3C
CAN_MB26_ID1 0xFFC0 2F5C
CAN_MB27_ID1 0xFFC0 2F7C
CAN_MB28_ID1 0xFFC0 2F9C
CAN_MB29_ID1 0xFFC0 2FBC
CAN_MB30_ID1 0xFFC0 2FDC
CAN_MB31_ID1 0xFFC0 2FFC

[CAN_MBxx_ID0]

В этом регистре часть бит расширенного (29-битного) идентификатора ящика. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера).

Blackfin CAN MBxx ID0 fig17 23

Рис. 17-23. Регистр Mailbox Word 6, CAN_MBxx_ID0.

Таблица 17-13. MMR-адреса регистров Mailbox Word 6.

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

[CAN_MBxx_TIMESTAMP]

В этом регистре хранится метка времени - значение из универсального счетчика, захваченное в момент приема сообщения. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера).

Blackfin CAN MBxx TIMESTAMP fig17 24

Рис. 17-24. Регистр Mailbox Word 5, CAN_MBxx_TIMESTAMP.

Таблица 17-14. MMR-адреса регистров Mailbox Word 5.

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

[CAN_MBxx_LENGTH]

Этот регистр показывает (на приеме) или определяет (на передаче) длину данных в байтах пакета сообщения CAN. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера).

Blackfin CAN MBxx LENGTH fig17 25

Рис. 17-25. Регистр Mailbox Word 4, CAN_MBxx_LENGTH.

Таблица 17-15. MMR-адреса регистров Mailbox Word 4.

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

[Регистры данных CAN_MBxx_DATAx]

В этих регистрах хранятся данные (полезная нагрузка) передаваемого или принимаемого (в зависимости от направления работы ящика) пакета CAN. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера).

Blackfin CAN MBxx DATA3 fig17 26

Рис. 17-26. Регистр Mailbox Word 3, CAN_MBxx_DATA3.

Таблица 17-16. MMR-адреса регистров Mailbox Word 3.

Имя регистра Memory-Mapped адрес регистра
CAN_MB00_DATA3 0xFFC0 2C0C
CAN_MB01_DATA3 0xFFC0 2C2C
CAN_MB02_DATA3 0xFFC0 2C4C
CAN_MB03_DATA3 0xFFC0 2C6C
CAN_MB04_DATA3 0xFFC0 2C8C
CAN_MB05_DATA3 0xFFC0 2CAC
CAN_MB06_DATA3 0xFFC0 2CCC
CAN_MB07_DATA3 0xFFC0 2CEC
CAN_MB08_DATA3 0xFFC0 2D0C
CAN_MB09_DATA3 0xFFC0 2D2C
CAN_MB10_DATA3 0xFFC0 2D4C
CAN_MB11_DATA3 0xFFC0 2D6C
CAN_MB12_DATA3 0xFFC0 2D8C
CAN_MB13_DATA3 0xFFC0 2DAC
CAN_MB14_DATA3 0xFFC0 2DCC
CAN_MB15_DATA3 0xFFC0 2DEC
CAN_MB16_DATA3 0xFFC0 2E0C
CAN_MB17_DATA3 0xFFC0 2E2C
CAN_MB18_DATA3 0xFFC0 2E4C
CAN_MB19_DATA3 0xFFC0 2E6C
CAN_MB20_DATA3 0xFFC0 2E8C
CAN_MB21_DATA3 0xFFC0 2EAC
CAN_MB22_DATA3 0xFFC0 2ECC
CAN_MB23_DATA3 0xFFC0 2EEC
CAN_MB24_DATA3 0xFFC0 2F0C
CAN_MB25_DATA3 0xFFC0 2F2C
CAN_MB26_DATA3 0xFFC0 2F4C
CAN_MB27_DATA3 0xFFC0 2F6C
CAN_MB28_DATA3 0xFFC0 2F8C
CAN_MB29_DATA3 0xFFC0 2FAC
CAN_MB30_DATA3 0xFFC0 2FCC
CAN_MB31_DATA3 0xFFC0 2FEC

Blackfin CAN MBxx DATA2 fig17 27

Рис. 17-27. Регистр Mailbox Word 2, CAN_MBxx_DATA2.

Таблица 17-17. MMR-адреса регистров Mailbox Word 2.

Имя регистра Memory-Mapped адрес регистра
CAN_MB00_DATA2 0xFFC0 2C08
CAN_MB01_DATA2 0xFFC0 2C28
CAN_MB02_DATA2 0xFFC0 2C48
CAN_MB03_DATA2 0xFFC0 2C68
CAN_MB04_DATA2 0xFFC0 2C88
CAN_MB05_DATA2 0xFFC0 2CA8
CAN_MB06_DATA2 0xFFC0 2CC8
CAN_MB07_DATA2 0xFFC0 2CE8
CAN_MB08_DATA2 0xFFC0 2D08
CAN_MB09_DATA2 0xFFC0 2D28
CAN_MB10_DATA2 0xFFC0 2D48
CAN_MB11_DATA2 0xFFC0 2D68
CAN_MB12_DATA2 0xFFC0 2D88
CAN_MB13_DATA2 0xFFC0 2DA8
CAN_MB14_DATA2 0xFFC0 2DC8
CAN_MB15_DATA2 0xFFC0 2DE8
CAN_MB16_DATA2 0xFFC0 2E08
CAN_MB17_DATA2 0xFFC0 2E28
CAN_MB18_DATA2 0xFFC0 2E48
CAN_MB19_DATA2 0xFFC0 2E68
CAN_MB20_DATA2 0xFFC0 2E88
CAN_MB21_DATA2 0xFFC0 2EA8
CAN_MB22_DATA2 0xFFC0 2EC8
CAN_MB23_DATA2 0xFFC0 2EE8
CAN_MB24_DATA2 0xFFC0 2F08
CAN_MB25_DATA2 0xFFC0 2F28
CAN_MB26_DATA2 0xFFC0 2F48
CAN_MB27_DATA2 0xFFC0 2F68
CAN_MB28_DATA2 0xFFC0 2F88
CAN_MB29_DATA2 0xFFC0 2FA8
CAN_MB30_DATA2 0xFFC0 2FC8
CAN_MB31_DATA2 0xFFC0 2FE8

Blackfin CAN MBxx DATA1 fig17 28

Рис. 17-28. Регистр Mailbox Word 1, CAN_MBxx_DATA1.

Таблица 17-18. MMR-адреса регистров Mailbox Word 1.

Имя регистра Memory-Mapped адрес регистра
CAN_MB00_DATA1 0xFFC0 2C04
CAN_MB01_DATA1 0xFFC0 2C24
CAN_MB02_DATA1 0xFFC0 2C44
CAN_MB03_DATA1 0xFFC0 2C64
CAN_MB04_DATA1 0xFFC0 2C84
CAN_MB05_DATA1 0xFFC0 2CA4
CAN_MB06_DATA1 0xFFC0 2CC4
CAN_MB07_DATA1 0xFFC0 2CE4
CAN_MB08_DATA1 0xFFC0 2D04
CAN_MB09_DATA1 0xFFC0 2D24
CAN_MB10_DATA1 0xFFC0 2D44
CAN_MB11_DATA1 0xFFC0 2D64
CAN_MB12_DATA1 0xFFC0 2D84
CAN_MB13_DATA1 0xFFC0 2DA4
CAN_MB14_DATA1 0xFFC0 2DC4
CAN_MB15_DATA1 0xFFC0 2DE4
CAN_MB16_DATA1 0xFFC0 2E04
CAN_MB17_DATA1 0xFFC0 2E24
CAN_MB18_DATA1 0xFFC0 2E44
CAN_MB19_DATA1 0xFFC0 2E64
CAN_MB20_DATA1 0xFFC0 2E84
CAN_MB21_DATA1 0xFFC0 2EA4
CAN_MB22_DATA1 0xFFC0 2EC4
CAN_MB23_DATA1 0xFFC0 2EE4
CAN_MB24_DATA1 0xFFC0 2F04
CAN_MB25_DATA1 0xFFC0 2F24
CAN_MB26_DATA1 0xFFC0 2F44
CAN_MB27_DATA1 0xFFC0 2F64
CAN_MB28_DATA1 0xFFC0 2F84
CAN_MB29_DATA1 0xFFC0 2FA4
CAN_MB30_DATA1 0xFFC0 2FC4
CAN_MB31_DATA1 0xFFC0 2FE4

Blackfin CAN MBxx DATA0 fig17 29

Рис. 17-29. Регистр Mailbox Word 0, CAN_MBxx_DATA0.

Таблица 17-19. MMR-адреса регистров Mailbox Word 0.

Имя регистра Memory-Mapped адрес регистра
CAN_MB00_DATA0 0xFFC0 2C00
CAN_MB01_DATA0 0xFFC0 2C20
CAN_MB02_DATA0 0xFFC0 2C40
CAN_MB03_DATA0 0xFFC0 2C60
CAN_MB04_DATA0 0xFFC0 2C80
CAN_MB05_DATA0 0xFFC0 2CA0
CAN_MB06_DATA0 0xFFC0 2CC0
CAN_MB07_DATA0 0xFFC0 2CE0
CAN_MB08_DATA0 0xFFC0 2D00
CAN_MB09_DATA0 0xFFC0 2D20
CAN_MB10_DATA0 0xFFC0 2D40
CAN_MB11_DATA0 0xFFC0 2D60
CAN_MB12_DATA0 0xFFC0 2D80
CAN_MB13_DATA0 0xFFC0 2DA0
CAN_MB14_DATA0 0xFFC0 2DC0
CAN_MB15_DATA0 0xFFC0 2DE0
CAN_MB16_DATA0 0xFFC0 2E00
CAN_MB17_DATA0 0xFFC0 2E20
CAN_MB18_DATA0 0xFFC0 2E40
CAN_MB19_DATA0 0xFFC0 2E60
CAN_MB20_DATA0 0xFFC0 2E80
CAN_MB21_DATA0 0xFFC0 2EA0
CAN_MB22_DATA0 0xFFC0 2EC0
CAN_MB23_DATA0 0xFFC0 2EE0
CAN_MB24_DATA0 0xFFC0 2F00
CAN_MB25_DATA0 0xFFC0 2F20
CAN_MB26_DATA0 0xFFC0 2F40
CAN_MB27_DATA0 0xFFC0 2F60
CAN_MB28_DATA0 0xFFC0 2F80
CAN_MB29_DATA0 0xFFC0 2FA0
CAN_MB30_DATA0 0xFFC0 2FC0
CAN_MB31_DATA0 0xFFC0 2FE0

Таблица 17-7. Регистры управления Mailbox.

Имя регистра Функция Замечания
CAN_MCx Mailbox configuration registers (регистры конфигурации ящика) Всегда запрещайте ящик перед модификацией области ящика или его направления.
CAN_MDx Mailbox direction registers (регистры направления ящика) Никогда не меняйте направление MDn, когда ящик разрешен. MD[31:24] и MD[7:0] доступны только для чтения.
CAN_RMPx Receive message pending registers (регистры ожидающих принятых сообщений) Очистка битов RMPn также очистит биты RMLn.
CAN_RMLx Receive message lost registers (регистры потерянных сообщений приема) Доступ на запись не дает никакого эффекта.
CAN_OPSSx Overwrite protection or single-shot transmission register (регистр защиты от перезаписи на приеме или однократной передачи) Функционирование зависит от направления работы ящика (mailbox direction). Не имеет значения, когда RFHn=1. Не модифицируйте бит OPSSn, когда ящик n разрешен.
CAN_TRSx Transmission request set registers (регистры установки запроса передачи) Могут в определенных условиях быть установленными внутренней логикой. Биты TRS[7:0] только для чтения.
CAN_TRRx Transmission request reset registers (регистры сброса запроса передачи) Биты TRRn не должны устанавливаться, если ящик n запрещен, или если TRSn=0.
CAN_AAx Abort acknowledge registers (регистры обрыва подтверждения) Бит AAn сбрасывается, если бит TRSn установлен вручную, но не когда бит TRSn установлен внутренней логикой.
CAN_TAx Transmission acknowledge registers (регистры подтверждения передачи) Бит TAn сбрасывается, если бит TRSn установлен вручную, но не когда бит TRSn установлен внутренней логикой.
CAN_MBTD Temporary mailbox disable feature register (регистр функции временного запрета ящика) Позволяет осуществлять безопасный доступ к полю данных разрешенного ящика.
CAN_RFHx Remote frame handling registers (регистры обработки фрейма remote) Доступно только для конфигурируемых ящиков 23:8. Биты RFH[31:24] и RFH[7:0] только для чтения.
CAN_MBIMx Mailbox interrupt mask registers (регистр маски прерывания ящика) Прерывания ящиков генерируются только если эти биты установлены.
CAN_MBTIFx Mailbox transmit interrupt flag registers (регистры флагов прерывания передачи ящика) Могут быть очищены, если ящик запрещен или прерывание ящика запрещено. Изменение направления, когда MBTIFn=1, дает результат MBRIFn=1 и MBTIFn=0.
CAN_MBRIFx Mailbox receive interrupt flag registers (регистры флагов прерывания приема ящика) Могут быть очищены, если ящик запрещен или прерывание ящика запрещено. Изменение направления, когда MBRIFn=1, дает результат MBTIFn=1 и MBRIFn=0.

Blackfin CAN MC1 fig17 30

Рис. 17-30. Регистр 1 конфигурации Mailbox (CAN_MC1).

Для всех бит CAN_MC1: 0 ящик запрещен, 1 ящик разрешен.

Blackfin CAN MC2 fig17 31

Рис. 17-31. Регистр 2 конфигурации Mailbox (CAN_MC2).

Для всех бит CAN_MC2: 0 ящик запрещен, 1 ящик разрешен.

[CAN_MD1CAN_MD2]

Регистры настройки направления работы ящиков. Для всех битов: 0 ящик сконфигурирован в режиме передачи, 1 ящик сконфигурирован в режиме приема. Некоторые биты RO, т. е. только для чтения, т. е. у этих ящиков направление работы фиксированное (ящики 7..0 работают только на прием, ящики 31..24 только на передачу).

Blackfin CAN MD1 fig17 32

Рис. 17-32. Регистр 1 направления работы Mailbox (CAN_MD1).

Blackfin CAN MD2 fig17 33

Рис. 17-33. Регистр 2 направления работы Mailbox (CAN_MD2).

Blackfin CAN RMP1 fig17 34

Рис. 17-34. Регистр 1 ожидания приема сообщения (CAN_RMP1).

Все биты регистра CAN_RMP1 очищаются операцией W1C.

Blackfin CAN RMP2 fig17 35

Рис. 17-35. Регистр 2 ожидания приема сообщения (CAN_RMP2).

Все биты регистра CAN_RMP2 очищаются операцией W1C.

Blackfin CAN RML1 fig17 36

Рис. 17-36. Регистр 1 потери сообщения (CAN_RML1).

Регистр CAN_RML1 только для чтения (RO).

Blackfin CAN RML2 fig17 37

Рис. 17-37. Регистр 2 потери сообщения (CAN_RML2).

Регистр CAN_RML2 только для чтения (RO).

Blackfin CAN OPSS1 fig17 38

Рис. 17-38. Регистр 1 защиты от перезаписи сообщения при приеме / однократной передачи сообщения (CAN_OPSS1).

Blackfin CAN OPSS2 fig17 39

Рис. 17-39. Регистр 2 защиты от перезаписи сообщения при приеме / однократной передачи сообщения (CAN_OPSS2).

Blackfin CAN TRS1 fig17 40

Рис. 17-40. Регистр 1 установки запроса на передачу (CAN_TRS1).

Blackfin CAN TRS2 fig17 41

Рис. 17-41. Регистр 2 установки запроса на передачу (CAN_TRS2).

Blackfin CAN TRR1 fig17 42

Рис. 17-42. Регистр 1 сброса запроса на передачу (CAN_TRR1).

Blackfin CAN TRR2 fig17 43

Рис. 17-43. Регистр 2 сброса запроса на передачу (CAN_TRR2).

Blackfin CAN AA1 fig17 44

Рис. 17-44. Регистр 1 обрыва подтверждения (CAN_AA1).

Все биты регистра CAN_AA1 сбрасываются операцией W1C.

Blackfin CAN AA2 fig17 45

Рис. 17-45. Регистр 2 обрыва подтверждения (CAN_AA2).

Все биты регистра CAN_AA2 сбрасываются операцией W1C.

Blackfin CAN TA1 fig17 46

Рис. 17-46. Регистр 1 подтверждения передачи (CAN_TA1).

Все биты регистра CAN_TA1 сбрасываются операцией W1C.

Blackfin CAN TA2 fig17 47

Рис. 17-47. Регистр 2 подтверждения передачи (CAN_TA2).

Все биты регистра CAN_TA2 сбрасываются операцией W1C.

Blackfin CAN MBTD fig17 48

Рис. 17-48. Регистр временного запрета Mailbox (CAN_MBTD).

Blackfin CAN RFH1 fig17 49

Рис. 17-49. Регистр 1 обработки фрейма remote (CAN_RFH1).

Blackfin CAN RFH2 fig17 50

Рис. 17-50. Регистр 2 обработки фрейма remote (CAN_RFH2).

[CAN_MBIM1, CAN_MBIM2]

Регистры разрешения прерывания от ящиков. Прерывание от ящика n разрешено, если его соответствующий бит MBIMn установлен.

Blackfin CAN MBIM1 fig17 51

Рис. 17-51. Регистр 1 маски прерываний Mailbox (CAN_MBIM1).

Blackfin CAN MBIM2 fig17 52

Рис. 17-52. Регистр 2 маски прерываний Mailbox (CAN_MBIM2).

Blackfin CAN MBTIF1 fig17 53

Рис. 17-53. Регистр 1 флагов прерываний передачи Mailbox (CAN_MBTIF1).

Все биты регистра CAN_MBTIF1 сбрасываются операцией W1C.

Blackfin CAN MBTIF2 fig17 54

Рис. 17-54. Регистр 2 флагов прерываний передачи Mailbox (CAN_MBTIF2).

Все биты регистра CAN_MBTIF2 сбрасываются операцией W1C.

Blackfin CAN MBRIF1 fig17 55

Рис. 17-55. Регистр 1 флагов прерываний приема Mailbox (CAN_MBRIF1).

Все биты регистра CAN_MBRIF1 сбрасываются операцией W1C.

Blackfin CAN MBRIF2 fig17 56

Рис. 17-56. Регистр 2 флагов прерываний приема Mailbox (CAN_MBRIF2).

Все биты регистра CAN_MBRIF2 сбрасываются операцией W1C.

Таблица 17-8. Регистры универсального счетчика.

Имя регистра Функция Замечания
CAN_UCCNF Universal counter mode register (регистр режима универсального счетчика) Биты 15:8 и бит 4 зарезервированы.
CAN_UCCNT Universal counter register (регистр универсального счетчика) Считает вверх или вниз в зависимости от режима.
CAN_UCRC Universal counter reload/capture register (регистр захвата/перезагрузки универсального счетчика) В режиме метки времени (timestamp mode) содержит время последней успешной передачи или последнего успешного приема.

Blackfin CAN UCCNF fig17 57

Рис. 17-57. Регистр конфигурирования режима универсального счетчика (CAN_UCCNF).

Blackfin CAN UCCNT fig17 58

Рис. 17-58. Регистр универсального счетчика (CAN_UCCNT).

Blackfin CAN UCRC fig17 59

Рис. 17-59. Регистр перезагрузки/захвата универсального счетчика (CAN_UCRC).

Таблица 17-9. Регистры ошибки.

Имя регистра Функция Замечания
CAN_CEC CAN error counter register (регистр счетчиков ошибок CAN) Не определен во время режима отключения от шины (bus-off mode), на этот регистр не влияет программный сброс (software reset).
CAN_ESR Error status register (регистр состояния ошибки) Сохраняется только первая ошибка. Флаг SA0 очищается рецессивным битом на шине CAN.
CAN_EWR CAN error counter warning level register (регистр порога счетчиков, на котором генерируется предупреждение об ошибках) По умолчанию для обоих счетчиков передачи и приема установлен порог 96.

Blackfin CAN CEC fig17 60

Рис. 17-60. Регистр счетчиков ошибок (CAN_CEC).

Blackfin CAN ESR fig17 61

Рис. 17-61. Регистр состояния ошибок (CAN_ESR).

Все биты регистра CAN_ESR сбрасываются по принципу W1C.

Blackfin CAN EWR fig17 62

Рис. 17-62. Регистр уровня предупреждения об ошибках (CAN_EWR).

[Примеры программирования]

Следующие примеры кода CAN (листинги 17-2 .. 17-4) показывают, как программировать аппаратуру CAN и параметры времени, инициализировать ящики, выполнять передачи, обрабатывать прерывания. Каждый из этих примеров кода подразумевает, что в исходный код подключен заголовочный файл (например, #include < defBF537.h > для проектов с процессором ADSP-BF537).

Следующий код инициализирует выводы порта для подключения к контроллеру CAN, и конфигурирует параметры времени CAN.

////////////////////////////////////////////////////////////////////////////
// Листинг 17-2. Инициализация CAN.
Initialize_CAN:
   P0.H = HI(PORT_MUX);    /* Выводы CAN мультиплексированы с портом J */
   P0.L = LO(PORT_MUX);
   R0 = PJCE_CAN(Z);       /* Разрешить выводы CAN TX/RX */
   W[P0] = R0;
   SSYNC;
 
/* ===================================================
** Установка интервалов времени бита CAN
**
** CAN_TIMING - SJW, TSEG2 и TSEG1 устанавливаются
** по принципу:
** SJW ≤ TSEG2 ≤ TSEG1
**
** ===================================================
*/
   P0.H = HI(CAN_TIMING);
   P0.L = LO(CAN_TIMING);
   R0 = 0x0334(Z); /* SJW = 3, TSEG2 = 3, TSEG1 = 4 */
   W[P0] = R0;
   SSYNC;
 
/* ===================================================
** CAN_CLOCK - вычисление значения прескалера (BRP)
**
** Предположим, что нужна скорость CAN 500 kbps,
** это означает длительность бита (tBIT) 2 мкс.
** С использованием формулы из руководства (см. раздел
** "Работа CAN -> Длительность бита") для tBIT,
** вычислим TQ:
**
** tBIT = TQ * (1 + (TSEG1 + 1) + (TSEG2 + 1))
** 2 мкс = TQ * (1 + (4 + 1) + (3 + 1))
** 2e-6 = TQ * (1 + 5 + 4)
** TQ = 2e-6 / 10
** TQ = 2e-7
**
** Теперь мы знаем квант времени (TQ), от которого
** можно вычислить значение BRP по формуле из
** руководства. Предположим, что настройки PLL
** использовались для платы разработчика
** ADSP-BF537 EZ-KIT, тогда частота системной
** шины (System Clock, SCLK) равна 50 МГц:
**
** TQ = (BRP+1) / SCLK
** 2e-7 = (BRP+1) / 50e6
** (BRP+1) = 10
** BRP = 9
*/
   P0.L = LO(CAN_CLOCK);
   R0 = 9(Z);
   W[P0] = R0;
   SSYNC;
 
   RTS; 

Перед тем, как CAN сможет передавать данные, область регистров ящиков должна быть правильно настроена, и должен быть соответствующим образом настроен контроллер CAN.

////////////////////////////////////////////////////////////////////////
// Листинг 17-3. Инициализация и разрешение работы ящиков.
CAN_Initialize_Mailboxes:
   P0.H = HI(CAN_MD1); /* Конфигурирование направления Mailbox */
   P0.L = LO(CAN_MD1);
   R0 = W[P0](Z);
   BITCLR(R0, BITPOS(MD8)); /* Установка MB08 для передачи */
   BITSET(R0, BITPOS(MD9)); /* Установка MB09 для приема */
   W[P0] = R0;
   SSYNC;
 
/* ===================================================
** Заполнение область CAN Mailbox
**
** Ящик 8 передает с ID 0x411 данные из 4 байт.
** Байты 0 и 1 содержат значение 0xAABB. Байты 2
** и 3 будут содержать значение счетчика для количества
** успешно отправленных сообщений.
**
** Ящик 9 будет принимать сообщения с ID 0x007.
** ===================================================
*/
   /* Инициализация Mailbox 8 для передачи */
   R0 = 0x411 << 2;           /* Поместить ID сообщения в корректный слот */
   P0.L = LO(CAN_MB_ID1(8));  /* Доступ к регистру ID1 ящика 8 */
   W[P0] = R0;                /* Фрейм remote запрещен, ID из 11 бит */
 
   R0 = 0;
   P0.L = LO(CAN_MB_ID0(8));
   W[P0] = R0;                /* В младший регистр ID выведем 0 */
 
   R0 = 4;
   P0.L = LO(CAN_MB_LENGTH(8));
   W[P0] = R0;                /* DLC = 4 байтам */
 
   R0 = 0xAABB(Z);
   P0.L = LO(CAN_MB_DATA3(8));
   W[P0] = R0;                /* Byte0 = 0xAA, Byte1 = 0xBB */
 
   R0 = 1;
   P0.L = LO(CAN_MB_DATA2(8));
   W[P0] = R0;                /* Инициализация счетчика в 1 */
 
   /* Инициализация Mailbox 9 для приема */
   R0 = 0x007 << 2;           /* Поместить ID сообщения в корректный слот */
   P0.L = LO(CAN_MB_ID1(9));  /* Доступ к регистру ID1 ящика 9 */
   W[P0] = R0;                /* Фрейм remote запрещен, ID из 11 бит */
 
   R0 = 0;
   P0.L = LO(CAN_MB_ID0(9));
   W[P0] = R0;                /* В младший регистр ID выведем 0 */
   SSYNC;
   
   /* Разрешить сконфигурированные ящики */
   P0.L = LO(CAN_MC1);
   R0 = W[P0](Z);
   BITSET(R0, BITPOS(MC8));   /* Разрешить ящик 8 */
   BITSET(R0, BITPOS(MC9));   /* Разрешить ящик 9 */
   W[P0] = R0;
   SSYNC;
   RTS;

После того, как ящики правильно настроены, передачи могут запрашиваться программированием регистров контроллера CAN. Этот пример кода инициализирует прерывания CAN, выводит контроллер CAN из режима конфигурации, делает запрос передачи и затем ждет обработки прерываний CAN TX и CAN RX. Этот пример подразумевает, что обработчики прерываний CAN_RX_HANDLER и CAN_TX_HANDLER были правильно зарегистрированы в системном контроллере прерываний (system interrupt controller, SIC), и что прерывания были правильно разрешены программированием регистра SIC_IMASK.

////////////////////////////////////////////////////////////
// Листинг 17-4. Передачи и прерывания CAN
CAN_SetupIRQs_and_Transfer:
   P0.H = HI(CAN_MBIM1);
   P0.L = LO(CAN_MBIM1);
   R0 = 0;
   BITSET(R0, BITPOS(MBIM8));    /* Разрешить прерывания */
   BITSET(R0, BITPOS(MBIM9));    /* для ящиков 8 и 9 */
   W[P0] = R0;
   SSYNC;
 
   /* Выход из режима конфигурации CAN (очисткой CCR) */
   P0.L = LO(CAN_CONTROL);
   R0 = W[P0](Z);
   BITCLR(R0, BITPOS(CCR));
   W[P0] = R0;
   P0.L = LO(CAN_STATUS);
   /* Ожидание подтверждения конфигурации CAN (CCA) */
WAIT_FOR_CCA_TO_CLEAR:
   R1 = W[P0](Z);
   CC = BITTST (R1, BITPOS(CCA));
   IF CC JUMP WAIT_FOR_CCA_TO_CLEAR;
   P0.L = LO(CAN_TRS1);
   R0 = TRS8;                 /* Запрос передачи ящика 8 */
   W[P0] = R0;                /* Выдать запрос передачи */
   SSYNC;Wait_Here_For_IRQs:
   NOP;
   NOP;
   NOP;
   JUMP Wait_Here_For_IRQs;
 
/* ===================================================
** CAN_TX_HANDLER (обработчик прерывания передачи)
**
** ISR очищает запрос прерывания ящика 8, записывает
** новые данные для отправки, и делает запрос
** на передачу данных.
** ===================================================
*/
CAN_TX_HANDLER:
   [--SP] = (R7:6, P5:5);  /* Сохранение используемых регистров */
   [--SP] = ASTAT;
 
   P5.H = HI(CAN_MBTIF1);
   P5.L = LO(CAN_MBTIF1);
   R7 = MBTIF8;
   W[P5] = R7;             /* Очистка бита запроса прерывания ящика 8 */
 
   P5.L = LO(CAN_MB_DATA2(8));
   R7 = W[P5](Z);          /* Получение ранее отправленных данных */
   R6 = 0xFF;              /* Маскирование старшего байта для проверки младшего */
   R6 = R6 & R7;           /* Байт для переноса */
   R5 = 0xFF;              /* Проверка переноса */
   CC = R6 == R5;          /* Проверка: был ли перенос из младшего байта? */
   IF CC JUMP HANDLE_COUNT_WRAP;
   R7 += 1;                /* Нет переноса, инкремент счетчика */
   JUMP PREPARE_TO_SEND;
 
HANDLE_COUNT_WRAP:
   R6 = 0xFF00(Z);         /* Маскировать младший байт */
   R7 = R7 & R6;           /* Установить младший байт в 0 */
   R6 = 0x0100(Z);         /* Инкремент значения для старшено байта */
   R7 = R7 + R6;           /* Инкремент старшего байта */
PREPARE_TO_SEND:
   W[P5] = R7;             /* Установка новых передаваемых данных */
   P5.L = LO(CAN_TRS1);
   R7 = TRS8;
   W[P5] = R7;             /* Выдать новый запрос на передачу */
   ASTAT = [SP++];         /* Восстановить используемые регистры */
   (R7:6, P5:5) = [SP++];
   SSYNC;
   RTI;
 
/* ===================================================
** CAN_RX_HANDLER (обработчик прерывания приема)
**
** ISR очищает запрос прерывания от ящика MB9,
** сохраняет в памяти принятые данные.
** ===================================================
*/
CAN_RX_HANDLER:
   [--SP] = (R7:7, P5:4);     /* Сохранение используемых регистров */
   [--SP] = ASTAT;
   
   P4.H = HI(CAN_RX_WORD);    /* Установка указателя на хранилище */
   P4.L = LO(CAN_RX_WORD);
   
   P5.H = HI(CAN_MBRIF1);
   P5.L = LO(CAN_MBRIF1);
   R7 = MBRIF9;
   W[P5] = R7;             /* Очистка запроса прерывания ящика 9 */
   
   P5.L = LO(CAN_MB_DATA3(9));
   R7 = W[P5](Z);          /* Чтение принятых данных из ящика */
   W[P4] = R7;             /* Сохранение данных в память */
   
   ASTAT = [SP++];         /* Восстановить используемые регистры */
   (R7:7, P5:4) = [SP++];
   SSYNC;
   RTI;

[Ссылки]

1. ADSP-BF50x Blackfin® Processor Hardware Reference site:analog.com.
2. CANopen на процессоре Blackfin ADSP-BF504F.
3CAN Bit Time Calculation.

 

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


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

Top of Page