|
Информационный портал технической поддержки Центра проектирования интегральных микросхем |
Подробную информацию о Controller Area Network (CAN) можно прочесть в Википедии.
В статье будут приведены лишь базовые сведения, и рассмотрена программа, которая позволяет отправить с микроконтроллера К1986ВЕ92У стандартный кадр CAN со скоростью 500 Кбит/с. Для отслеживания и анализа кадра используется осциллограф. Проект прост в реализации и адаптивен под работу с протоколом CAN на других микроконтроллерах производства компании Миландр.

Поскольку работа с проектом ведётся на отладочной плате производства компании Миландр, важно около разъема CAN на отладочной плате поставить перемычку XP15 в положение, указывающем на 500 Кбит/с, что отвечает за скорость работы протокола CAN.
Код для стандартных настроек портов ввода/вывода не рассматривается, все данные доступны для рассмотрения в стандартных примерах из пака для Keil. Особое внимание уделено настройке CAN-блока.
CAN-контроллер использует две линии обмена данными, и они обе должны быть сконфигурированы (CAN_RX - для приёма и CAN_TX - для передачи). На микроконтроллере 1986BE92 за CAN1 отвечают линии PA6 и PA7 соответственно. Стоит отметить, что функция порта альтернативная. После выполненных действий можно приступить к настройке CAN.
Для правильной инициализации модуля CAN нужно придерживаться следующей последовательности действий:
1. Включить тактирование модуля.
2. Сконфигурировать структуру CAN:
// Структура для инициализации модуля
CAN CAN_InitTypeDef CANInitStruct;
// Конфигурация модуля
CAN1 CANInitStruct.CAN_ROP = DISABLE; // Прием собственных пакетов отключено
CANInitStruct.CAN_SAP = DISABLE; // Подтверждение приема отключено
CANInitStruct.CAN_STM = DISABLE; // Режим самотестирования отключен
CANInitStruct.CAN_ROM = DISABLE; // Режим "только чтение" отключен
CANInitStruct.CAN_PSEG = CAN_PSEG_Mul_2TQ; // Битовый сегмент. Длительность PS
CANInitStruct.CAN_SEG1 = CAN_SEG1_Mul_4TQ; // Битовый сегмент. Длительность PBS1
CANInitStruct.CAN_SEG2 = CAN_SEG2_Mul_3TQ; // Битовый сегмент. Длительность PBS2 CANInitStruct.CAN_SJW = CAN_SJW_Mul_2TQ; // Интервал перестройки сегментов
CANInitStruct.CAN_SB = CAN_SB_1_SAMPLE; // Режим выборки
CANInitStruct.CAN_BRP = 15; // Предделитель тактовой частоты
CANInitStruct.CAN_OVER_ERROR_MAX = 255; // Максимальное значение счетчика ошибок до установки флага Фрагмент кода 1 3. Настроить аппаратные прерывания. В приведённом проекте они использованы не будут.
4. Активировать модуль:
// Включение модуля
CAN1 CAN_Cmd(MDR_CAN1, ENABLE);Фрагмент кода 2 Для передачи данных в стандартной библиотеке SPL предусмотрена специальная структура CAN_TxMsgTypeDef, которая настраивает кадр (фрейм) передающих данных:
// Формирование кадра данных
CAN_TxMsgTypeDef tx_frame;
tx_frame.ID = 0x19ABFFFF; // Идентификатор кадра данных
tx_frame.PRIOR_0 = 1; // Приоритет кадра данных
tx_frame.IDE = CAN_ID_STD; // Формат кадра данных - стандартный
tx_frame.DLC = 1; // Длина поля данных (в байтах)
tx_frame.Data[0] = 0x000000AA; // Первые четыре байта данных
tx_frame.Data[1] = 0x00000000; // Вторые четыре байта данных Фрагмент кода 3 При настройке стандартного идентификатора (содержит 11 бит) кадра данных следует помнить, что, согласно спецификации, для правильной настройки нужно задействовать биты с 18-го по 28-й. В рассматриваемой программе для стандартного идентификатора было взято число 0x19ABFFFF, и старшие 11 бит двоичного представления будут являться стандартным идентификатором.
Для передачи сформированного кадра необходимо воспользоваться следующую функцию:
// Передача кадра
CAN_Transmit(MDR_CAN1, TX_BUFFER_NUMBER, &tx_frame);Фрагмент кода 4 Основной код готов. Однако, если в проекте необходимо принимать данные по CAN, то для этого используется буфер:
// Настройка буфера на прием кадров
CAN_Receive(MDR_CAN1, RX_BUFFER_NUMBER, DISABLE); // Третий аргумент отвечает за возможность перезаписи принятых данныхФрагмент кода 5 И настройка структуры CAN_RxMsgTypeDef для приёма данных описывается следующим образом:
// Структура для приема кадра
CAN_RxMsgTypeDef rx_frame;
// Извлечение данных из буфера
CAN_GetRawReceivedData(MDR_CAN1, RX_BUFFER_NUMBER, &rx_frame);Фрагмент кода 6
Для подключения осциллографа при анализе обмена используются линии CAN_H и CAN_L. На рисунке 2 показано расположение этих линий на стандартном разъеме DB9F:

Рисунок 2 - Расположение линий CAN на разъеме DB9F
При подключении осциллографа к микроконтроллеру, он будет отображать непрерывный сигнал с кадром данных, который был сформирован в программе. Примерный вид и разбор кадра приведены на рисунке 3:

Рисунок 3 - Осциллограмма кадра данных CAN и его разбор
Пояснения:
Бит sof указывает на начало передачи кадра.
Бит RTR определяет тип кадра.
Бит IDE определяет формат кадра.
Бит R0 зарезервированный, и согласно протоколу должен иметь доминантное значение, то есть логический “0”.
Объем кадра в приведенном проекте равен одному байту, это значение задавалось в поле DLС при формировании кадра в коде.
На основании выбранного объема кадра как раз-таки виден один байт информации, который был задан программно.
При увеличении объема кадра DLC, который может быть в диапазоне от одного до восьми, будет наблюдаться расширение кадра пропорционально введенному количеству байт, а сами байты информации могут задаваться в конфигурационных полях tx_frame.Data[0] и tx_frame.Data[1]
Стандартный и расширенный кадры отличаются только полем арбитража и одним битом в поле контроля. Расширенный формат введен для того, чтобы увеличить разрядность поля ID. Перестановки в битах, выделенные на рисунке 4 цветом, сделаны так, чтобы сохранилась совместимость со стандартным форматом кадра.

Рисунок 4 - Структура стандартного и расширенного кадров данных CAN
Запрос на прерывание передачи (флаг CAN_TX[x] в регистре MDR_CANx→TX) происходит, когда разрешенный буфер на передачу НЕ имеет запроса на отправку сообщения (TX_REQ = 0, регистр MDR_CANx→BUF_CON[x])
| Сайт: | https://support.milandr.ru |
| E-mail: | support@milandr.ru |
| Телефон: | +7 495 221-13-55 |