Связь Arduino I2C между двумя ведущими сетями

У меня есть 2 микроконтроллера Arduino, к каждому из которых подключена сеть устройств I2C (у одного есть 2 АЦП, а у другого - ЖК-дисплей и RTC). Как я могу использовать соединение I2C для передачи значений, полученных первым uC от АЦП ко второму? Оба uC являются ведущими на своих шинах I2C. Я думал сделать программный I2C на втором uC и подключить его как подчиненный к первому (чтобы второй контроллер имел 2 порта I2C: один аппаратный и один программный). Проблема в том, что я не могу найти программную библиотеку I2C, которая работает как ведомая. Все мастера.

Жду ваших идей.


Вопрос в том, могу ли я создать 2 сети I2c, используя один Arduino Mega2560? Один в качестве ведущего на аппаратном порту для связи с ЖК-дисплеем и RTC и один в качестве ведомого на программном порту на 2 других парах контактов (для SCL и SDA) для получения данных от другого ведущего Arduino...


Проанализировав все данные, я пришел к выводу, что 2 шины I2C не могут быть связаны друг с другом. К внешнему порту I2C, который у меня есть на UC для сбора данных, я подключу другую Arduino в качестве ведомой, которая будет получать информацию и передавать ее с помощью беспроводного адаптера (вероятно, NRF24N01). Таким образом, мне не нужно иметь провода от моего солнечного контроллера к Arduino, который сообщает о производстве на веб-сайт pvoutput.

Какой Ардуино (точнее какой микропроцессор)?
Arduino Pro mini подключен к АЦП. Arduino Mega2560 — это тот, у которого есть и т. д. и ЖК-дисплей.

Ответы (4)

Из комментариев вы хотите иметь возможность подключаться только к шине I2C на каждом из ваших отдельных проектов и передавать данные.

Wirning позволяет запускать Arduino в качестве ведущего или ведомого устройства I2C. Вы не можете запускать и ведущее, и ведомое программное обеспечение Wiring на одном микро, поскольку они оба хотят использовать аппаратное обеспечение USI, но, поскольку у вас есть только один USI, вы все равно можете подключиться только к одной шине.

Я бы предложил использовать ATTiny85 в качестве ведомого интерфейса I2C на каждой шине, а затем соединить их вместе через программный UART. Существует очень хорошая библиотека TinyWire , доступная для ATTiny85 от Adafruit… у них также есть очень маленькая плата под названием Trinket , которую вы можете использовать.

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

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

IIC не является хорошим выбором для одноранговой связи.

Вероятно, самый простой способ подключения к микроконтроллерам — это UART. Обратите внимание, что предусмотрен отдельный и асинхронный канал в каждом направлении. Вы также не привязаны к стандартной скорости передачи данных. Используйте что-то быстрое, что может быть получено непосредственно от обоих часов. Вы можете легко сделать MBaud или больше между UART на одной плате.

Особенно, если вы увеличиваете скорость передачи данных, может быть хорошей идеей реализовать управление потоком. Некоторые микроконтроллеры UARTS имеют встроенный RTS/CTS, но даже если нет, такую ​​возможность легко добавить в прошивку. Убедитесь, что получатель может буферизовать как минимум столько символов, сколько есть в аппаратном FIFO отправителя. Таким образом, линия управления потоком может использоваться в отправителе, чтобы просто не записывать больше данных в оборудование. Микроконтроллеры, как правило, имеют небольшие выходные FIFO UART (обычно всего один или два, редко более 4), так что это не большая проблема.

Arduino Pro mini подключается к АЦП и образует дисплей контроллера заряда солнечной батареи (он имеет специальный ЖК-дисплей, подключенный последовательно). Единственное соединение, которое я могу использовать, — это I2C (или мне нужно сделать беспорядок из-за того, что печатная плата включена). Arduino Mega2560 — это тот, у которого есть RTC и ЖК-дисплей, а также экран Ethernet. Эта передача данных не обязательно должна быть быстрой, мне просто нужно отправлять 2 значения (вольты и амперы) каждую секунду или около того.
  • На шине I2C может быть только один мастер I2C. (Возможно, есть какие-то продвинутые протоколы, где вы можете переключаться между тем, кто является мастером.)
  • Многие встроенные процессоры могут быть сконфигурированы либо как ведущие, либо как подчиненные устройства I2C. (Я не верю, что стандартная библиотека Arduino I2C позволяет легко переключаться между ведущим и ведомым. Могут быть Arduino, которые используют процессоры без поддержки ведомого режима.)
  • Эти типы протоколов (SPI или I2C) должны использоваться частями, использующими одну и ту же плату и источник питания. Как правило, они недостаточно надежны, чтобы страдать от осложнений, таких как (например) частичные сбои питания, горячее подключение или чрезмерно длинные кабели.

Все, что сказано, смотрите здесь , как соединить две платы Arduino Uno (одну главную и одну подчиненную) с помощью шины I2C.

Я рассматривал всю эту систему как две отдельные сети I2C: первая с Arduino promini в качестве ведущего + АЦП и Arduino Mega2560 в качестве ведомых. Вторая сеть состоит из Arduino Mega2560 в качестве ведущего + ЖК-дисплея и т. д. в качестве ведомых. Как видите, я хочу, чтобы у Mega2560 было 2 соединения I2C, одно как ведомое (программное) и одно как ведущее на аппаратном порту.
Можно реализовать программный подчиненный порт I2C. Вы либо должны посвятить свою программу только мониторингу линий CS, Clock и Data во время передачи. Или замедлите SPI до тех пор, пока ведомый не сможет обрабатывать передачу и все, что вам нужно делать на ведомом процессоре.
К сожалению, мне нужно переключиться с SPI на I2C в моем ответе. Также отсутствует CS (выбор микросхемы) для I2C. I2C использует подчиненную адресацию в своем протоколе.
Я вижу, что есть несколько библиотек для программного I2C, но все они являются ведущими... Нет ведомых... Я мог бы использовать программное обеспечение I2C для связи с ЖК-дисплеем и RTC, но я сомневаюсь, что библиотеки, созданные для этих модулей, будут работать с программным обеспечением. порт...
Рассмотрим ситуацию, когда вы точно знаете, что вы хотите отправить между двумя платами Arduino и как быстро вы хотите это отправить. Учтите, что может быть проще реализовать некоторый пользовательский интерфейс рукопожатия, реализованный в программном обеспечении на обоих процессорах. Видите ли, я не думаю, что вам нужны (например) накладные расходы на адресацию протокола I2C. В конце концов, у вас есть только 1 мастер и 1 раб. И вам может понадобиться отправить данные только в 1 направлении. Так что вам не нужно утруждать себя тристатированием линий и подтягиванием их резисторами.

То, что предложил @olin, вам следует рассмотреть.

Если вам нужны два режима I2C (главный и подчиненный), тогда читайте дальше.

Arduino может быть настроен как ведущий или ведомый в любой момент времени. Итак, я бы попробовал это. Плата Arduino, которая должна выполнять обе роли (назовем ее Arduino A), по умолчанию может быть настроена как ведомая. Таким образом, Arduino не пропустит ни одной команды от Arduino B (arduino, который всегда будет мастером).

Arduino A может сам решить, когда изменить свою роль на Master . Это зависит от периодических интервалов, из которых он должен считывать данные. Как только данные считываются с датчиков или данные записываются на ЖК-дисплей, Arduino A снова может взять на себя роль ведомого устройства.

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

  1. Используя запасной GPIO, Arduino A сообщает B, что он занят
  2. Arduino B может повторить попытку через небольшой промежуток времени.
  3. Arduino A может сообщить Arduino B, когда он готов к обмену данными (например, сообщить B, когда данные для передачи доступны через GPIO).
  4. Запрограммируйте Arduino B на периодическую запись данных, которые ожидает Arduino A.

Рассмотрите http://www.gammon.com.au/i2c , если это полезно. Есть хорошая информация о конфигурациях. Все на одной странице. Пожалуйста, не заблудитесь во время навигации.

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