Can шина как подключить к компьютеру

Обновлено: 04.07.2024

Современные автомобили включают в себя несколько десятков разнообразных датчиков. И все эти датчики регулярно обмениваются информацией с другими датчиками/устройствами автомобиля. Причем автомобили с каждым годом становятся все "умнее" и поэтому количество датчиков в них все больше увеличивается. В автомобилях сегодняшнего дня находят широкое применение системы автономного вождения, системы безопасности с автоматически срабатывающими подушками безопасности, системы контроля давления в шинах, круиз-контроль и т.д. В большинстве случаев информация, поступающая от этих датчиков, является критически важной. Например, если сработает датчик столкновения, которому срочно нужно передать сигнал на раскрытие подушек безопасности, а ему это помешают сделать какие-либо сигналы/процессы в электронной системе автомобиля. В этом случае жизнь людей в автомобиле может оказаться под угрозой. Поэтому в автомобилях не используют такие широко распространенные в обычной электронике протоколы передачи данных как UART, SPI или I2C. Вместо них конструкторы автомобилей отдают предпочтение значительно более надежным протоколам передачи данных, таким как LIN, CAN, FlexRay и т.д.

Внешний вид подключения контроллера шины CAN MCP2515 к плате Arduino

Наибольшее распространение среди этих "надежных" протоколов получил стандарт (протокол) CAN. Этот стандарт широко применяется не только в электронных системах современных автомобилей, но и во многих других промышленных устройства, в которых критически важна надежная передача данных. Достаточно подробную информацию о стандарте CAN можно прочитать в соответствующей статье Википедии. Мы же в данной статье рассмотрим обмен данными между двумя платами Arduino с помощью протокола CAN.

Краткие сведения о протоколе CAN

Структура сети в стандарте CAN

CAN-сеть состоит из двух проводников (CAN High и CAN Low) и обеспечивает двунаправленную передачу данных. На практике под CAN-сетью обычно подразумевается сеть топологии "шина" с физическим уровнем в виде дифференциальной пары. Передача ведется кадрами, которые могут принимать все узлы сети. Для доступа к такой шине выпускаются специализированные микросхемы (модули) – драйверы CAN-шины.

Обычно скорость передачи по CAN-шине варьируется от 50 Кбит/с до 1 Мбит/с, а дальность связи лежит в диапазоне от 40 метров (на скорости 1 Мбит/с) до 1000 метров (на скорости 50 Кбит/с).

Идентификатор (Identifier) – также известен под именами CAN ID и PGN (Parameter Group Number). Он используется для идентификации CAN устройств в CAN-сети. Длина идентификатора составляет 11 или 29 бит в зависимости от того какой тип протокола CAN используется:

  • Standard (стандартный) CAN: 0-2047 (11-bit);
  • Extended (расширенный) CAN: 0-2 29 -1 (29-bit).

Data – это данные, которые необходимо передать от одного устройства другому. Длина данных может составлять от 0 до 8 байт.

Data Length Code (DLC) (длина поля данных): может принимать значения от 0 до 8 в зависимости от количества байт для передачи.

Проводники, используемые в CAN

CAN протокол работает по двум проводникам, именуемыми CAN_H и CAN_L, для передачи и приема информации. Оба проводника работают как дифференциальная линия, что означает что CAN сигнал (0 или 1) представляет собой разность потенциалов между CAN_L и CAN_H. Если эта разность положительна и больше определенного минимального уровня напряжения, то это 1, а если эта разность отрицательна – то это 0.

Обычно в протоколе CAN используется кабель с витыми жилами. Как показано на выше приведенном рисунке, на обоих концах CAN-сети включается 120-омный резистор для обеспечения баланса в линии.

Сравнение CAN с SPI и I2C

На нашем сайте мы ранее уже рассматривали использование в платах Arduino протоколов SPI и I2C, поэтому давайте сравним данные протоколы с протоколом CAN.

быстрый: 400 Кбит/с;

По скорости стандарт CAN не в лидерах, но его главным "козырем" является высокая надежность связи.

Применения CAN протокола

  1. В связи с чрезвычайно высокой надежностью и устойчивостью CAN протокола он широко применяется в автомобилях, промышленных механизмах, сельском хозяйстве, медицинском оборудовании и т.д.
  2. В связи с небольшим количеством используемых проводников CAN протокол исключительно удобен для применения в автомобилях.
  3. Устройства на основе CAN протокола отличаются низкой стоимостью.
  4. В CAN-сеть (шину) легко добавлять и удалять новые устройства.

Использование протокола CAN в Arduino

Поскольку платы Arduino не имеют в своем составе встроенного CAN порта, то для реализации связи между ними по данному протоколу мы будем использовать внешние CAN модули MCP2515. Эти модули подключаются к плате Arduino по интерфейсу SPI.

CAN модуль (контроллер шины CAN) MCP2515

Модуль MCP2515 включает в себя CAN контроллер MCP2515, который представляет собой высокоскоростной CAN приемопередатчик. Соединение модуля MCP2515 с микроконтроллером осуществляется с помощью интерфейса SPI, поэтому его легко подключить ко всем микроконтроллерам с данным интерфейсом.

Внешний вид контроллера шины CAN MCP2515

Начинающим изучение CAN-шины целесообразно начинать именно с этого модуля ввиду его простоты и легкости подключения к большинству современных микроконтроллеров.

Основные технические характеристики модуля MCP2515:

  • включает в себя высокоскоростной CAN приемопередатчик TJA1050;
  • размеры модуля: 40×28mm;
  • управление по интерфейсу SPI с возможностью подключения к CAN-шине нескольких устройств;
  • кварцевый генератор на 8 МГц;
  • сопротивление на концах 120 Ом;
  • включает независимый ключ, светодиодный индикатор, индикатор мощности;
  • поддерживает скорости передачи данных до 1 Мбит/с;
  • низкий потребляемый ток в режиме ожидания;
  • возможность подключения до 112 устройств (узлов).

Назначение контактов (распиновка) CAN модуля MCP2515 представлено в следующей таблице.

Наименование контакта Назначение контакта
VCC контакт питания 5 В
GND общий провод (земля)
CS SPI SLAVE select pin (Active low) (выбор ведомого)
SO SPI master input slave output lead
SI SPI master output slave input lead
SCLK контакт синхронизации SPI
INT контакт прерывания MCP2515

Назначение контактов (распиновка) CAN модуля MCP2515

В данном проекте мы будем передавать данные, считываемые с датчика температуры и влажности DHT11 платой Arduino Nano, плате Arduino Uno с помощью CAN модуля MCP2515.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Плата Arduino Nano (купить на AliExpress).
  3. Датчик температуры и влажности DHT11 (купить на AliExpress).
  4. ЖК дисплей 16х2 (купить на AliExpress).
  5. MCP2515 CAN Module (контроллер шины CAN MCP2515) – 2 шт. (купить на AliExpress).
  6. Потенциометр 10 кОм (купить на AliExpress).
  7. Макетная плата.
  8. Соединительные провода.

Схема проекта

Схема проекта для связи между двумя платами Arduino с помощью протокола CAN и модулей MCP2515 представлена на следующем рисунке.

Схема проекта для связи между двумя платами Arduino с помощью протокола CAN и модулей MCP2515

Соединения на передающей стороне:

Компонент - контакт Arduino Nano
MPC2515 - VCC +5V
MPC2515 - GND GND
MPC2515 - CS D10 (SPI_SS)
MPC2515 - SO D12 (SPI_MISO)
MPC2515 - S I D11 (SPI_MOSI)
MPC2515­ - SCK D13 (SPI_SCK)
MPC2515 - INT D2
DHT11 - VCC +5V
DHT11 - GND GND
DHT11­ - OUT A0

Соединения на приемной стороне:

Компонент - контакт Arduino Uno
MPC2515 - VCC +5V
MPC2515 - GND GND
MPC2515 - CS 10 (SPI_SS)
MPC2515 - SO 12 (SPI_MISO)
MPC2515 - SI 11 (SPI_MOSI)
MPC2515 - SCK 13 (SPI_SCK)
MPC2515 - INT 2
LCD (ЖК дисплей) - VSS GND
LCD - VDD +5V
LCD - V0 к среднему контакту потенциометра 10 кОм
LCD - RS 3
LCD - RW GND
LCD - E 4
LCD - D4 5
LCD - D5 6
LCD - D6 7
LCD - D7 8
LCD - A +5V
LCD - K GND

Соединения между двумя CAN модулями MCP2515:

H – CAN High
L – CAN Low

MCP2515 (Arduino Nano) MCP2515 (Arduino UNO)
H H
L L

После сборки всей схемы на макетных платах у нас получилась следующая конструкция.

Конструкция проекта в сборе

Объяснение программы для Arduino

Первым делом нам необходимо установить библиотеку для работы с протоколом CAN в Arduino IDE. Сначала скачайте ZIP файл библиотеки по следующей ссылке - Arduino CAN MCP2515 Library. Затем установите ее в Arduino IDE с помощью пункта меню Sketch -> Include Library -> Add .ZIP Library.

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

Инициализация CAN модуля MCP2515

Для установления соединения платы Arduino с модулем MCP2515 выполните следующую последовательность шагов. Но перед этим убедитесь в том, что указанная выше библиотека CAN MCP2515 установлена в вашу Arduino IDE.

Шаг 1. Установите номер контакта, к которому подключена линия CS интерфейса SPI (10 по умолчанию).


Непосредственно сама CAN шина используется уже много где, мне интересно её использование в автомобиле, хотя этой сферой можно и не ограничиваться. Тем более пару лет назад подвернулась такая возможность. Я посмотрел на общие спецификации — вроде бы ничего особо сложного нет. Посмотрел на программы, которые встречаются в интернете — и ни одна мне не приглянулась, у каждой не хватало чего-то такого, что казалось мне нужным на тот момент. Буду изобретать свой велосипед. Делаю свой CAN sniffer далее под катом.

CAN шина

Описывать технические подробности CAN шины в деталях — удел документации. В данной статье достаточно знать, что она:

  • имеет двухпроводное физическое подключение
  • бывают различные скорости передачи данных
  • для подключения уже имеются готовые микросхемы и даже готовые платы с распаянными деталями

Подключаюсь в диагностический разъём OBD (контакты 6 и 14) и смотрю осциллографом, что там имеется. После поворота ключа зажигания начинают бегать пакеты с амплитудой до 2,5 В. Ставлю паузу на осциллографе и смотрю на пакет.


Заметны стартовые и стоповые биты, какие-то данные в пакете. На тот момент я уже знал, что скорость передачи данных ожидается 500 кбит/с, как наиболее частая для моторной CAN шины. Длительность пакета получается около 230 мкс и перед пакетом наблюдается довольно большая пауза в передаче данных. Масштабирую время и вижу три пакета и паузы между ними.


Если сложить длительность передачи данных и паузу между пакетам получается, что передача одной порции данных занимает около 1 мс.

К чему я это всё вывожу? А вопрос чисто практический: хватит ли скорости последовательного порта для передачи всех данных? И исходя из увиденного, можно сделать вывод, что скорость 500 кбит/с развивается внутри пакета, который занимает примерно четверть времени на передачу. Значит средняя скорость передачи будет вчетверо меньшей. На тот момент я ещё не располагал тестами скорости последовательного интерфейса Arduino и забегая вперёд скажу, что даже с самым распространённым преобразователем Serial to USB CH340 стабильно работает скорость в 2 Мбит/с.

CAN scanner на Arduino

Первый прибыл шилд для классической Arduino UNO. Да он стоит значительно дороже своих более мелких собратьев, но он имеет на борту всё необходимое и даже две кнопки.


Именно с ним я и начал все эксперименты. Собрал простую схему с этим шилдом и жидкокристаллическим двухстрочным экраном. Цель была — вывести на экран хоть какие-то данные. Перебирал различные библиотеки для работы с CAN шиной на Arduino (сразу скажу, что правильная и рабочая библиотека называется CAN-BUS Shield by Seeed Studio с заголовочным файлом mcp_can.h), поменял кварцевый резонатор на шилде на 16 МГц (изначально стоял 8 МГц) — данных не было.

На шилде установлены две микросхемы: контроллер CAN шины MCP2515 и драйвер CAN шины TJA1050. Почитав документацию и различные форумы, решил поменять TJA1050 на более каноничный драйвер MCP2551 и данные появились. Возможно TJA1050 была изначально неисправна, так как с её подключением двумя проводками ошибиться было очень сложно, к тому же я использовал OBD и DB9 разъёмы для подключения.

За пару часов был написан простой CAN scanner, который выводил на жидкокристаллический дисплей номер захваченного пакета, его ID и до 8 байтов данных этого пакета.


Вот тут и пригодились кнопочки на шилде, которыми я реализовал переключение между номером отображаемого пакета.

Вообще, эти кнопочки потом много для чего пригодились. Именно с ними я начинал тестирование управления некоторыми устройствами автомобиля.

Начало было положено, надо переходить к более интересной реализации.

CAN sniffer на Arduino

Задача стояла достаточно простая:

  • принимаем пакет из CAN шины
  • укладываем полученные данные в свою структуру
  • отправляем структуру через последовательный порт

Для того, чтобы отправляемые данные корректно обрабатывались на стороне компьютера, перед каждой очередной порцией данных в поток вставляется префикс из четырёх байтов 0xAA55AA55 (почему-то вспомнились эти байты по последним двум байтам загрузочного сектора DOS, только они там были в другом порядке). Логика такая:

  • компьютер читает весь поток из последовательного порта и находит в нём искомую последовательность префикса 0xAA55AA55
  • сразу после префикса будут 4 байта идентификатора пакета
  • далее длина данных этого пакета, по ней контролируется длина всего пакета
  • до 8 байтов данных

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

Примерно в это же время прибыли более миниатюрные компоненты Arduino Nano и Mini CAN shield.


Я спроектировал небольшой корпус, распечатал его и разместил внутри все компоненты.



Снаружи с одной стороны OBD разъём, с другой — Mini USB. Внутри имеется переключатель для терминирующего резистора.

CAN sniffer на PC с использованием wxWidgets

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

Как установить и скомпилировать wxWidgets для Visual Studio

Можно скачать и посмотреть видео (менее восьми минут), а можно выполнить 6 шагов по описанию ниже.

Установка и компиляция wxWidgets:

2. Создать переменную окружения WXWIN указывающую на папку, куда установили или распаковали (например C:\wxWidgets):

Свойства системы -> Дополнительные параметры системы -> Переменные среды -> Создать
WXWIN = C:\wxWidgets

3. Из папки C:\wxWidgets\build\msw открыть файл решения под соответствующую Visual Studio (wx_vc16.sln для Visual Studio 2019)

4. В Solution Expolorer, с помощью клавиши Shift, выделить все проекты, кроме _custom_build и зайти в Properties проектов.

5. В разделе C/C++ -> Code Generation изменить параметр Runtime Library:

Для конфигурации Debug выбрать /MTd
Для конфигурации Release выбрать /MT

6. Скомпилировать библиотеки wxWidgets по очереди для Debug и Release конфигураций.

Пробное приложение и настройка проекта в Visual Studio (для проверки)

1. В Visual Studio создать Empty Project с указанием типа приложения Desktop Application (.exe)

2. В окне View -> Property Manager для своего проекта правой кнопкой выбрать меню Add existing property sheet… и выбрать файл:

3. Создать файл main.cpp и скопировать в него содержимое файла:

4. В настройках проекта C/C++ -> Code Generation изменить (если пункт не появился — сделать пробную сборку):

Runtime Library для конфигурации Debug: /MTd
Runtime Library для конфигурации Release: /MT

5. Дополнительно, если необходимы привилегии UAC, в разделе Linker -> Manifest File:

UAC Execution Level: requireAdministrator

6. Для добавления иконки exe-файлу надо добавить ресурсный файл со следующим содержимым:

Первый реализованный прототип на C++ и wxWidgets показал, что даже нетбук справляется с отображением данных в таблице и я приступил к разработке задуманного.

Архитектурно программа состоит из двух потоков: интерфейсный и поток работы с последовательным портом. Никаких невероятно интересных алгоритмов не применялось. Код обильно снабжён комментариями и должен быть довольно понятен. Ссылка на исходники будет в конце статьи.

Первое что было сделано — раскраска ячеек данных в таблице по давности получения этих данных. Уже в первом прототипе, глядя на 17 строк данных меняющихся непрерывно значений, я понял, что надо как-то различать свежие данные и данные, которые не изменяются или меняется редко. Сделал раскраску в два этапа:

  • впервые пришедшие данные выделяются зелёным цветом фона ячеек
  • данные пришедшие повторно и далее — выделяются красным фоном, который постепенно выцветает до белого если больше эти данные не меняются

Далее мне захотелось всё-таки проверить, справляется ли последовательный порт с потоком данных. Для этого я на стороне Arduino добавил счётчики количества принятых пакетов и счетчик байтов в пакете. Эти счётчики отправляются на компьютер в пакете с идентификатором 0x000. Программа при получении этих данных не выводит их в таблицу, а отображает в отдельных информационных полях сверху. Полученные результаты даже весьма понравились. В среднем принимается до 750 пакетов/с со скоростью до 9,5 кБ/с, а это где в районе до 80 кбит/с, что вполне по силам последовательному порту. Но всё равно, обмен данными настроен по умолчанию на 500 кбит/с, пусть лучше будет запас.

Добавление возможности записи данных в журнал появилось после того, как подключил параллельно к OBD интерфейсу диагностический адаптер ELM327 и связав его с телефоном, попробовал читать различные данные. Данные пробегали настолько быстро, что увидеть их невозможно. Записав всё это в журнал, можно потом спокойно сесть и посмотреть передаваемые данные. Для этого в журнал могут записываться даже ASCII текстовые данные. Так же можно выбирать тип файла, символ разделитель и настроить фильтр пакетов кликом в таблице по указанному идентификатору пакета и нажатию кнопки «Добавить ID в фильтр» (по умолчанию записываются все данные), если запись всех данных избыточна.

Именно тогда пришло осознание, что все приложения для телефона, которые производят всякую «диагностику» через связку ELM327 и телефон, не общаются напрямую с CAN шиной автомобиля. Они всего лишь используют функционал диагностики OBD через CAN шину посредством обращения к CAN ID 0x7E0. Обычно это адрес контроллера мотора (ЭБУ), ответ же от него приходит в пакете с идентификатором 0x7E8. А вот все остальные пакеты данных — это так называемый Vendor Specific и ни один производитель так просто их не раскроет (хотя есть пример: Ford выпустил SDK для своих автомобилей).

Продолжая изучать что же передаётся в этих пакетах пришёл к ещё одной идее: при клике на ячейку в таблице, в окне программы справа выводить двоичное и десятичное значение этого байта, а так же брать следующий байт и дополнять до слова. Далее это слово умножать на некий коэффициент и получить десятичный результат. Звучит не очень понятно, но вот в связи с чем это делалось: обороты мотора приходят в пакете CAN ID 0x180, в первых двух байтах. Эти два байта дают некое слово, которое пропорционально оборотам. Если значение этого слова разделить на 8, то получатся текущие обороты. Поэтому указывается множитель 0,125, как обратная величина от 8. Далее это слово визуализируется в графике с динамической подстройкой по амплитуде. В принципе, множитель можно искать в обратной последовательности: нашёл ячейки, которые по графику очень похожи на обороты мотора или ещё что-то искомое, после чего подгоняется множитель для получения действительных значений.


Ну а двоичное представление позволяет искать различные битовые индикаторы. Например поиск индикаторов указателей поворота сводится к тому, чтобы включить их и наблюдать какая ячейка начинает изменяться, в примере ниже это CAN ID 0x481 байт 2. После чего клик по ячейке приводит к отображению её двоичного значения в соответствующем поле, где уже видны переключающиеся младшие два бита (левый, правый и если вместе — аварийная сигнализация).


И напоследок мне понадобилось сделать отправку некоторых управляющих данных в CAN шину и посмотреть реакцию на эти команды. В программу на Arduino был добавлен код, который принимает данные со стороны компьютера и передаёт в CAN шину. Именно на этом этапе пришлось отказаться от CyberLib, так как у неё не было поддержки прерывания поступления данных в буфер последовательного порта. В программе на компьютере добавил несколько текстовых полей, в которые можно ввести различные параметры и таблицу для просмотра ответа исполнительного устройства. В примере ниже показаны команды управления включить/отключить первую скорость вентилятора охлаждения (0x0A) и включить/отключить муфту кондиционера (0x0B).

Практически нигде не найти полные расшифровки данных производителей, тем более официальных. В лучшем случае это будут чьи-то изыскания в рамках реализации какой-то дополнительной функции. CAN sniffer может помочь в поиске этих данных. Я смог найти порядка 40 различных параметров автомобиля и ради эксперимента, на базе полученных данных, я сделал собственное управление вентилятором охлаждения.

Для работы с CAN шиной автомобиля необходимо знать:

В автомобиле может быть более одной CAN шины. Для каждого функционального сегмента автомобиля выделяется своя сеть CAN. Выделенные сети могут работать на разных скоростях.

Скорости работы CAN шины

CAN на разных автомобилях и в разных сегментах сети может работать на разных скоростях.

Сегментация CAN шины по функциональному назначению

  • Как правило разные, сегменты сети разделены специальным устройством, которое называется Гейтвей (Gateway, ZGW, ETACS, ICU) .
  • В роли гейтвея может выступать панель приборов (для простых автомобилей) или отдельный специальный модуль межсетевого интерфейса.
  • Гейтвей разделяет потоки данных в разных сегментах сети и обеспечивает связь сегментов сети работающих на разных скоростях.
  • ВАЖНО: На многих автомобилях (особенно VAG, MB, BMW) CAN шина в диагностическом разъеме OBD2 отделена от других участков сети при помощи гейтвея, поэтому подключившись к CAN шине OBD разъема невозможно увидеть поток данных. В этом случае можно увидеть только обмен между диагностическим инструментом и автомобилем во время процесса диагностики! Так же модулем гейтвеем оборудованы автомобили японских марок с 2016..2018 годов в зависимости от модели.
  • ОБЯЗАТЕЛЬНО изучайте схемы на исследуемый автомобиль, чтобы знать к какому сегменту сети Вы подключаетесь!

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


Реализации CAN на уровне электрических сигналов

CAN шина может быть реализована физически тремя способами:

Классическая витая пара нагруженная с обоих концов резисторами 120 Ом.

В этом случае уровни на шине CAN выглядят так:

Для такой реализации сети используются как правило обычные CAN трансиверы в 8 выводном корпусе, аналоги PCA82C250, TJA1050 и им подобные. Работает такая конфигурация на скоростях 500 кбит\с и выше. (Но могут быть исключения) .

Fault tolerant CAN обычно используется для низкоскоростного обмена между блоками управления относящимися к сегменту сети Салон\Комфорт\Мультимедиа.

ВАЖНО: При подключении к шине Faul tolerant CAN, подключать терминальный резистор 120 Ом между линиями CAN-High и CAN-Low НЕ НУЖНО !

3 Single Wire CAN или SW-CAN

Однопроводный вариант шины CAN. Работает на скорости 33.333 кбит\с


Используется специальный тип трансиверов. Для того что бы подключиться к такому варианту шины CAN необходимо линию CAN-High анализатора подключить к шине SW-CAN а линию CAN-Low к массе\земле.

Автомобили давно уже стали не просто компьютерами на колёсах, а скорее компьютерными сетями. Передача механических, гидравлических или пневматических усилий между узлами и механизмами со временем превратилась в обмен электрическими сигналами, а сейчас и в информационное взаимодействие.

Диагностический разъем

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

Зачем нужна в машине CAN-шина

По мере усложнения автомобильной электроники, производители столкнулись с некоторыми проблемами, которые всё больше проявлялись с ростом рыночной конкурентоспособности новых моделей.

Далее наращивать объём оборудования простым добавлением управляющих и исполнительных устройств стало невозможно:

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


Решение должно было быть радикальным, и этот качественный скачок в развитии автомобильной электроники произошёл.

Электросхемы машин стали делать по принципам, заложенным в основах вычислительной техники и к тому времени уже достаточно устоявшимся и понятным.


Автомобиль стал представлять собой сеть из микрокомпьютеров, каждый из которых обслуживал свою систему или отдельный узел.

Например, двигатель, коробку передач, узлы трансмиссии, блок климата и даже отдельные фонари наружного освещения или стеклоподъёмники. Уже не надо было тянуть к каждому устройству медные провода в огромном количестве через весь автомобиль.

Причём до появления единой информационной шины некоторые узлы были обвешаны сразу несколькими однотипными датчиками, электронными блоками и жгутами проводки.

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

По схеме получается, что все блоки соединены параллельно через данную шину. Последовательный способ передачи информации делает это возможным, отдельных проводов данных, адресов, синхронизации и назначения приоритета не требуется.


Более того, системе не нужен единый обрабатывающий и управляющий сервер, все ресурсы распределены по микроконтроллерам.

Схема и место расположения КАН-интерфейса

Сеть имеет выход наружу через диагностический OBD разъём, где на этот счёт стандартом чётко определена пара контактов.


Точнее, две пары, из дальнейшего рассмотрения станет понятно, что через диагностику можно подключаться к двум CAN-шинам различного вида и назначения.


Обеспечивающий совместную работу шлюз в разных автомобилях может быть выполнен в виде отдельного блока, входить в состав контроллера управления двигателем, но чаще – приборной панели.

Принцип работы

Работа CAN-шины определяется физическим и логическим протоколами, которые достаточно чётко стандартизованы, хотя и имеют целый ряд исполнений.

Физически это витая пара, каждый из проводов которой является сигнальным. Работают они в противофазе, один поэтому называется CAN-High, второй – CAN-Low.

Сделано так с целью обеспечить максимальную помехоустойчивость при большой скорости передачи данных. Сигнал с пары снимается по дифференциальному принципу, то есть парой встречно включённых компараторов.

На концах витой пары имеется волновое согласование двумя терминальными резисторами по 120 Ом. Хотя встречаются и другие номиналы, но редко.

Активным уровнем считается низкий, он же логический ноль. Это общий принцип в работе устройств с открытым коллектором, разве что тут не применяется инвертирование уровней. Отсюда и логический принцип работы – инициируется линия любым устройством, открывшим свой выходной транзистор и сформировавшим первый нулевой бит.

Далее идёт идентификация приоритетного устройства, которое должно передать свою информацию первым в случае конфликта во времени. Протокол стандартный, каждый бит посылки расписан в даташитах ISO.

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

Виды CAN-шин

Обычно используют две шины – высокоскоростную и низкоскоростную (не желая использовать этот компрометирующий термин, некоторые производители говорят о среднескоростных устройствах).

Первая применена для связи наиболее важных устройств, агрегатов двигателя, трансмиссии, тормозов, подвесок, систем безопасности. Вторая обслуживает второстепенные функции комфорта и сервиса.

Это не значит, что системы автономны. Они связаны между собой через шлюз, обычно находящийся в приборной панели. Низкоскоростная линия также имеет свои контакты в диагностическом разъёме, записанные в стандарт.

Сделано так, чтобы системы низшего уровня важности не мешали максимально быстрому обмену приоритетных устройств. А большое быстродействие, например, регулировке сидений ни к чему.

На низшем уровне могут работать ещё более простые шины, однопроводные и низкоскоростные. Они подключаются к общей CAN через свой контроллер.

Например, в двери могут стоять стеклоподъёмники, блок кнопок управления, различные датчики, всё это нет необходимости выводить на общую шину. Но и плодить множество проводов тоже. Используются простейшие контроллеры и однопроводная сеть.

Как подключиться и сделать диагностику автомобиля

Сканеры могут внедряться в протокол шины и анализировать её состояние, а также проходящую информацию. Можно использовать виртуальные устройства, эмулирующие отдельные блоки, а также создавать и передавать тестовые команды отдельным участникам сети.

Для связи используются специальные адаптеры USB-CAN, более сложные устройства и программное обеспечение.


До появления профессиональных CAN-анализаторов и тестеров пользовались скоростным запоминающим осциллографом и логическим анализатором.

Эти приборы тоже способны сохранять и предоставлять для изучения отдельные фреймы CAN, но в работе неудобны, требуют больших затрат времени.

Неисправности

Отказы шины обычно сводятся к нескольким типовым случаям:

  • пропадание питания отдельных устройств;
  • повреждения проводки и разъёмов;
  • отказ контроллеров.

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

Плюсы и минусы встроенных шин

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

CAN-шина всё это обеспечивает:

  • имеется автоматический контроль проходящей информации на ошибки;
  • дифференциальная передача сигналов и использование витой пары даёт хорошую скорость и защиту от помех;
  • стандартизация протоколов упрощает диагностику и поиск неисправностей;
  • построение системы приоритетов упрощает проектирование;
  • все устройства функционально закончены и универсальны.

Но со временем усугубляются и недостатки. Так, усложнение автомобилей привело к тому, что быстродействия даже самых последних версий уже не хватает.

Поэтому в настоящее время эту самую распространённую автомобильную шину уже можно считать устаревшей, новые проекты обладают значительно более высоким быстродействием.

Читайте также: