Изменение режима работы CAN- трансивера

У меня есть два автономных CAN-контроллера MCP2515 с интерфейсом SPI, два CAN-трансивера TJA1042 и две платы Arduino Uno. Как вы, возможно, знаете, TJA1042 имеет два режима работы:

  1. Спящий режим

  2. Обычный режим.

Если я хочу изменить режим работы одного трансивера со спящего режима на нормальный режим (разбудить его), я должен отправить сигналы шаблона пробуждения от другого трансивера, который находится в нормальном режиме. например, один из шаблонов пробуждения: низкий уровень 5,5 мкс, высокий уровень 5,5 мкс и снова низкий уровень 5,5 мкс. Теперь я не знаю, как отправлять эти шаблоны с помощью Arduino, потому что MCP2515 — это интерфейс SPI.

Я использую эту библиотеку: MCP_CAN

, 👍3


1 ответ


1

Передача этого «сигнала пробуждения» не «пробуждает» трансивер. На самом деле трансивер в режиме ожидания пропускает только сигналы, доминантное или рецессивное состояние которых превышает время фильтрации (5,5 мкс). Любые переходы в шине после стабильного периода 5,5 мкс или более будут пропущены.

В этот момент трансивер не переходит в «нормальный» режим. Устройство CAN должно активировать трансивер, установив на вывод STB НИЗКИЙ уровень.

Когда на выводе RXD устанавливается НИЗКИЙ уровень, сигнализируя о запросе на пробуждение, переход в нормальный режим не будет инициирован до тех пор, пока STB не будет переведен в НИЗКИЙ уровень.

Точно, что вы отправляете, не имеет значения для трансивера - только наличие у него состояний D и R длительностью более 5,5 мкс. Устройство CAN должно их интерпретировать и знать, следует ли ему разбудить трансивер и перевести его в НОРМАЛЬНЫЙ режим.

И MCP2515 тоже неважно, что он получает. Когда бит WAKEIE установлен, MCP2515 сам выйдет из спящего режима при получении чего-либо — и в этот момент он сигнализирует Arduino через свой вывод INT, что он проснулся.

Однако выбранная вами библиотека не имеет возможности управлять битом WAKEIE в MCP_CANINTF — поддерживаются только биты TXxIF. Поэтому вам придется расширить библиотеку, чтобы обеспечить такую возможность.

Общая идея работы такова:

  • Трансивер пропускает «медленный» сигнал (например, передачу 0b00110011)
  • MCP2515 получает «что-то»
  • На выводе INT устанавливается НИЗКИЙ уровень, и Arduino реагирует на это.
  • Arduino переводит STB в низкий уровень, и прием может продолжаться нормально.

Обратите внимание, что управлять STB будет Arduino, а не MCP2515.

,

Спасибо, что ответили мне. На самом деле у меня есть несколько тестовых примеров, каждый из которых я должен протестировать. В каждом из них продолжительность исследований и разработок разная, поэтому мне легко использовать функции цифровой записи и задержки Arduino. Возможно, это глупый вопрос, но могу ли я использовать для этого GPIO MCP2515?, @mtp

Есть два контакта, которыми можно управлять как выходами, и они в первую очередь предназначены для использования в качестве контактов IRQ для индикации прерываний приема для MCU. Если вы используете шилд с уже подключенным трансивером, то нет, вы не можете, поскольку вы не можете управлять контактами TX и RX как GPIO. Если он еще не подключен и вы его подключаете сами, то зачем? Просто подключите его к Arduino и не используйте MCP2515., @Majenko

Спасибо, что помогли мне. Извините, что задаю много вопросов! Да, это становится проще, если я не использую MCP2515, но у меня также есть проблемы со скоростью передачи данных трансивера. Когда я не использую MCP2515 для установки скорости передачи данных трансивера CAN, сигналы шины недостаточно четкие. Я не использую экран, и я использовал GPIO для отправки импульсов с помощью контакта RXnBF MCP2515. Возможно ли это?@Маженко, @mtp