Интерфейс 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. Рис. 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). Внимание: не записывайте в объект идентификатора сообщения, когда ящик разрешен (т. е. когда установлен соответствующий бит 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. Оставшиеся регистры относятся к маске приема (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 управления ящиками:
Поскольку ящики 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). Рис. 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).
Если фильтр приема найдет подходящий идентификатор, то содержимое его принятого фрейма данных сохраняется в соответствующем ящике. Принятое сообщение будет сохранено только один раз, даже если для нескольких приемных ящиков идентификатор будет подходящим. Если текущий идентификатор сообщения не подходит ни для какого ящика, то сообщение не будет сохранено. Рис. 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 в соответствующем регистре 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 содержит: • Биты идентификатора. Фреймы 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 ящика произошел во время обновления данных внутренней логикой. [Счетчик событий] Для диагностических функций можно использовать универсальный счетчик CAN как счетчик событий (event counter). Счетчик может быть запрограммирован 4-битным полем UCCNF[3:0] регистра CAN_UCCNF чтобы он инкрементировался при одном из этих событий: • UCCNF[3:0] = 0x6 – CAN error frame. Счетчик инкрементируется, если на линии шины 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. Как только модуль 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).
В дополнение к этим уровням модуль 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. Бит 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.
Процессор 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. [Регистры CAN] Следующие секции описывают регистры CAN: • Глобальные регистры CAN. Таблицы от 17-5 до 17-9 показывают функции регистров CAN. Таблица 17-5. Глобальные регистры CAN.
Эти регистры называются "глобальными", потому что они влияют на работу контроллера CAN целиком, и на все его ящики. [CAN_CONTROL] Рис. 17-11. Главный регистр управления CAN_CONTROL. [CAN_STATUS] Рис. 17-12. Глобальный регистр состояния CAN_STATUS (доступ только на чтение, RO). • Mail box pointer (MBPTR[4:0]), указатель ящика. Представляет номер ящика текущего передаваемого сообщения. После успешной передачи эти биты остаются неизменными. 11111 означает, что сейчас обрабатывается сообщение ящика 31. [CAN_DEBUG] Рис. 17-13. Регистр отладки CAN_DEBUG. [CAN_CLOCK] Рис. 17-14. Регистр тактирования CAN_CLOCK. [CAN_TIMING] Рис. 17-15. Регистр настройки интервалов бита CAN_TIMING. [CAN_INTR] Рис. 17-16. Регистр прерываний CAN_INTR (доступ только на чтение, RO). [CAN_GIM] Рис. 17-17. Регистр глобальной маски прерываний CAN_GIM. [CAN_GIS] Рис. 17-18. Регистр глобального статуса прерываний CAN_GIS (все биты этого регистра могут быть очищены операцией W1C). [CAN_GIF] Рис. 17-19. Регистр глобальных флагов прерываний CAN_GIF. Таблица 17-6. Регистры Mailbox/Mask.
[CAN_AMxxH, CAN_AMxxL] В этих регистрах хранятся настройки фильтрации ящиков на приеме. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера). Рис. 17-20. Регистр маски фильтра приема CAN_AMxxH, старшая часть (Acceptance Mask Register). Значение регистра acceptance mask не имеет значения, когда бит AME сброшен (находится в регистре CAN_MBxx_ID1). Если бит AME установлен, то эти биты маски сравниваются с принятым идентификаторам в тех позициях бит, где бит маски очищен. В позиции бита, где бит маски единица, совпадение бита идентификатора не требуется. С помощью этой функции можно настроить ящик на прием группы идентификаторов сообщений. Таблица 17-10. MMR-адреса регистров Acceptance Mask (старшая часть маски).
Рис. 17-21. Регистр маски фильтра приема CAN_AMxxL, младшая часть (Acceptance Mask Register). Таблица 17-11. MMR-адреса регистров Acceptance Mask (младшая часть маски).
[CAN_MBxx_ID1] В этом регистре хранится базовый (11-битный) идентификатор ящика, часть расширенного (29-битного) идентификатора, а также биты, управляющие типом идентификатора, типом ящика и включением фильтрации. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера). Рис. 17-22. Регистр Mailbox Word 7, CAN_MBxx_ID1. Таблица 17-12. MMR-адреса регистров Mailbox Word 7.
[CAN_MBxx_ID0] В этом регистре часть бит расширенного (29-битного) идентификатора ящика. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера). Рис. 17-23. Регистр Mailbox Word 6, CAN_MBxx_ID0. Таблица 17-13. MMR-адреса регистров Mailbox Word 6.
[CAN_MBxx_TIMESTAMP] В этом регистре хранится метка времени - значение из универсального счетчика, захваченное в момент приема сообщения. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера). Рис. 17-24. Регистр Mailbox Word 5, CAN_MBxx_TIMESTAMP. Таблица 17-14. MMR-адреса регистров Mailbox Word 5.
[CAN_MBxx_LENGTH] Этот регистр показывает (на приеме) или определяет (на передаче) длину данных в байтах пакета сообщения CAN. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера). Рис. 17-25. Регистр Mailbox Word 4, CAN_MBxx_LENGTH. Таблица 17-15. MMR-адреса регистров Mailbox Word 4.
[Регистры данных CAN_MBxx_DATAx] В этих регистрах хранятся данные (полезная нагрузка) передаваемого или принимаемого (в зависимости от направления работы ящика) пакета CAN. Вместо xx подставляется номер ящика от 00 до 31 (десятичное значение номера). Рис. 17-26. Регистр Mailbox Word 3, CAN_MBxx_DATA3. Таблица 17-16. MMR-адреса регистров Mailbox Word 3.
Рис. 17-27. Регистр Mailbox Word 2, CAN_MBxx_DATA2. Таблица 17-17. MMR-адреса регистров Mailbox Word 2.
Рис. 17-28. Регистр Mailbox Word 1, CAN_MBxx_DATA1. Таблица 17-18. MMR-адреса регистров Mailbox Word 1.
Рис. 17-29. Регистр Mailbox Word 0, CAN_MBxx_DATA0. Таблица 17-19. MMR-адреса регистров Mailbox Word 0.
Таблица 17-7. Регистры управления Mailbox.
Рис. 17-30. Регистр 1 конфигурации Mailbox (CAN_MC1). Для всех бит CAN_MC1: 0 ящик запрещен, 1 ящик разрешен. Рис. 17-31. Регистр 2 конфигурации Mailbox (CAN_MC2). Для всех бит 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). Рис. 17-44. Регистр 1 обрыва подтверждения (CAN_AA1). Все биты регистра CAN_AA1 сбрасываются операцией W1C. Рис. 17-45. Регистр 2 обрыва подтверждения (CAN_AA2). Все биты регистра CAN_AA2 сбрасываются операцией W1C. Рис. 17-46. Регистр 1 подтверждения передачи (CAN_TA1). Все биты регистра CAN_TA1 сбрасываются операцией W1C. Рис. 17-47. Регистр 2 подтверждения передачи (CAN_TA2). Все биты регистра CAN_TA2 сбрасываются операцией W1C. Рис. 17-48. Регистр временного запрета Mailbox (CAN_MBTD). Рис. 17-49. Регистр 1 обработки фрейма remote (CAN_RFH1). Рис. 17-50. Регистр 2 обработки фрейма remote (CAN_RFH2). [CAN_MBIM1, CAN_MBIM2] Регистры разрешения прерывания от ящиков. Прерывание от ящика n разрешено, если его соответствующий бит MBIMn установлен. Рис. 17-51. Регистр 1 маски прерываний Mailbox (CAN_MBIM1). Рис. 17-52. Регистр 2 маски прерываний Mailbox (CAN_MBIM2). Рис. 17-53. Регистр 1 флагов прерываний передачи Mailbox (CAN_MBTIF1). Все биты регистра CAN_MBTIF1 сбрасываются операцией W1C. Рис. 17-54. Регистр 2 флагов прерываний передачи Mailbox (CAN_MBTIF2). Все биты регистра CAN_MBTIF2 сбрасываются операцией W1C. Рис. 17-55. Регистр 1 флагов прерываний приема Mailbox (CAN_MBRIF1). Все биты регистра CAN_MBRIF1 сбрасываются операцией W1C. Рис. 17-56. Регистр 2 флагов прерываний приема Mailbox (CAN_MBRIF2). Все биты регистра CAN_MBRIF2 сбрасываются операцией W1C. Таблица 17-8. Регистры универсального счетчика.
Рис. 17-57. Регистр конфигурирования режима универсального счетчика (CAN_UCCNF). Рис. 17-58. Регистр универсального счетчика (CAN_UCCNT). Рис. 17-59. Регистр перезагрузки/захвата универсального счетчика (CAN_UCRC). Таблица 17-9. Регистры ошибки.
Рис. 17-60. Регистр счетчиков ошибок (CAN_CEC). Рис. 17-61. Регистр состояния ошибок (CAN_ESR). Все биты регистра CAN_ESR сбрасываются по принципу W1C. Рис. 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. |