Хорошие способы подключения нескольких шин I2C?

У меня возникла проблема с одним проектом. У меня есть объединительная плата с микроконтроллером на базе ATmega328P, управляющим шиной I2C с несколькими периферийными устройствами. Одним из таких периферийных устройств является съемная карта с другим микроконтроллером на базе ATmega328P в качестве периферийного устройства. У меня есть буфер горячей замены TCA4311ADR I2C на объединительной плате, подключенный к порту, который подключается к карте. Предполагается, что карта представляет собой периферийное устройство, которое отправляет обработанные данные с датчика на объединительную плату.

Вот моя проблема: один из датчиков, которые я намерен использовать на плате, - это плата I2C breakout. Чтобы управлять им, микроконтроллер на плате должен действовать как контроллер, но он также должен быть периферийным устройством для связи с контроллером объединительной платы. Каждый раз, когда я пытаюсь заставить это работать, и карта пытается связаться с датчиком, она пытается запустить новую шину I2C, и все начинает давать сбои.

Я перепробовал несколько вариантов. Программное обеспечение, используемое для преобразования обычных цифровых контактов в контакты I2C, не работало, поскольку библиотеки, похоже, несовместимы. Кажется, я не могу заставить периферийное устройство карты подождать, пока контроллер не запустит шину, прежде чем пытаться управлять датчиком, чтобы избежать конфликта.

У меня была идея использовать мультиплексор I2C, такой как TCA9543A, для создания двух шин, но я не знаю, сработает ли это. Я также не хочу просто использовать SPI или Serial для подключения микроконтроллеров, потому что мне пришлось бы отменить месяцы работы над кодированием и пользовательскими печатными платами. Кроме того, использование последовательного интерфейса усложнило бы подключение к компьютеру, а использование SPI не будет работать, если я позже использую отключение датчика SPI.

Есть ли какой-нибудь другой способ заставить эту систему работать?

, 👍2

Обсуждение

I2C позволяет использовать несколько мастеров. Таким образом, вы могли бы (косвенно) подключить распределительную плату к основной шине I2C. Затем попросите ATmega на съемной карте переключиться между ведущим и ведомым режимами. Вам нужно было бы добавить способ предотвращения столкновений, так как ATmega не поддерживает эту часть I2C. Или изящно справляться с ними, когда они возникают., @Gerben


1 ответ


1

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

Да, вы могли бы использовать мультиплексор I2C для совместного использования одного аппаратного канала I2C, однако это будет неудобно, и результаты в любом случае будут неоптимальными.

Большинство микросхем мультиплексирования I2C, включая TCA9543A, сами управляются I2C, поэтому вы не можете использовать их в своей среде, поскольку вам действительно нужно переключить его, чтобы изолировать основную шину от MCU, прежде чем переключать ее с ведомого устройства на главное, что вы не можете сделать, пока не переключитесь это от раба к хозяину. Если вы переключитесь на мастер до того, как изолируете шину, вы рискуете столкнуться с главным мастером на шине, и все пойдет ужасно неправильно.

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

И вдобавок ко всему, когда вы изолируете шину, главный мастер больше не сможет взаимодействовать с этой подчиненной платой, что либо приведет к блокировке всей шины, либо к другим странным и нежелательным вещам.

Так что попробуйте еще раз использовать программное обеспечение I2C для связи с вашим датчиком. Большая часть I2C-связи с датчиками довольно проста и соответствует тому же грубому формату, поэтому реализовать ее действительно не должно быть слишком сложно.

Либо это, либо рассмотреть возможность замены ATmega328P на более мощный микроконтроллер с несколькими шинами I2C.

,