1.1 Что такое CAN?
CAN Bus (Controller Area Network — Сеть контроллеров) была изначально разработана немецкой компанией Bosch. Основной целью создания CAN было решение проблем связи между многочисленными электронными системами управления в современных автомобилях, а также сокращение числа проводов для сигналов. В результате Bosch разработала единую сетевую шину, к которой могут быть подключены все периферийные устройства.
1.2 Особенности CAN Bus
Многомастерный режим: CAN Bus работает в многомастерном режиме, что означает, что любой узел в сети может отправлять сообщения другим узлам в любое время, без необходимости придерживаться модели мастер-раб. Это обеспечивает гибкость в коммуникации.
Гибкость системы: Благодаря проектированию CAN Bus, узлы могут автономно решать, когда отправлять данные, что позволяет системе адаптироваться к различным условиям и потребностям связи.
Высокая скорость и большие расстояния: CAN Bus поддерживает высокие скорости передачи данных и может надежно передавать данные на большие расстояния благодаря эффективному протоколу связи и сильным помехозащищенным способностям.
Обнаружение ошибок, уведомление и восстановление: CAN Bus использует механизмы, такие как циклическая избыточная проверка (CRC), для обнаружения ошибок при передаче данных. Когда обнаружена ошибка, узел отправляет рамку ошибки, чтобы уведомить другие узлы в сети. Система может затем предпринять корректирующие действия, такие как повторная передача данных, чтобы обеспечить точность передачи.
Изоляция неисправностей: CAN Bus может изолировать неисправные узлы, предотвращая распространение неисправности по всей сети, что обеспечивает стабильность системы.
Поддержка множества узлов: CAN Bus теоретически может поддерживать до 110 узлов, что делает ее подходящей для масштабных сетевых коммуникаций.
2.1 Принцип работы CAN Bus
Контроллер CAN определяет уровень шины на основе разности потенциалов между двумя проводами (CAN_H и CAN_L). Уровень шины разделен на два состояния: доминантное (логическая 0) и рецессивное (логическая 1). Передатчик изменяет уровень шины для отправки сообщения к получателю.
Аппаратные компоненты CAN Bus
Микроконтроллер (например, микроконтроллеры серии 51): отвечает за обработку данных и управление коммуникацией.
Контроллер CAN (например, SJA1000): отвечает за реализацию протокола CAN и генерирует кадры данных.
Трансивер CAN (например, PCA82C250): преобразует цифровые сигналы от контроллера CAN в электрические сигналы, пригодные для передачи по шине CAN. Некоторые современные микроконтроллеры, такие как STM32, имеют встроенные контроллеры CAN, поэтому для обработки преобразования сигналов требуется только дополнительный трансивер CAN (например, SN65HVD230).
CAN Bus состоит из двух проводов: CAN_H (высокий) и CAN_L (низкий), которые используют дифференциальную сигнализацию для передачи данных, что улучшает защиту от помех. Обычно используются экранированные витые пары для уменьшения электромагнитных помех.
2.2 CAN Bus vs I2C
Как CAN Bus, так и I2C (Inter-Integrated Circuit — Межинтегральная схема) являются протоколами серийной связи, используемыми для связи между устройствами, но они различаются по нескольким аспектам:
Использование: CAN Bus чаще используется в приложениях с высокой надежностью, таких как промышленное управление и автомобильные сети, в то время как I2C обычно применяется для низкоскоростной передачи данных и управления.
Скорость: CAN Bus поддерживает скорости до 1 Мбит/с, тогда как I2C обычно работает ниже 400 Кбит/с.
Проводка: CAN Bus использует витые пары, в то время как I2C может использовать двух-, трех- или четырехпроводные конфигурации, при этом наиболее распространенной является двухпроводная конфигурация.
Адресация: CAN Bus использует 11-битные или 29-битные идентификаторы для идентификации устройств, в то время как I2C использует 7-битные или 10-битные адреса устройств.
Режим работы: CAN Bus является асинхронным протоколом в многомастерной среде, в то время как I2C — синхронный протокол, обычно используемый в среде с одним мастером.
Таким образом, хотя оба протокола являются серийными, их сценарии применения и характеристики различны.
CAN Bus использует дифференциальную сигнализацию для своих электрических сигналов, передаваемых по двум проводам (CAN_H и CAN_L). Одним из главных преимуществ дифференциальной сигнализации является высокая защита от внешних электромагнитных помех.
Когда контроллер CAN передает логический 1, трансивер устанавливает CAN_H и CAN_L на 2,5 В, что дает разницу напряжений 0 В, называемую рецессивным уровнем.
Когда контроллер CAN передает логический 0, трансивер устанавливает CAN_H на 3,5 В, а CAN_L на 1,5 В, что дает разницу напряжений 2 В, называемую доминантным уровнем.
Когда несколько узлов пытаются одновременно передавать сообщения, используется арбитраж шины.
4.1 Типы кадров CAN
Протокол CAN (Controller Area Network) определяет несколько типов данных. Вот основные типы кадров CAN:
Кадр данных: Кадр, используемый для передачи данных от передающего узла к принимающему.
Удаленный кадр: Кадр, используемый принимающим узлом для запроса данных от передающего узла с тем же ID.
Кадр ошибки: Кадр, отправляемый, когда узел CAN обнаруживает ошибку, уведомляя другие узлы об ошибке (это выполняется автоматически с помощью аппаратного обеспечения).
Кадр перегрузки: Отправляется узлом CAN, когда он не может обработать полученные данные при текущей скорости передачи (это также выполняется с помощью аппаратного обеспечения).
Межкадровое пространство: Кадр, который разделяет кадры данных и удаленные кадры от предыдущего кадра (это также выполняется с помощью аппаратного обеспечения).
Из этих типов кадров только кадры ошибки, кадры перегрузки и межкадровые промежутки управляются аппаратным обеспечением и не могут контролироваться программно. Для общего понимания достаточно разобраться с кадрами данных и удаленными кадрами.
4.2 Кадр данных
Кадр данных состоит из семи сегментов: Начало кадра, Поле арбитража, Поле управления, Поле данных, Поле CRC, Поле ACK и Конец кадра.
Начало кадра: Обозначает начало кадра данных.
Поле арбитража: Указывает приоритет кадра.
Поле управления: Содержит информацию о количестве байтов в поле данных и зарезервированные биты.
Поле данных: Содержит фактические данные (от 0 до 8 байт).
Поле CRC: Используется для обнаружения ошибок в передаче кадра.
Поле ACK: Указывает подтверждение успешного приема.
Конец кадра: Обозначает конец кадра данных.
Процесс передачи кадра данных:
Когда шина не используется, передающий узел начинает отправку Начала кадра.
Затем отправляются Поля арбитража и Управления.
Если DLC (код длины данных) не равен нулю, отправляется Поле данных.
Затем отправляется Поле CRC для обнаружения ошибок.
Если принимающий узел корректно получает кадр, он устанавливает ACK в Поле ACK для подтверждения приема.
В конце передающий узел отправляет Конец кадра, завершая передачу кадра.
Поле арбитража состоит из стандартного формата (11 бит) и расширенного формата (29 бит). ID в поле арбитража идентифицирует уникальность кадра и определяет его приоритет в шине. Чем меньше номер ID, тем выше приоритет кадра.
RTR (Запрос на удаленную передачу): Указывает, является ли этот кадр кадром данных или удаленным кадром.
IDE (Расширение идентификатора): Указывает, использует ли поле арбитража стандартный (11 бит ID) или расширенный (29 бит ID) формат.
Поле управления идет после поля арбитража и предоставляет важную информацию о данных, которые будут переданы. Детализированные поля включают:
DLC (Код длины данных): 4-битное поле, указывающее количество байтов в поле данных.
RTR (Запрос на удаленную передачу): В кадрах данных этот бит доминирует (0), что указывает, что этот кадр содержит фактические данные. В удаленных кадрах он рецессивен (1), указывая, что это кадр запроса данных.
IDE (Расширение идентификатора): Присутствует только в кадрах расширенного формата, указывая, используется ли стандартный или расширенный формат для поля арбитража.
4.3 Удаленный кадр
Удаленный кадр в CAN Bus — это, по сути, запрос на данные. Когда узел нуждается в данных от другого узла, он отправляет удаленный кадр, который содержит только поля Арбитраж и Управления, но не включает поле Данных.
Состав удаленного кадра:
Начало кадра (SOF): Обозначает начало кадра.
Поле арбитража: Содержит идентификатор (ID) и бит Запроса на удаленную передачу (RTR), который рецессивен (1), чтобы указать, что это удаленный кадр.
Поле управления: Содержит DLC (Код длины данных), который обычно установлен в 0 в удаленных кадрах, так как они не содержат данных.
Поле CRC: Используется для обнаружения ошибок.
Поле ACK: Используется для подтверждения успешного получения кадра.
Конец кадра: Обозначает конец удаленного кадра.
Различия между кадром данных и удаленным кадром: Кадры данных и удаленные кадры похожи по структуре, но удаленные кадры не имеют Поля данных. Бит RTR в кадре данных доминирует (0), в то время как в удаленном кадре он рецессивен (1), что указывает на запрос данных.
Применение удаленного кадра: Удаленные кадры полезны, когда необходимо периодически получать данные от узла, например, когда центральный контроллер в автомобильных или промышленных автоматизированных системах периодически запрашивает данные с сенсоров.