Desejo conectar vários dispositivos escravos I2C a um microcontrolador no mesmo conjunto de pinos, mas todos os dispositivos I2C compartilham o mesmo endereço. Os endereços são fixos no hardware.
Existe alguma maneira de conectar vários dispositivos com o mesmo endereço?
Talvez algum tipo de módulo de conversão de endereços I2C em cada dispositivo com um endereço configurável, para que eu possa atribuir meus próprios endereços a cada um.
Acabei de encontrar este problema com vários dispositivos I2C com um endereço fixo. Nossa solução foi usar linhas de E / S no microcontrolador para forçar as linhas SDA nos dispositivos que não queremos abordar, enquanto a linha de E / S para o dispositivo alvo é definida como entrada (alta impedância ) Isso significa que apenas o dispositivo de destino corresponde ao endereço I2C e os outros ignoram os dados subsequentes.
Os resistores na linha SDA para os dispositivos inativos acabam agindo como pull-ups para o barramento, portanto, o valor exato dependerá de quantos dispositivos você possui e qual pull-up você precisa para seu barramento. Portanto, se você escolher resistores de 10K, três dispositivos inativos resultarão em um pullup de 3K3.
Os diodos schottky garantem que o dispositivo ainda possa puxar a linha SDA baixo o suficiente ao transmitir dados de volta ao host.
fonte
Se nenhum dos dispositivos I2C usa alongamento do relógio (handshake) e se você está batendo no mestre do I2C, um simples truque é fazer com que alguns deles troquem o relógio e os pinos de dados. Durante a transmissão de um byte, o dispositivo que possui o clock e os pinos de dados trocados verá cada bit "0" como um não evento (dados subindo e descendo sem relógio) e verá cada bit "1" como uma parada I2C e iniciar (o relógio aumenta enquanto os dados estão baixos, diminui com os dados aumentando e diminuindo, seguidos pela diminuição do relógio). As condições intencionais de parada e partida de um dispositivo podem ser vistas como bits de dados pelo outro, mas, a menos que um dispositivo tenha um número excessivo de condições de partida e parada entre os bits "1", seria improvável que qualquer dispositivo "acidentalmente"
fonte
Eu consideraria o uso de comutadores de barramento para multiplexar o barramento I2C entre os dispositivos com endereços conflitantes. Os comutadores de barramento são de capacitância e resistência muito baixas e, diferentemente dos buffers / drivers, são comutadores verdadeiros que conectam ou desconectam dois nós do circuito.
Os comutadores de barramento geralmente têm uma característica estranha, o que não importa para o I2C porque usa dispositivos de dreno aberto: um comutador de barramento tem baixa resistência ao ligar tensões próximas a 0 (Vss), mas a resistência aumenta dramaticamente à medida que as tensões se aproximam. a fonte de alimentação Vdd. (Isso ocorre porque eles são basicamente MOSFETs com tensões de porta na fonte de alimentação quando ligam, portanto, quando as tensões comutadas se aproximam de Vdd, as Vgs disponíveis são muito mais baixas)
fonte
Eu tinha dois sensores de luz colorida TCS3414 que queria comparar (os pacotes FN e CS, que possuem filtros diferentes). O endereço I2C está conectado. Depois de examinar como o I2C funciona em termos das linhas SCL (relógio) e SDA (dados), parecia que desligar a linha SDA impediria o chip de começar ou parar um bit e, assim, deixá-lo inativo. Então, usei um comutador analógico CMOS (4066B) para ativar ou desativar a linha SDA para cada dispositivo. Isso funcionou muito bem para alternar entre os dois dispositivos. Eu sei que é um hack, e o PCA9548 seria muito melhor, mas eu não tinha um à mão.
fonte
Agora existe uma resposta: a Linear Tech possui a série LTC4316 / 17/18 de tradutores de endereço. Eles são relativamente novos e a disponibilidade é incerta.
fonte
Vários fabricantes oferecem CIs de switch e multiplexador de barramento I2C.
Um mux pode ativar um canal de cada vez; um switch pode ativar vários em paralelo.
Veja, por exemplo, as ofertas de NXP , TI e Maxim .
Para experimentação, a Adafruit possui uma placa TCA9548a .
Se você tiver 8 chips de destino com endereços idênticos, selecione um MUX de 8 para um. Antes de acessar qualquer um dos chips de destino, configure o MUX para ativar o barramento I2C correto.
Vantagens
fonte
Use um chip demux simples (por exemplo, 74HC139 após) e conecte o pino I2C CLK à entrada (já que o pino I2C CLK é apenas de saída). Use pinos GPIO para controlar a saída desejada. O pino de dados I2C pode ser compartilhado entre todos os escravos.
fonte