Can Bus для приема и передачи на одном и том же микроконтроллере
Итак, я работал над проектом в течение последних нескольких месяцев, используя самодельные платы на шине CAN. Он работает хорошо, когда одна плата используется как отправитель, а другая как приемник. Теперь у меня есть 3 платы, на которых установлено несколько датчиков. Моя цель здесь — дать возможность каждой плате обмениваться данными и использовать данные из другого микроконтроллера.
Краткий обзор проекта для лучшего понимания: Я пытаюсь автоматизировать радиоуправляемый самолет.
MCU-1: Потенциометры + GPS
MCU-2: 1 акселерометр + 1 барометр
MCU-3: 1 датчик перепада давления + 1 радиопередатчик
Я хотел бы, чтобы MCU-1 мог получать и использовать данные от MCU-2 и в то же время передавать данные в MCU-3. (У них обоих гораздо больше компонентов и задач для выполнения, поэтому у меня нет всех датчиков на одной плате)
Я не думаю, что это важно, но MCU1 и 3 — это ATmega328p (тот, что с платы nano), а MCU2 — это ATmega2560
Мой вопрос: Возможно ли это? Я имею в виду, возможно ли, чтобы MCU работал как Отправитель и Получатель одновременно? И как это сделать? :)
Также возможно ли, чтобы MCU работал как приемник, скажем, 90% времени и как отправитель 10% (или после обновления)? Если первая ситуация невозможна, эта может стать решением для моего проекта.
Спасибо
Нежить
@Undeadguy, 👍0
1 ответ
Да, это возможно.
CAN — это стандарт последовательной шины с несколькими ведущими устройствами для соединения электронных блоков управления [ECU], также известных как узлы. Для связи в сети CAN требуется два или более узлов. Сложность узла может варьироваться от простого устройства ввода-вывода до встроенного компьютера с интерфейсом CAN и сложным программным обеспечением.
-- Википедия
Вы должны понимать, как работает обнаружение столкновений в многоканальной шине CAN, и убедиться, что вы реализуете его (или оно реализовано в выбранной вами библиотеке CAN) для обеспечения надежной работы:
В спецификациях CAN используются термины «доминантные» биты и «рецессивные» биты, где доминантный — это логический 0 (активно приводимый к напряжению передатчиком), а рецессивный — это логическая 1 (пассивно возвращаемый к напряжению резистором). Состояние бездействия представлено рецессивным уровнем (логическая 1). Если один узел передает доминантный бит, а другой узел передает рецессивный бит, то происходит столкновение, и доминантный бит «побеждает». Это означает, что нет задержки для сообщения с более высоким приоритетом, а узел, передающий сообщение с более низким приоритетом, автоматически пытается повторно передать шесть битовых тактов после окончания доминантного сообщения. Это делает CAN очень подходящей в качестве приоритетной системы связи в реальном времени.
Точные напряжения для логического 0 или 1 зависят от используемого физического уровня, но основной принцип CAN требует, чтобы каждый узел прослушивал данные в сети CAN, включая сам передающий узел(ы). Если логическая 1 передается всеми передающими узлами одновременно, то логическая 1 видна всем узлам, включая как передающий узел(ы), так и принимающий узел(ы). Если логический 0 передается всеми передающими узлами одновременно, то логический 0 видна всем узлам. Если логический 0 передается одним или несколькими узлами, а логическая 1 передается одним или несколькими узлами, то логический 0 видна всем узлам, включая узел(ы), передающий логическую 1. Когда узел передает логическую 1, но видит логический 0, он понимает, что возникла конкуренция, и прекращает передачу. Используя этот процесс, любой узел, который передает логическую 1, когда другой узел передает логический 0, «выпадает» или проигрывает арбитраж. Узел, который проигрывает арбитраж, повторно ставит свое сообщение в очередь для последующей передачи, и поток битов кадра CAN продолжается без ошибок, пока не останется только один узел, передающий. Это означает, что узел, который передает первую 1, проигрывает арбитраж. Поскольку идентификатор бита 11 (или 29 для CAN 2.0B) передается всеми узлами в начале кадра CAN, узел с наименьшим идентификатором передает больше нулей в начале кадра, и это узел, который выигрывает арбитраж или имеет наивысший приоритет.
Например, рассмотрим сеть CAN с 11-битным идентификатором, с двумя узлами с идентификаторами 15 (двоичное представление, 00000001111) и 16 (двоичное представление, 00000010000). Если эти два узла передают одновременно, каждый сначала передаст стартовый бит, а затем первые шесть нулей своего идентификатора, без принятия арбитражного решения.
- Какие правильные контакты для TWAI (CAN) на ESP32?
- Простой ESP32 MCP2515 МОЖЕТ кодировать VP230
- Можно ли настроить CAN-BUS Arduino Shield для связи с SocketCAN для UNIX?
- Can BUS Shield на Arduino Leonardo - не удается инициализировать CAN
- 5 В MCP2515 в 3.3V Teensy. Как уменьшить напряжение MISO
- Может ли контроллер MCP2515 CANBUS использоваться для двусторонней связи?
- Arduino-совместимый микроконтроллер с I2C и CAN
- Sparkfun CAN Shield BMW OBD2 чтение