Изменение режима работы CAN- трансивера
У меня есть два автономных CAN-контроллера MCP2515 с интерфейсом SPI, два CAN-трансивера TJA1042 и две платы Arduino Uno. Как вы, возможно, знаете, TJA1042 имеет два режима работы:
Спящий режим
Обычный режим.
Если я хочу изменить режим работы одного трансивера со спящего режима на нормальный режим (разбудить его), я должен отправить сигналы шаблона пробуждения от другого трансивера, который находится в нормальном режиме. например, один из шаблонов пробуждения: низкий уровень 5,5 мкс, высокий уровень 5,5 мкс и снова низкий уровень 5,5 мкс. Теперь я не знаю, как отправлять эти шаблоны с помощью Arduino, потому что MCP2515 — это интерфейс SPI.
Я использую эту библиотеку: MCP_CAN
@mtp, 👍3
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.
- Конфликт SPI с двумя экранами - IOREF?
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Программирование ведомого SPI для Arduino
- Последовательная связь между несколькими устройствами (или ардуино)
- Максимальная скорость SPI для ведомого Uno/clone?
Спасибо, что ответили мне. На самом деле у меня есть несколько тестовых примеров, каждый из которых я должен протестировать. В каждом из них продолжительность исследований и разработок разная, поэтому мне легко использовать функции цифровой записи и задержки Arduino. Возможно, это глупый вопрос, но могу ли я использовать для этого GPIO MCP2515?, @mtp
Есть два контакта, которыми можно управлять как выходами, и они в первую очередь предназначены для использования в качестве контактов IRQ для индикации прерываний приема для MCU. Если вы используете шилд с уже подключенным трансивером, то нет, вы не можете, поскольку вы не можете управлять контактами TX и RX как GPIO. Если он еще не подключен и вы его подключаете сами, то зачем? Просто подключите его к Arduino и не используйте MCP2515., @Majenko
Спасибо, что помогли мне. Извините, что задаю много вопросов! Да, это становится проще, если я не использую MCP2515, но у меня также есть проблемы со скоростью передачи данных трансивера. Когда я не использую MCP2515 для установки скорости передачи данных трансивера CAN, сигналы шины недостаточно четкие. Я не использую экран, и я использовал GPIO для отправки импульсов с помощью контакта RXnBF MCP2515. Возможно ли это?@Маженко, @mtp