ОК. Теперь Вам нужна Шина CAN Рекламный листок компании...

2
Рекламный листок компании MikroElektronika www.mikroe.com mikroBASIC и mikroBASICPRO® являются зарегистрированными торговыми марками компании MikroElektronika. Все права защищены. Часто бывает необходимо, чтобы несколько микроконтроллеров, выполняющих различные операции, были интегрированы в единую систему для выполнения сложной задачи. Ниже будет показано, как соединить три микроконтроллера в сеть CAN и как использовать фильтры в узлах CAN сети для фильтрации сообщений. Всякий раз, когда несколько периферий- ных устройств совместно используют одну и ту же шину данных, необходимо опреде- лить правила обращения к шине. Прото- кол CAN подробно описывает все детали соединения нескольких устройств в сеть и широко используется в промышленно- сти. Изначально, протокол определяет способ реализации шины и решения про- блем ‘коллизий’ аппаратными средствами, в ситуациях, когда несколько устройств, одновременно, начинают обмен данными по шине. Аппаратная часть В данном примере, шина CAN будет сконфигурирована таким образом, что первое устройство будет отправлять сообщения, содержащие идентифи- катор устройства (ID) 0x10 и 0x11, в то время как второе и третье устройство будут отправлять сообщения с иденти- фикаторами 0x12 и 0x13, соответствен- но. Кроме того, узлы CAN будут сконфи- гурированы таким образом, что второй узел будет отвечать только на сообще- ния с 0x10 only, в то время как третий узел будет отвечать только на сообще- ния с ID 0x11. Соответственно, the first первое устройство будет сконфигури- ровано таким образом, чтобы отвечать на сообщения с ID 0x12 и 0x13 (Рисунок 2). Проще всего фильтрацию сообщений осуществить с помощью вызова функ- ции CANSPISetFilter, которая также об- работает данные из всех необходимых регистров микроконтроллера и платы CAN SPI. В общем случае, для CAN про- токола не требуется наличия на шине Выделенного Контроллера protocol. Однако, для упрощения понимания рас- сматриваемого примера, который явля- ется универсальным примером, только первое устройство сконфигурировано для инициализации обмена данными по шине, в то время как остальные два устройства лишь отвечают на индиви- дуальные вызовы. Программная часть При отправке сообщения, Выделенный Контроллер выделяет вызываемому устройству достаточно времени для от- вета. В случае, если удаленный узел не отвечает в течение установленного вре- мени, Выделенный Контроллер сооб- щает об ошибке в текущем сообщении и пытается связаться с другим узлом (Рисунок 3). В случае, если периферий- ный узел CAN отвечает одновременно с другим узлом, на шине CAN возникает ‘коллизия’. Однако, приоритет адреса устройства и положение о шине CAN предписывают, чтобы передающий узел с более низким приоритетом ушел с шины, таким образом позволяя узлу, передающему сообщение с более вы- соким приоритетом незамедлительно продолжить передачу. Как было описано выше, для передачи и приема сообщений на шине CAN будет использоваться внутренний SPI модуль микроконтроллера. Перечислим не- которые преимущества использования внутреннего модуля SPI микроконтрол- лера: возможность генерации преры- ваний при отправке и приеме данных; модуль SPI работает независимо от дру- гих периферийных устройств и легко конфигурируется. Библиотека CAN SPI library позволяет выбирать режим рабо- ты CAN и фильтрации узлов, считывать данные из буфера платы CAN SPI, и т.п. ОК. Шина CAN Теперь Вам нужна... Система разработки EasyAVR5A и модуль CAN-SPI Автор Zoran Ristic Отдел программного обеспечения компании MikroElektronika Рисунок 1. Фильтрация сообщений

Transcript of ОК. Теперь Вам нужна Шина CAN Рекламный листок компании...

Page 1: ОК. Теперь Вам нужна Шина CAN Рекламный листок компании MikroElektronika mikroBASIC и mikroBASICPRO® являются зарегистрированными

Рекламный листок компании MikroElektronika www.mikroe.commikroBASIC и mikroBASICPRO® являются зарегистрированными торговыми марками компании MikroElektronika. Все права защищены.

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

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

Аппаратная частьВ данном примере, шина CAN будет сконфигурирована таким образом, что первое устройство будет отправлять сообщения, содержащие идентифи-катор устройства (ID) 0x10 и 0x11, в то время как второе и третье устройство будут отправлять сообщения с иденти-фикаторами 0x12 и 0x13, соответствен-но. Кроме того, узлы CAN будут сконфи-гурированы таким образом, что второй узел будет отвечать только на сообще-ния с 0x10 only, в то время как третий узел будет отвечать только на сообще-ния с ID 0x11. Соответственно, the first первое устройство будет сконфигури-ровано таким образом, чтобы отвечать на сообщения с ID 0x12 и 0x13 (Рисунок 2). Проще всего фильтрацию сообщений осуществить с помощью вызова функ-ции CANSPISetFilter, которая также об-работает данные из всех необходимых регистров микроконтроллера и платы CAN SPI. В общем случае, для CAN про-токола не требуется наличия на шине

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

Программная частьПри отправке сообщения, Выделенный Контроллер выделяет вызываемому устройству достаточно времени для от-вета. В случае, если удаленный узел не отвечает в течение установленного вре-мени, Выделенный Контроллер сооб-щает об ошибке в текущем сообщении и пытается связаться с другим узлом (Рисунок 3). В случае, если периферий-ный узел CAN отвечает одновременно с другим узлом, на шине CAN возникает

‘коллизия’. Однако, приоритет адреса устройства и положение о шине CAN предписывают, чтобы передающий узел с более низким приоритетом ушел с шины, таким образом позволяя узлу, передающему сообщение с более вы-соким приоритетом незамедлительно продолжить передачу.Как было описано выше, для передачи и приема сообщений на шине CAN будет использоваться внутренний SPI модуль микроконтроллера. Перечислим не-которые преимущества использования внутреннего модуля SPI микроконтрол-лера: возможность генерации преры-ваний при отправке и приеме данных; модуль SPI работает независимо от дру-гих периферийных устройств и легко конфигурируется. Библиотека CAN SPI library позволяет выбирать режим рабо-ты CAN и фильтрации узлов, считывать данные из буфера платы CAN SPI, и т.п.

ОК. Шина CANТеперь Вам нужна...

Система разработки EasyAVR5A и модуль CAN-SPIАвтор Zoran RisticОтдел программного обеспечения компании MikroElektronika

Рисунок 1. Фильтрация сообщений

Page 2: ОК. Теперь Вам нужна Шина CAN Рекламный листок компании MikroElektronika mikroBASIC и mikroBASICPRO® являются зарегистрированными

Рекламный листок компании MikroElektronika www.mikroe.commikroC® и mikroC PRO® являются зарегистрированными торговыми марками компании MikroElektronika. ЗА

МЕЧ

АНИ

Е:

Логотип Atmel® и его комбинация с логотипом AVR® и другими являются зарегистрированными торговыми марками корпорации Atmel Corporation или ее дочерних образований. Другие обозначения и наименования продуктов могут быть торговыми марками их владельцев.

Другие функции mikroBASIC PRO for AVR, использованные в программе:

Delay_us() SPI1_init() SPI1_read()

CANSPIGetOperationMode()

CANSPIInitialize()*

CANIRead()*CANSPISetBaudRate()

CANSPISetFilter()*

CANSPISetMask()*

CANSPISetOperationMode()*

CANSPIWrite()*

Получить текущий режим работыИнициализация модуля CANSPIЧтение сообщенияУстановка скорости обмена для CANSPI Конфигурирование фильтра сообщенийРасширенное конфигурированиефильтра сообщенийУстановить текущий режим работыЗаписать сообщение

Редактор библиотек mikroBASIC PRO for AVR® library editor с готовыми к использованию библиотеками, такими как: CAN_SPI, GLCD, Ethernet и т.п.

Функции, использованные в программе

* Функции библиотеки Glcd library, использованные в программе

Кроме того, в примере имеется функция управления светодиодами, подключенными к выводам микроконтроллера, для индикации нормальной работы сети. Когда узел node 2 отвечает на запрос от узла node 1, то автоматически зажигаются светодиоды, подклю-ченные к порту PORTB. На запрос отвечает узел node 3, то зажигаются светодиоды, под-ключенные к порту PORTD. В рассматриваемом примере имеется образец кода для всех трех узлов сети. Чтобы создать HEX файл для каждого из примеров в отдельности, не-обходимо написать только одну директиву DEFINE в заголовке примера.

Пример 1. Подключение модуля CAN-SPI к микроконтроллеру ATmega 16

Рисунок 2. Пример обмена данными

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

Программа, иллюстрирующая работу шины CAN

program CanSPI‘ Описание. Программа демонстрирует принципы построения сети CAN с использованием продукции компании mikroElektronika:‘ плат CANSPI boards и компилятора mikroBasic Pro.‘ Целевая микросхема: ATMEGA 16‘ Тактовый генератор: 8МГц кварцевый резонаторdim Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags as byte‘ флаги CANRx_Data_Len as byte‘длина принятых данных в БайтахRxTx_Data as byte[8]‘ буфер данных Rx/Tx для CANMsg_Rcvd as byte‘ флаг приемаTx_ID, Rx_ID as longint‘Rx/Tx ID для CANErrorCount as byte‘ подключение модуля CANSPIdim CanSpi_CS as sbit at PORTB.B0‘ Вывод Выборка микросхемы (CS) для платы CANSPICanSpi_CS_Direction as sbit at DDRB.B0‘ Направление обмена для вывода CSCanSpi_Rst as sbit at PORTB.B2‘ Вывод Сброс (Reset) для платы CANSPICanSpi_Rst_Direction as sbit at DDRB.B2‘Направление обмена для вывода Reset‘ Конец описания подключения модуля CANSPImain:ADCSRA.7 = 0‘ Сконфигурировать аналоговые выводы как цифровые линии I/OPORTB = 0DDRB = 255‘ Инициализация портовPORTD = 0DDRD = 255PORTC = 0DDRC = 255ErrorCount = 0‘ флаг Ошибка (Error)Can_Init_Flags = 0Can_Send_Flags = 0Can_Rcv_Flags = 0‘ очистить все флагиCan_Send_Flags = _CANSPI_TX_PRIORITY_0 and‘ сформировать необходимые значения_CANSPI_TX_XTD_FRAME and‘ для CANSPIWrite_CANSPI_TX_NO_RTR_FRAMECan_Init_Flags = _CANSPI_CONFIG_SAMPLE_THRICE and‘сформировать необходимые значения_CANSPI_CONFIG_PHSEG2_PRG_ON and‘ для CANSPIInit_CANSPI_CONFIG_XTD_MSG and_CANSPI_CONFIG_DBL_BUFFER_ON and_CANSPI_CONFIG_VALID_XTD_MSGSPI1_Init()‘ инициализация модуля SPICANSPIInitialize(1, 3, 3, 3, 1, Can_Init_Flags)‘ инициализация внешнего модуля CANSPICANSPISetOperationMode(_CANSPI_MODE_CONFIG, TRUE)‘ установить режим КОНФИГУРАЦИЯ (CONFIGURATION mode)CANSPISetMask(_CANSPI_MASK_B1, -1, _CANSPI_CONFIG_XTD_MSG)‘ установить все биты маски mask1 в “1”CANSPISetMask(_CANSPI_MASK_B2, -1, _CANSPI_CONFIG_XTD_MSG)‘установить все биты маски mask2 в “1”CANSPISetFilter(_CANSPI_FILTER_B2_F4, 0x12, _CANSPI_CONFIG_XTD_MSG) ‘ узел Node1 принимает сообщения с ID=0x12CANSPISetFilter(_CANSPI_FILTER_B1_F1, 0x13, _CANSPI_CONFIG_XTD_MSG) ‘узел Node1 принимает сообщения с ID=0x13CANSPISetOperationMode(_CANSPI_MODE_NORMAL,0xFF)‘ установить режим НОРМАЛЬНЫЙ (NORMAL mode)RxTx_Data[0] = 0x40‘ задать начальные данные для передачиTx_ID = 0x10‘ установить метку передачи (transmit ID)для CAN-соообщенияCANSPIWrite(Tx_ID, RxTx_Data, 1, Can_Send_Flags)‘ узел Node1 посылает начальное сообщениеwhile (TRUE)‘ бесконечный циклMsg_Rcvd = CANSPIRead(Rx_ID, RxTx_Data, Rx_Data_Len,Can_Rcv_Flags) ‘пытаемся принять сообщениеif (Msg_Rcvd) then‘ если сообщение принято, то проверяем его IDif Rx_ID = 0x12 then‘ проверка IDPORTC = RxTx_Data[0] ‘ выводим данные в порт PORTCelsePORTD = RxTx_Data[0] ‘выводим данные в порт PORTDend ifdelay_ms(50) ‘ пауза между сообщениямиCANSPIWrite(Tx_ID, RxTx_Data, 1, Can_Send_Flags)‘ отправляет один байт данныхinc(Tx_ID)‘ переходим к следующему сообщениюif Tx_ID > 0x11 then Tx_ID = 0x10 end if‘ проверка переполненияelse‘ если возникла ошибка, ожидаемinc(ErrorCount)‘пока индикатор ошибок увеличит значение на единицу Delay_ms(10)‘ пауза 10мсекif (ErrorCount > 10) then‘ превышен интервал ожидания - ошибки процессаErrorCount = 0‘ сброс счетчика ошибокinc(Tx_ID)‘ переходим к следующему сообщениюif Tx_ID > 0x11 then Tx_ID = 0x10 end if‘ проверка переполненияCANSPIWrite(Tx_ID, RxTx_Data, 1, Can_Send_Flags)‘ посылаем новое сообщениеend ifend ifwendend.

Код этого примера, написанный для микроконтроллеров AVR®, на языках C, Basic и Pascal, так же как и программы, написанные для микроконтроллеров dsPIC® и PIC® можно найти на веб сайте компании MikroElektronika: www.mikroe.com/en/article/