Процессоры 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.
Рис. 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.
Рис. 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).
Рис. 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.
Рис. 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).
Регистры флага прерывания передачи (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.
Рис. 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.
Рис. 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 - сегмент синхронизации, сегмент перед точкой выборки значения бита и сегмент после точки выборки.
Рис. 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). Оборванная в настоящий момент передача перезапускается после того, как будут отправлены любые сообщения с более высоким приоритетом.
Рис. 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 показывает дерево принятия решения логики приема, когда идет обработка отдельных ящиков.
Рис. 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 рецессивных бит, показывающих конец фрейма.
Рис. 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_CONTROL]
Рис. 17-11. Главный регистр управления CAN_CONTROL.
[CAN_STATUS]
Рис. 17-12. Глобальный регистр состояния CAN_STATUS (доступ только на чтение, RO).
• Mail box pointer (MBPTR[4:0]), указатель ящика. Представляет номер ящика текущего передаваемого сообщения. После успешной передачи эти биты остаются неизменными.
11111 означает, что сейчас обрабатывается сообщение ящика 31. ... ... 00000 означает, что сейчас обрабатывается сообщение ящика 0.
В этих регистрах хранятся настройки фильтрации ящиков на приеме. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера).
Рис. 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
Рис. 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 (десятичное значение номера).
Рис. 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 (десятичное значение номера).
Рис. 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 (десятичное значение номера).
Рис. 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 (десятичное значение номера).
Рис. 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 (десятичное значение номера).
Рис. 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
Рис. 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
Рис. 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
Рис. 17-29. Регистр Mailbox Word 0, CAN_MBxx_DATA0.
Таблица 17-19. MMR-адреса регистров Mailbox Word 0.
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_MC2: 0 ящик запрещен, 1 ящик разрешен.
[CAN_MD1, CAN_MD2]
Регистры настройки направления работы ящиков. Для всех битов: 0 ящик сконфигурирован в режиме передачи, 1 ящик сконфигурирован в режиме приема. Некоторые биты RO, т. е. только для чтения, т. е. у этих ящиков направление работы фиксированное (ящики 7..0 работают только на прием, ящики 31..24 только на передачу).
Рис. 17-32. Регистр 1 направления работы Mailbox (CAN_MD1).
Рис. 17-33. Регистр 2 направления работы Mailbox (CAN_MD2).
Рис. 17-34. Регистр 1 ожидания приема сообщения (CAN_RMP1).
Все биты регистра CAN_RMP1 очищаются операцией W1C.
Рис. 17-35. Регистр 2 ожидания приема сообщения (CAN_RMP2).
Все биты регистра CAN_RMP2 очищаются операцией W1C.
Рис. 17-36. Регистр 1 потери сообщения (CAN_RML1).
Регистр CAN_RML1 только для чтения (RO).
Рис. 17-37. Регистр 2 потери сообщения (CAN_RML2).
Регистр CAN_RML2 только для чтения (RO).
Рис. 17-38. Регистр 1 защиты от перезаписи сообщения при приеме / однократной передачи сообщения (CAN_OPSS1).
Рис. 17-39. Регистр 2 защиты от перезаписи сообщения при приеме / однократной передачи сообщения (CAN_OPSS2).
Рис. 17-40. Регистр 1 установки запроса на передачу (CAN_TRS1).
Рис. 17-41. Регистр 2 установки запроса на передачу (CAN_TRS2).
Рис. 17-42. Регистр 1 сброса запроса на передачу (CAN_TRR1).
Рис. 17-43. Регистр 2 сброса запроса на передачу (CAN_TRR2).
Все биты регистра CAN_ESR сбрасываются по принципу W1C.
Рис. 17-62. Регистр уровня предупреждения об ошибках (CAN_EWR).
[Примеры программирования]
Следующие примеры кода CAN (листинги 17-2 .. 17-4) показывают, как программировать аппаратуру CAN и параметры времени, инициализировать ящики, выполнять передачи, обрабатывать прерывания. Каждый из этих примеров кода подразумевает, что в исходный код подключен заголовочный файл (например, #include < defBF537.h > для проектов с процессором ADSP-BF537).
Перед тем, как 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;
/* Инициализация 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 */
/* Инициализация Mailbox 9 для приема */
R0 =0x007<<2; /* Поместить ID сообщения в корректный слот */
P0.L = LO(CAN_MB_ID1(9)); /* Доступ к регистру ID1 ящика 9 */
W[P0] = R0; /* Фрейм remote запрещен, ID из 11 бит */
После того, как ящики правильно настроены, передачи могут запрашиваться программированием регистров контроллера CAN. Этот пример кода инициализирует прерывания CAN, выводит контроллер CAN из режима конфигурации, делает запрос передачи и затем ждет обработки прерываний CAN TX и CAN RX. Этот пример подразумевает, что обработчики прерываний CAN_RX_HANDLER и CAN_TX_HANDLER были правильно зарегистрированы в системном контроллере прерываний (system interrupt controller, SIC), и что прерывания были правильно разрешены программированием регистра SIC_IMASK.