Conversão I2C de 3,3 a 5,0 V

35

Estou tentando fazer a interface de um dispositivo 3.3VI 2 C para um 5V Arduino.

Não tenho nenhum problema com a linha SCL. Posso usar um divisor de tensão simples, mas tenho um problema com a linha SDA, pois é bidirecional.

Não tenho certeza de como lidar com isso. Pensei em adicionar um par de diodos, com um divisor de tensão no lado da entrada escrava e nada extra na entrada mestre.

Existem outras soluções?

JohnC
fonte
Os futuros leitores devem estar cientes de que, embora o OP possa usar apenas o SCL em uma direção, o I2C geralmente permite que o SCL seja bidirecional.
The Photon

Respostas:

25

Um bom documento sobre o assunto é o deslocador de nível bidirecional para o barramento I2C e outros sistemas que usam um único mosfet como deslocador de nível bidirecional.

sivu
fonte
Eu gosto do circuito da Philips. Inteligente. De alguma forma, seria melhor se as saídas I2C não precisassem afundar toda a corrente de todas as pull-ups, mas é difícil projetar um repetidor I2C ativo; Eu não acho que isso possa ser feito com lógica normal, pois o repetidor deve ser capaz de detectar uma borda crescente e reagir a ela antes que qualquer dispositivo I2C possa.
Supercat
2
O link está morto!
Zimano 3/11
14

Para expandir a resposta da sivu, esse é um uso comum dos chamados "comutadores de barramento", que são basicamente MOSFETs controlados por lógica. O uso de MOSFETs discretos tem algumas desvantagens (capacitância parasita / acoplamento capacitivo sendo um) e pode ser complicado escolher um bom MOSFET. Os comutadores de barramento são otimizados para uso em circuitos lógicos de alta velocidade.

Vários fabricantes as fabricam, incluindo Fairchild, TI, IDT e Pericom. Dê uma olhada no NC7SZ384 .

Veja as seguintes notas de aplicativo, entre outras:

Jason S
fonte
8

Muitos Arduinos têm suporte integrado para rodar a 3,3 V. Na verdade, todos podem rodar a 3,3 V e o esquema de chips FTDI explica como em um exemplo. Paul, que criou o Teensy USB Arduino , sugeriu que eu pudesse abrir o cabo USB e fornecer uma tensão de 3,3 V no lugar do V linha CC do cabo. Você poderia tentar isso. Mas também existem outras opções.

  1. Verifique os níveis lógicos do Arduino. Eu acredito que eles suportam 3.3 V como a lógica HIGH, mesmo em um Atmel de 5 V. Um artigo do SparkFun declara: "* A conexão de um pino de saída digital de 3,3 V a um pino de entrada de 5 V geralmente é simples. A maioria dos dispositivos é bastante tolerante à tensão mínima que eles aceitam como um valor digital alto. A maioria dos microcontroladores Atmel, por exemplo, aceite algo acima de 0,6 * V CC como alto, portanto, o dispositivo de 3,3 V deve gerar um nível acima de 3 V (0,6 * 5 V). * "
  2. Compre um dos clones do Arduino que saltou os seletores de 3,3 V e 5 V. Eu uso o RBBB Cloan, que defini o chip FTDI dos cabos de alimentação para 3,3 V. Mas existem muitos outros que têm opções reais de configuração de 3,3 V, incluindo um dos recentes Arduinos oficiais, se bem me lembro. Você também pode usar o Teensy USB com o plug-in do Arduino e seguir as instruções no site para instalar um regulador de 3,3 V .
  3. Divida o cabo USB e forneça uma fonte de 3,3 V de qualidade de fonte de alimentação de laboratório no lugar do V linha CC do cabo USB. Deve ser de baixa corrente, como Paulo sugeriu. Portanto, é uma fonte de tensão de boa qualidade. Você também pode colocar algumas baterias em série para obter a tensão desejada.
  4. Se você estiver interessado, posso tentar examinar o esquema do seu Arduino e talvez seja possível fazer uma alteração na configuração do FTDI que permita 3,3 V.

Por fim, temos uma discussão que pode lhe interessar aqui no Chiphacker sobre soluções unidirecionais e bidirecionais para redução de tensão. Este artigo sobre o SparkFun mencionado por todbot é útil, assim como a discussão sobre o artigo bidirecional do MOSFET vinculado ao SparkFun. Para resumir o artigo SparkFun:

  • Resistor em linha. Unidirecional. Somente abaixamento - reduz a corrente, os CIs de diodos de fixação de E / S podem limitar a entrada máxima.
  • Resistores em série. Unidirecional. Apenas abaixador, mas granular.
  • Diodo. Unidirecional. Se afasta. Mais seguro. Alto do diodo de blocos de 5 V; o lado de 3,3 V amarra então ao alto. Mas, se você reverter a configuração do diodo, também não poderá intensificar?
  • MOSFET. Bidirecional. Abaixar ou intensificar.
  • Nos comentários: Exemplo de isolamento óptico: 4N25. Alta corrente.
  • Nos comentários: Exemplo de diodo Zener: 1N4728A
  • Nos comentários: 74HC244 / 125 unidirecional
cyphunk
fonte