- Arduino и MCP2515 – интерфейс CAN для Arduino
- Arduino и MCP2515: принцип работы, подключение, схема, код
- Модуль MCP2515
- Схема подключения Arduino и MCP2515
- Код программы для взаимодействия Arduino и MCP2515
- Подключение модуля MCP2515 к Arduino
- Подключение MCP2515 к Arduino
- Контроллер шины can mcp2515
- MCP2515 — CAN контроллер
- Самое основное о MCP2515
- Обмен с MCP2515 по SPI
- Команды (инструкции) MCP2515
- Регистры MCP2515
- Инициализация MCP2515
- Прием и передача
- Напоследок
- 14 Отзывы › Ваш отзыв
- 📹 Видео
Arduino и MCP2515 – интерфейс CAN для Arduino
Видео:лекция 403 CAN шина- введениеСкачать
Arduino и MCP2515: принцип работы, подключение, схема, код
CAN (Controlled Area Network) – это стандарт шины, который позволяет микроконтроллеру и его периферийным устройствам обмениваться данными без необходимости использования хост-устройства или компьютера. Протокол CAN, разработанный Robert Bosch GmbH, в основном используется в автомобилях для связи между блоком управления и его компонентами.
Например, блок управления двигателем является основным средством управления, используемым в автомобиле. Этот блок подключен ко многим датчикам и исполнительным механизмам, таким как механизмы контроля потока воздуха, давления, температуры, управления клапанами, двигатели для контроля воздуха и т. д. Связь между этими модулями и блоком управления осуществляется через шину CAN. В этом проекте мы узнаем о модуле контроллера CAN MCP2515, о том, как связать контроллер шины CAN MCP2515 с Arduino, и, наконец, о том, как обеспечить связь между двумя платами Arduino с помощью двух контроллеров CAN MCP2515 и самого протокола CAN.
Видео:Трансиверы CAN шины TJA1050, MCP2551 как альтернатива RS485Скачать
Модуль MCP2515
Контроллер шины CAN MCP2515 – это простой модуль, который поддерживает протокол CAN версии 2.0B и может использоваться для связи со скоростью 1 Мбит/с. Для того, чтобы настроить полную систему связи, вам потребуется два модуля шины CAN. Модуль, используемый в проекте, показан на рисунке ниже.
Этот конкретный модуль основан на ИС контроллера CAN MCP2515 и ИС приемопередатчика TJA1050. Микросхема MCP2515 представляет собой автономный контроллер CAN и имеет встроенный интерфейс SPI для связи с микроконтроллерами. Что касается микросхемы TJA1050, она действует как интерфейс между ИС контроллера MCP2515 и физической шиной CAN.
MCP2515 – это основной контроллер, который состоит из трех основных подкомпонентов: модуля CAN, логики управления и блока SPI. Модуль CAN отвечает за передачу и прием сообщений на шине CAN. Логика управления управляет настройкой и работой MCP2515, взаимодействуя со всеми блоками. Блок SPI отвечает за интерфейс связи SPI.
На следующем рисунке показана схема CAN-модуля MCP2515, а также показано, как микросхема MCP2515 и TJA1050 подключены к модулю.
Видео:MCP2515, контроллер CAN шины с интерфейсом SPIСкачать
Схема подключения Arduino и MCP2515
На следующем рисунке показана принципиальная схема подключения модуля CAN MCP2515 с Arduino и связь между двумя Arduino по протоколу CAN.
Видео:Передача данных через CAN шину #MCP2515 #ARDUINO #DS18B20 #GALILEOSKY7 #EASYLOGIC #ПРОГРАММИРОВАНИЕСкачать
Код программы для взаимодействия Arduino и MCP2515
Прежде чем углубляться в код, вам необходимо скачать библиотеку для модуля MCP2515. Есть много библиотек, но здесь мы использовали эту: https://github.com/Seeed-Studio/CAN_BUS_Shield. Загрузите ее и поместите извлеченное содержимое в каталог библиотек Arduino. Поскольку сеть CAN включает в себя модуль передатчика и модуль приемника, код также делится на код передатчика и код приемника.
Работа этого проекта очень проста, так как вся работа выполняется библиотеками (SPI и CAN). Поскольку CAN является связью на основе сообщений, вам необходимо отправить сообщение в диапазоне от 0 до 8 байтов.
В этом проекте передатчик отправляет сообщение 1 1 2 3 0 5 6 7. Это сообщение передается по шине CAN, и получатель получает это сообщение, что отображается на его последовательном мониторе. Кроме того, 0-й и 4-й биты, то есть 1 и 0 в вышеуказанной последовательности, извлекаются приемником отдельно и включают и выключают светодиод, подключенный к контакту 2 платы Arduino.
Видео:Ардуино+CAN MCP2515 в Дастер 2017Скачать
Подключение модуля MCP2515 к Arduino
Модуль MCP2515 — это контроллер шины CAN, который позволяет обмениваться данными между периферийными устройствами и микроконтроллером без подключений к компьютеру. Прежде чем обратиться к сборке аппаратных компонентов, мы рассмотрим основные моменты, связанные с этой технологией.
Controlled Area Network — стандарт интерфейса. Он часто используется в электронных системах диагностики современных автомобилей для передачи информации от блока управления к другим цифровым датчикам и механизмам (контроля температуры, давления и т.п.). Такая его особенность позволяет активно применять устройство во многих как простых, так и более сложных проектах (например, моделирование системы «умный дом») – все это без задействования ПК.
Модуль MCP2515 представляет собой компактный автономный контроллер с 3 подкомпонентами и интегрированным интерфейсом SPI.
- напряжение питания: 5V;
- интерфейс: высокоскоростной SPI;
- частота: 40 МГц;
- тип шины: CAN;
- max скорость шины: 1МБ/сек.;
- рабочий ток: 5 мА (в режиме ожидания — 1uA);
- диапазон рабочих температур: -40 … +85 C;
- габариты: 4х2.8 см.
Читайте также: Прикипел датчик давления в шинах
Контроллер оснащен держателем Micro SD-карты, кнопкой сброса, разъемом для последовательного LCD, 2-мя LED-индикаторами. При желании возможно управление с помощью джойстика.
Кроме всего вышеперечисленного, устройство имеет неплохие дополнительные (опциональные) возможности: эффективная фильтрация сведений, высокая производительность и коммерческая доступность.
Видео:Arduino CAN Monitor (простейший монитор шины CAN)Скачать
Подключение MCP2515 к Arduino
Давайте рассмотрим принципиальную схему подключения.
Для реализации несложного проекта нам понадобится такое «железо»:
- CAN контроллер MCP2515 – 2 шт.
- Плата Arduino (Uno, Nano или Mega) – 2шт.
- Макетная плата.
- Соединительные провода.
Еще более простая схема сборки:
Для прошивки и облегчения процесса программирования рекомендуем использовать специализированное ПО — CAN_BUS_Shield. Эту библиотеку необходимо скачать и инсталлировать, а именно разархивировать содержимое следует в каталог библиотек среды Arduino IDE.
Еще один популярный (альтернативный) вариант — MCP_CAN_lib
Зальем 2 скетча (под код передатчика и приемника CAN):
Как вы наверняка успели отметить, мы использовали еще один софт – библиотеку SPI (уже для управления интерфейсом). Проверьте ее наличие у себя в приложении!
Изучайте Arduino, выбирайте интересные проекты и развивайтесь в этом направлении. До скорой встречи!
Видео:STM32 CAN шина. Часть 1. Настройка и странности HALСкачать
Контроллер шины can mcp2515
Видео:CAN Hacker своими руками пример чтения кан шины с помощью ARDUINO MCP2515Скачать
MCP2515 — CAN контроллер
Бывает так, что у примененного микроконтроллера нет встроенного CAN контроллера, или имеющихся не хватает. В этом случае на помощь приходит контроллер CAN на микросхеме компании Microchip MCP2515. Под катом я расскажу об основных приемах работы с этой микросхемой. Микросхема MCP2515 позиционируется как улучшенная замена MCP2510.
Самое основное о MCP2515
MCP2515 обеспечивает реализацию протокола CAN по SPI шине. Краткие характеристики микросхемы:
- Соответствует стандарту CAN V2.0B.
- Стандартные и расширенные ID и возможность удаленных запросов данных.
- Шесть 29 битных фильтра для приема сообщений.
- Две 29 битных маски для приема сообщений.
- Высокоскоростной SPI, до 10 МГц.
- Выход программируемого делителя частоты.
- Напряжение питания от 2,7В до 5,5В.
Различные конфигурации корпусов.
Корпуса и цоколевка MCP2515
Обмен с MCP2515 по SPI
Первым делом необходимо научиться читать и писать в регистры MCP2515 по SPI каналу. Для управления используется четыре линии SPI:
- CS (активный 0) — выбор чипа на шине SPI;
- SCK — тактирование мастером (обычно в роли ведущего выступает микроконтроллер);
- SI — линия передачи данных от МК к MCP2515;
- SO — линия передачи данных от MCP2515 к МК.
Чтобы можно было быстро реагировать на получение сообщений и оптимизацию работы с SPI, у MCP2515 имеется несколько выходов, которые являются флагами событий микросхемы и которые можно использовать для запуска внешнего прерывания в микроконтроллере. К таким выходам относятся #RX0BF и #RX1BF.
Я управлял микросхемой MCP2515 при помощи микроконтроллера семейства dsPIC33F, соответственно и код приведу для этого микроконтроллера. SPI микроконтроллера настроен в режим 00, посылки по 8 бит. На плате, которая мне досталась, #RX0BF и #RX1BF задействованы не были — MCP2515 связана с МК только по SPI.
[code language=»cpp»]
/* =============================================================================
* ПЕРЕДАТЬ и ПОЛУЧИТЬ БАЙТ ПО SPI1
*/
unsigned char BUTE_SPI1(unsigned char bt)
[/code]В большинстве случаев общение с MCP2515 производится по алгоритму:
- выбрать нужную MCP2515 сигналом CS;
- отправить команду;
- отправить адрес регистра;
- отправить значение в регистр (в случае чтения эта операция вызовет чтение содержимого регистра).
Пример записи произвольной информации в регистр
Пример чтения информации из регистра
Команды (инструкции) MCP2515
Вы, наверное, уже заметили, что выше использовались команды READ, WRITE и приводились их значения. Откуда я их взял? Из datasheet, а чтобы было удобнее, я выписал их в отдельный *.h файл, привожу команды микросхемы MCP2515 ниже
Команды вроде READBUF0_RX_D0 позволяют экономить на количестве SPI посылок. Так мы вначале указываем, что хотим прочитать данные из буфера, после чего посылаем восемь пустых байт для чтения восьми байт буфера.
Список команд приведен в Datasheet:
Список инструкций для MCP2515
Регистры MCP2515
Регистры контроллера MCP2515 приведены в Datasheet
Разумеется, в таком виде пользоваться ими неудобно, поэтому я их тоже вложил в *.h файл и местами даже расшифровал:
Полезно помнить — CAN в MCP2515 близок по функциональности и регистровому составу модулю CAN в микроконтроллерах серии PIC18. На CAN модуль этих микроконтроллеров имеется русскоязычное описание
Читайте также: Плохие шины для зимы
Категория: | MCP2515 |
Лицензия: | Freeware |
Дата: | 15.04.2014 |
Даже если нет нужного регистра — не отчаивайтесь! Пройдитесь поиском по названию конкретного бита в регистре. Уверен — найдете все необходимое!
Инициализация MCP2515
Контроллер MCP2515 после включения питания находится в режиме конфигурации, в чем можно убедиться получив биты OPMOD из регистра CANSTAT:
Седьмой, шестой и пятый биты — биты OPMOD2..OPMOD0.
Устанавливаем флаги прерываний
Настраиваем приемный буфер
Настройку скорости я позаимствовал на просторах интернета. В заголовочный файл добавил строки:
А в код добавил SPI команды:
Как видим, скорость зависит от содержимого регистров CNF. В моем случае частота кварца на MCP2515 составили 8МГц, а требуемая мне скорость обмена по шине CAN 125кБит. Именно на этой скорости работала CAN шина к которой я подключался.
В сети имеется русскоязычное руководство от Microchip по настройке CAN модулей и расчету скоростей обмена:
Категория: | MCP2515 |
Лицензия: | Freeware |
Дата: | 15.04.2014 |
Прием и передача
При приеме сообщения последовательность следующая: в цикле проверяем наличие новых данных. Если новые данные обнаружены — производим чтение.
Процедура mcp_newCAN() крутится в главном цикле
Если обнаруживается новое сообщение, то выполняется чтение:
mcp_getCAN() рассмотрели выше.
Напоследок
Имеется не нулевая вероятность, что в дальнейшем мне придется столкнуться с MCP2515 более плотно. Это означает, что материал будет либо дополнен, либо вообще полностью переделан. Мне интересно — хотели бы вы видеть отладочную плату на MCP2515? И если хотели бы, то что там должно быть:
- количество MCP2515
- корпус MCP2515 (DIP, SOIC, TSSOP, QFN)
- наличие и тип микроконтроллера
- встроенные драйвера CAN шины
- встроенное питание
- ets
Ну и какую цену при покупке готового отладочного устройства либо при самостоятельном изготовлении всего этого вы считаете приемлемой? Все — в комментариях =)
И как бонус выложу Datasheet MCP2515
Языки: | English |
Требования: | PDF Reader |
Категория: | MCP2515 |
Лицензия: | Freeware |
Дата: | 15.04.2014 |
А еще есть функциональный аналог — IN2515, и описание на русском
Требования: | PDF Reader |
Категория: | MCP2515 |
Лицензия: | Freeware |
Дата: | 16.06.2016 |
14 Отзывы › Ваш отзыв
Спасибо за статью, мне она оказалась полезной.
Есть у меня вопросы, но задам их попозже, уже как сам не смогу разобраться.
Прилагаю описание регистров в ХЕКСах, а не в бинарнике, оно так, иногда, бывает удобнее.
#define RXF0SIDH 0x00
#define RXF0SIDL 0x01
#define RXF0EID8 0x02
#define RXF0EID0 0x03
#define RXF1SIDH 0x04
#define RXF1SIDL 0x05
#define RXF1EID8 0x06
#define RXF1EID0 0x07
#define RXF2SIDH 0x08
#define RXF2SIDL 0x09
#define RXF2EID8 0x0A
#define RXF2EID0 0x0B
#define BFPCTRL 0x0C
#define B1BFS 0x20
#define B0BFS 0x10
#define B1BFE 0x08
#define B0BFE 0x04
#define B1BFM 0x02
#define B0BFM 0x01
#define TXRTSCTRL 0x0D
#define B2RTS 0x20
#define B1RTS 0x10
#define B0RTS 0x08
#define B2RTSM 0x04
#define B1RTSM 0x02
#define B0RTSM 0x01
#define CANSTAT 0x0E
#define OPMOD2 0x80
#define OPMOD1 0x40
#define OPMOD0 0x20
#define ICOD2 0x08
#define ICOD1 0x04
#define ICOD0 0x02
#define CANCTRL 0x0F
#define REQOP2 0x80
#define REQOP1 0x40
#define REQOP0 0x20
#define ABAT 0x10
#define OSM 0x08
#define CLKEN 0x04
#define CLKPRE1 0x02
#define CLKPRE0 0x01
#define RXF3SIDH 0x10
#define RXF3SIDL 0x11
#define RXF3EID8 0x12
#define RXF3EID0 0x13
#define RXF4SIDH 0x14
#define RXF4SIDL 0x15
#define RXF4EID8 0x16
#define RXF4EID0 0x17
#define RXF5SIDH 0x18
#define RXF5SIDL 0x19
#define RXF5EID8 0x1A
#define RXF5EID0 0x1B
#define TEC 0x1C
#define REC 0x1D
#define RXM0SIDH 0x20
#define RXM0SIDL 0x21
#define RXM0EID8 0x22
#define RXM0EID0 0x23
#define RXM1SIDH 0x24
#define RXM1SIDL 0x25
#define RXM1EID8 0x26
#define RXM1EID0 0x27
#define CNF3 0x28
#define SOF 0x80
#define WAKFIL 0x40
#define PHSEG22 0x04
#define PHSEG21 0x02
#define PHSEG20 0x01
#define CNF2 0x29
#define BTLMODE 0x80
#define SAM 0x40
#define PHSEG12 0x20
#define PHSEG11 0x10
#define PHSEG10 0x08
#define PRSEG2 0x04
#define PRSEG1 0x02
#define PRSEG0 0x01
#define CNF1 0x2A
#define SJW1 0x80
#define SJW0 0x40
#define BRP5 0x20
#define BRP4 0x10
#define BRP3 0x08
#define BRP2 0x04
#define BRP1 0x02
#define BRP0 0x01
Читайте также: Шины в ульяновске континенталь
#define CANINTE 0x2B
#define MERRE 0x80
#define WAKIE 0x40
#define ERRIE 0x20
#define TX2IE 0x10
#define TX1IE 0x08
#define TX0IE 0x04
#define RX1IE 0x02
#define RX0IE 0x01
#define CANINTF 0x2C
#define MERRF 0x80
#define WAKIF 0x40
#define ERRIF 0x20
#define TX2IF 0x10
#define TX1IF 0x08
#define TX0IF 0x04
#define RX1IF 0x02
#define RX0IF 0x01
#define EFLG 0x2D
#define RX1OV 0x80
#define RRX0OVR 0x40
#define TXBO 0x20
#define TXEP 0x10
#define RXEP 0x08
#define TXWAR 0x04
#define RXWAR 0x02
#define EWARN 0x01
#define TXB0CTRL 0x30
#define ABTF 0x40
#define MLOA 0x20
#define TXERR 0x10
#define TXREQ 0x08
#define TXP1 0x02
#define TXP0 0x01
#define TXP_MASK 0x03
#define TXB0SIDH 0x31
#define TXB0SIDL 0x32
#define TXB0EID8 0x33
#define TXB0EID0 0x34
#define TXB0DLC 0x35
#define TXB0D0 0x36
#define TXB0D1 0x37
#define TXB0D2 0x38
#define TXB0D3 0x39
#define TXB0D4 0x3A
#define TXB0D5 0x3B
#define TXB0D6 0x3C
#define TXB0D7 0x3D
#define TXB1CTRL 0x40
#define TXB1SIDH 0x41
#define TXB1SIDL 0x42
#define TXB1EID8 0x43
#define TXB1EID0 0x44
#define TXB1DLC 0x45
#define TXB1D0 0x46
#define TXB1D1 0x47
#define TXB1D2 0x48
#define TXB1D3 0x49
#define TXB1D4 0x4A
#define TXB1D5 0x4B
#define TXB1D6 0x4C
#define TXB1D7 0x4D
#define TXB2CTRL 0x50
#define TXB2SIDH 0x51
#define TXB2SIDL 0x52
#define TXB2EID8 0x53
#define TXB2EID0 0x54
#define TXB2DLC 0x55
#define TXB2D0 0x56
#define TXB2D1 0x57
#define TXB2D2 0x58
#define TXB2D3 0x59
#define TXB2D4 0x5A
#define TXB2D5 0x5B
#define TXB2D6 0x5C
#define TXB2D7 0x5D
#define RXB0CTRL 0x60
#define RXM1 0x40
#define RXM0 0x20
#define RXRTR 0x08
#define BUKT 0x04
#define BUKT1 0x02
#define FILHIT0 0x01
//rx buffers regs
#define RXB0SIDH 0x61
#define RXB0SIDL 0x62
#define RXB0EID8 0x63
#define RXB0EID0 0x64
#define RXB0DLC 0x65
#define RXB0D0 0x66
#define RXB0D1 0x67
#define RXB0D2 0x68
#define RXB0D3 0x69
#define RXB0D4 0x6A
#define RXB0D5 0x6B
#define RXB0D6 0x6C
#define RXB0D7 0x6D
#define RXB1CTRL 0x70
#define FILHIT2 0x04
#define FILHIT1 0x02
#define RXB1SIDH 0x71
#define RXB1SIDL 0x72
#define RXB1EID8 0x73
#define RXB1EID0 0x74
#define RXB1DLC 0x75
#define RXB1D0 0x76
#define RXB1D1 0x77
#define RXB1D2 0x78
#define RXB1D3 0x79
#define RXB1D4 0x7A
#define RXB1D5 0x7B
#define RXB1D6 0x7C
#define RXB1D7 0x7D
#define SID10 0x80
#define SID9 0x40
#define SID8 0x20
#define SID7 0x10
#define SID6 0x08
#define SID5 0x04
#define SID4 0x02
#define SID3 0x01
#define SID2 0x80
#define SID1 0x40
#define SID0 0x20
#define SRR 0x10
#define IDE 0x08
#define EXIDE 0x08
#define EID17 0x02
#define EID16 0x01
#define EID15 0x80
#define EID14 0x40
#define EID13 0x20
#define EID12 0x10
#define EID11 0x08
#define EID10 0x04
#define EID9 0x02
#define EID8 0x01
#define EID7 0x80
#define EID6 0x40
#define EID5 0x20
#define EID4 0x10
#define EID3 0x08
#define EID2 0x04
#define EID1 0x02
#define EID0 0x01
#define RTR 0x40
#define RB1 0x20
#define RB0 0x10
#define DLC3 0x08
#define DLC2 0x04
#define DLC1 0x02
#define DLC0 0x01
#define DLEN_MASK 0x0F
#define CMD_RESET 0xC0
#define CMD_READ 0x03
#define CMD_READ_RX 0x90
#define RX0ID 0x00
#define RX0DATA 0x02
#define RX1ID 0x04
#define RX1DATA 0x06
#define RX_MASK 0x06
#define CMD_WRITE 0x02
#define CMD_WRITE_TX 0x40
#define TX0ID 0x00
#define TX0DATA 0x01
#define TX1ID 0x02
#define TX1DATA 0x03
#define TX2ID 0x04
#define TX2DATA 0x05
#define TX_MASK 0x07
#define CMD_RTS 0x80
#define CMD_RTS0 0x01
#define CMD_RTS1 0x02
#define CMD_RTS2 0x04
#define CMD_RTS_MASK 0x07
#define CMD_READ_STATUS 0xA0
#define CMD_RX_STATUS 0xB0
#define RX_STATUS_NOMSG 0x00
#define RX_STATUS_MSG0 0x40
#define RX_STATUS_MSG1 0x80
#define RX_STATUS_MSGBOTH 0xC0
#define RX_STATUS_DATA 0x00
#define RX_STATUS_REMOTE 0x10
#define RX_STATUS_EXTDATA 0x20
#define RX_STATUS_EXTREMOTE 0x30
#define RX_STATUS_RXF0 0x00
#define RX_STATUS_RXF1 0x01
#define RX_STATUS_RXF2 0x02
#define RX_STATUS_RXF3 0x03
#define RX_STATUS_RXF4 0x04
#define RX_STATUS_RXF5 0x05
#define RX_STATUS_RXF0ROLL 0x06
#define RX_STATUS_RXF1ROLL 0x07
#define CMD_BIT_MODIFY 0x05
Вот Вы написали «Прием и передача», а описали только «Приём»…
А мне как-раз интересно как задаётся ИД посылки в КАН-шину.
- Свежие записи
- Нужно ли менять пружины при замене амортизаторов
- Скрипят амортизаторы на машине что делать
- Из чего состоит стойка амортизатора передняя
- Чем стянуть пружину амортизатора без стяжек
- Для чего нужны амортизаторы в автомобиле
📹 Видео
Как устранить проблему с sm контроллер шиныСкачать
CAN BUS Communication Using MCP2515 Module.Скачать
Как управлять автомобилем через CAN-шину?Скачать
MCP2515 CAN Controller Demo CAN BUS Protocol Diagnostic ToolСкачать
CAN шина👏 Как это работаетСкачать
Демонстрация управления системой с использованием шины CANСкачать
CAN Bus Gateway (самодельный кан шлюз с дополнительными плюшками)Скачать
Sm контроллер шины что это, 1Скачать
🔌 OBD2 симулятор на Arduino и CAN Bus MCP2515Скачать
Универсальная плата CAN шиныСкачать
TJA1050 CAN Controller Interface ModuleСкачать
CAN testСкачать