O que acontece se eu omitir os resistores pullup nas linhas I2C?

33

Agora eu percebi que as linhas de dados e relógio I 2 C (SDA e SCL) devem ter resistores pullup.

Bem, eu criei alguns relógios usando o DS1307 RTC (consulte a folha de dados ) de acordo com o esquema abaixo. Observe que eu omiti os dois resistores de pullup.

Diagrama esquemático do meu relógio sem resistências pullup nas linhas I2C

Ambos os relógios funcionam bem, um deles está funcionando há mais de 3 meses. Como isso é possível? De qualquer forma, eu queria saber:

  1. O que acontece quando os pullups I 2 C são omitidos?

  2. É provável que a falta de pullups danifique algum desses dois CIs na minha placa?

Estou procurando respostas que abordem meu caso específico de conectar o ATmega328P a um DS1307 RTC, como nos esquemas que forneci, mas se a pergunta não for muito ampla, seria útil saber o que acontece quando os pullups são geralmente omitidos. , ou seja, em outros cenários da operação I 2 C.

PS. Pesquisei na Internet para encontrar a resposta, mas só consegui encontrar artigos sobre o dimensionamento dos pullups.

Atualização: estou usando o Arduino IDE 1.03 e meu firmware lida com o RTC usando a biblioteca DS1307RTC Arduino (por meio de suas funções RTC.read()e RTC.write()). Essa lib, por sua vez, costuma Wire.hconversar com o RTC.

Atualização 2: Abaixo estão uma série de capturas de escopo que tirei para ajudar a explicar como o I 2 C está funcionando sem os pullups externos.

Escopo de tiro 1 Âmbito 2

Atualização 3 (após a adição de I 2 C pullups): Abaixo está outra série de fotos de osciloscópio que eu fiz depois de adicionar resistores de pull up adequados (4K7) às linhas I 2 C (na mesma placa). O tempo de subida caiu de cerca de 5 µs para 290 ns. I 2 C está muito mais feliz agora.

Escopo do tiro 3 Âmbito tiro 4

Ricardo
fonte
2
Seu código desativa os pullups nesses pinos?
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Não há menção direta aos pinos SDA e SCD (18 e 19) no meu código. Lido com o RTC usando a biblioteca DS1307RTC lib Arduino lib e suas funções RTC.read () e RTC.write ().
Ricardo
Essa lib, por sua vez, usa o Wire.h para conversar com o RTC.
Ricardo
3
Sim, definitivamente usando pullups internos. Observe as curvas em vez de arestas vivas.
Ignacio Vazquez-Abrams

Respostas:

28

1) O que acontece quando os pullups I2C são omitidos?

Não haverá comunicação no barramento I 2 C. Em absoluto. O MCU não poderá gerar a condição inicial de I 2 C. O MCU não poderá transmitir o endereço I 2 C.

Querendo saber por que funcionou por 3 meses? Leia.

2) É provável que a falta de pullups danifique algum desses dois CIs na minha placa?

Provavelmente não. Nesse caso em particular (MCU, RTC, nada mais), definitivamente não.

3) Por que o MCU conseguiu se comunicar com o dispositivo escravo I 2 C? I 2 C requer resistores pull-up. Mas eles não foram incluídos no esquema.

Provavelmente, você tem flexões internas ativadas no ATmega. Pelo que li 1 , o ATmega possui pull-ups internos de 20kΩ, que podem ser ativados ou desativados no firmware. 20kΩ é muito fraco para o I 2 C pull-up. Mas se o barramento tiver uma baixa capacitância (fisicamente pequena) e a comunicação for lenta o suficiente, então 20kΩ ainda poderão fazer o barramento funcionar. No entanto, este não é um bom design confiável, comparado ao uso de resistores de pull-up discretos.

1 Eu não sou um cara do ATmega.

update: Na resposta I 2 formas de onda C, que foram adicionadas ao OP
As formas de onda no OP têm uma constante de tempo de subida muito longa. Aqui está como são as formas de onda I 2 C

insira a descrição da imagem aqui

PIC18F4550, Vcc = + 5V, 2,2kΩ pull ups. A forma de onda mostra SCL. O tempo de subida na SDA é praticamente o mesmo. O tamanho físico do barramento é moderado: 2 dispositivos escravos, comprimento da placa de circuito impresso ≈100mm.

Nick Alexeev
fonte
Obrigado pela sua resposta! Sim, o ATmega possui pullups que devem ser ativados no meu caso. Vou verificar o código e as bibliotecas que estou usando e também colocar o quadro no escopo. Espero que isso esclareça um pouco as coisas.
Ricardo
1
Convém verificar com a folha de dados do seu dispositivo escravo primeiro. Se bem me lembro, os pullups do ATMega podem variar de 30k-60k (depende de Vcc, temperatura e vários outros fatores; você realmente não pode depender deles para uma resistência confiável). Você quer ter certeza de que está enviando corrente suficiente ao escravo para garantir uma lógica adequada 1. Se a resistência for muito grande, seu dispositivo escravo não terá corrente suficiente e você estará no mesmo local em que está agora.
AudiFanatic 12/03/2014
4
@audiFanatic +1. Entre, IMO, incluindo resistores pull-up nas placas de interrupção e instalá-los por padrão é um erro. Imagine o que acontece se alguém tiver várias placas de interrupção em um barramento I2C. Cada pull-up é geralmente de 2,2kΩ ou menos. Os resistores de pull-up em todas as placas de interrupção aparecem em paralelo. O pull-up combinado fica muito rígido para o I2C. [Mais sobre esse possível problema aqui e aqui .]
Nick Alexeev
2
@ Ricardo: Esse não é um barramento I2C feliz em suas fotos de mira [primeiro conjunto de fotos de mira no OP]. Também adicionei um escopo à minha resposta.
Nick Alexeev
3
Este artigo tem algumas formas de onda do bem e sinais I2C ruins: dsscircuits.com/index.php/articles/...
ford
16

A biblioteca que você usa e as bibliotecas das quais depende (Wire), habilitam os pull-ups internos do ATMega. Estas são flexões fracas e, em uso normal, complementam as flexões externas (dois resistores em paralelo). Devido à resistência relativamente alta de 20k a 70k, eles não causam muito, se houver, problemas com os externos em uso.

O que acontece quando os pullups I2C são omitidos?

Agora, sem resistores externos, as flexões internas fracas são a única coisa que eleva a linha. Dependendo do layout da sua placa, da velocidade da sua linha i2c, da frequência com que você a acessa, da interferência externa, etc., elas podem funcionar, ou não. Você teve sorte. Você tem flexões, mas não aquelas que esperava.

É provável que a falta de pullups danifique algum desses dois CIs na minha placa?

Mesmo sem os pull-ups internos, a falta de pull-ups não danificará nenhum dos CI. A construção interna das linhas SCl e SDA do dispositivo i2c é como transistores NPN. Eles são coletores abertos , essencialmente diodos controlados / comutados de corrente.

No entanto, a última coisa a ser observada é que o uso de pull-ups internos, quando o ATMega está em 5v, e o dispositivo i2c é apenas um dispositivo de 3.3v, pode causar problemas. Ou, se você tiver as tomadas internas ativadas e os resistores externos conectados a uma tensão de 3.3v ou outra tensão, também poderá causar problemas. Essencialmente, é um bug intencionalmente ignorado na biblioteca do Wire.

Transeunte
fonte
4
+1 - You do have pull-ups, just not ones you expected.- Acho que você acertou em cheio. Obrigado!
Ricardo
Só para você saber, adicionamos algumas fotos de escopo para ajudar a esclarecer o que está acontecendo com a minha configuração.
Ricardo
2
@ Ricardo sim, vendo aqueles, a 33khz. Um terço da velocidade especificada i2c mais baixa e o sinal ainda é muito ruim. A 100khz ou 400khz, você não teria comunicação de trabalho. O melhor de tudo é que muitos dispositivos i2c funcionam com uma fração das velocidades máximas. Basta lembrar, as pullups internos pode ser de até 70k ohm, um resistor i2c típico é 4.7k
Transeunte
8

Geralmente, você precisará ter os resistores de pullup para um circuito de interface I 2 C. Se a interface for realmente uma especificação completa I 2 C em ambas as extremidades dos fios, as linhas de sinal sem os resistores nunca poderão subir ao nível alto. Eles podem permanecer baixos ou atingir um nível intermediário determinado pela corrente de fuga nas peças em cada extremidade. A razão para isso é porque I 2 C verdadeiro é um barramento de drenagem aberto.

Alguns dispositivos podem realmente ter resistores de pullup no chip na faixa de 20K a 100K ohm apenas para manter os pinos da interface em um alto nível inativo quando a interface I 2 C da peça não estiver em uso. Para interfaces simples e curtas, esses resistores de pullup podem ser suficientes para fornecer a corrente necessária para elevar as linhas enquanto os relógios e / ou dados estão sendo sinalizados.

É difícil distinguir do seu esquema, mas, em alguns casos, as interfaces I 2 C são implementadas usando pinos de porta de E / S de uso geral e, em seguida, são afetadas pelo software. Às vezes, o implementador pode não operar os pinos de E / S nessa configuração usando uma metodologia de dreno aberto e isso pode ser um fator de por que uma interface sem resistores de pullup parece funcionar.

No final do dia, você provavelmente deve a si mesmo verificar a sinalização em um de seus relógios anteriores usando um osciloscópio para ver se os 1 e 0 na interface estão funcionando dentro dos níveis de tensão especificados. Então você saberá com certeza se teve muita sorte com essa implementação ou se um dos fatores que mencionei acima está em jogo.

Michael Karas
fonte
4

O que acontece quando os pullups I2C são omitidos?

Provavelmente, o barramento I2C simplesmente não funcionará.

É provável que a falta de pullups danifique algum desses dois CIs na minha placa?

Mais provável que não.

O fóton
fonte
3

Suas linhas I2C não funcionarão de jeito nenhum. Se não me engano, o I2C apenas assina sinais baixos, mas não os retorna para um estado alto, e é por isso que você precisa desses resistores.

Qualquer falta de flexões não deve danificar nenhum CI.

Funkyguy
fonte
Os pinos I2C são de dreno aberto.
Matt Young
1

I2C é um protocolo de lógica TTL; para que suas linhas de dados e relógio sejam de dreno aberto. Em outras palavras, o hardware I2C só pode reduzir essas linhas; eles são deixados flutuando quando não são zero. É aí que entram os resistores de pull-up. Este é um diagrama simplificado, mas trabalhe comigo por um segundo.

esquemático

simular este circuito - esquemático criado usando o CircuitLab


Como você pode ver; o resistor de pull-up é necessário para garantir que uma lógica 1 seja vista na saída quando a lógica TTL não estiver dirigindo a saída baixa. A lógica TTL não pode elevar as linhas como eu já mencionei. Se isso não estivesse presente, a saída ficaria flutuando e é imprevisível o que você pode ver na saída (pelo que você sabe, seu micro-ondas ou as disfunções intestinais de seus colegas de trabalho causadas por um certo urso gomoso sem açúcar podem causar o valor a flutuar).

Agora, se você implementasse o I2C em software com um microcontrolador, isso provavelmente não seria muito problemático, pois provavelmente usará a lógica CMOS, que pode gerar saídas altas ou baixas.

audiFanatic
fonte
1
Ainda bem que ajudou.
AudiFanatic # 03:
2
Se os dispositivos usam lógica TTL ou CMOS não importa - as saídas TTL e CMOS normais puxarão o sinal para cima e para baixo. Os sinais I2C são TTL de coletor aberto ou CMOS de dreno aberto (mais provável) - em ambos os casos, o transistor que puxaria o sinal alto está ausente no estágio de saída da fonte; portanto, são necessários resistores de pull-up para puxe os sinais para alto. É possível que o microcontrolador possua pull-ups internos nessas pintas.
Peter Bennett
3
-1 Como Peter Bennett disse, muitas dessas respostas estão erradas. Chamar os sinais TTL de "dreno aberto" é a oferta.
Joe Hass
Observe que existem vantagens em fazer o I2C com TTL, ou seja, muitas vezes você não precisa de tradutores de nível para lidar com componentes com tensões de alimentação diferentes conectadas ao mesmo barramento. O simples ajuste da tensão de pullup para a tensão de entrada mais alta aceitável do chip de baixa voltagem é muitas vezes suficiente nos estágios de entrada TTL . No CMOS, isso não funcionaria.
Ben Voigt
@BenVoigt: Não - chamar a configuração "requer um resistor pull-up" "TTL" está errado, pois esse arranjo pode ser feito com CMOS ou TTL, e o DS1307 é uma parte do CMOS. A folha de dados Maxim afirma claramente que as saídas são dreno aberto e o diagrama de blocos mostra um FET para uma saída.
Peter Bennett
0

Quando eu botei o I2C com um micro como o mestre que fornece o relógio, fui capaz de dirigir o SCL sem puxar.

No entanto, o SDA precisa ser OC com pullup para que o dispositivo escravo possa puxar para baixo e responder adequadamente.

Saudações

Wayne
fonte