collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Bus I2c necessita de pullups ?  (Lida 9401 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Bus I2c necessita de pullups ?
« em: 05 de Outubro de 2018, 12:39 »
Boa tarde,

Lí numa pagina sobre OLEDs I2C a seguinte afirmação:

"Add 10K pull-up resistor to SDA & SCL to avoid random Freez" (possivelmente o Freez é um amigo chato que gosta de aparecer sem avisar mesmo na hora do almoço)

Isto á para seguir sempre à letra ?
Qualquer montagem que use I2C deve ter pull ups de 10K? Tenho duvidas, já brinquei com I2C e nunca fiz isso, há alguma maneira de determinar em que situações é que isso é necessário ?

tks

Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.481
Re: Bus I2c necessita de pullups ?
« Responder #1 em: 05 de Outubro de 2018, 14:27 »
Viva Vasco,

Por definição / desenho do proprio protocolo, o I2C precisa de pull-ups. Sempre, se não tiver, não é I2C.
Esses pull-ups as vezes estao num dos lados, numa das terminações e podem estar embutidos no proprio chip que internamente colocar as linhas com pull-ups.

Também por definição, os drivers do I2C só conseguem fazer sink ( puxar ao Ground ), sendo assim so as resistencias sao responsaveis por subir o nivel das linhas.
Isto depois permite que varios dispositivos estejam montados em paralello e possam comunicar sem haver colisoes que podessem ser danosas para o circuito. Isto é: caso nao houvessem pullups e os drivers fossem sink/source podiam causar um curto circuito interno.

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: Bus I2c necessita de pullups ?
« Responder #2 em: 05 de Outubro de 2018, 16:03 »
O que o Kamuttier disse está correto, I2C é um barramento coletor aberto, as resistência puxam para o High, qualquer elemento no bus pode puxar para Low.

O que acontece e se calhar é por isso que nunca o Vasco deu por ela, é que a maior parte dos módulos (PCBs) com chips I2C já incluem as resistências, ou no caso de Arduinos tem as pull-up internas.

Já agora fica o apontamento, 10k pode ser muito alto quando se quer maiores velocidades ou distâncias maiores. Se pesquisarem sobre o assunto encontram mais informação.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Bus I2c necessita de pullups ?
« Responder #3 em: 05 de Outubro de 2018, 17:35 »
Em anexo não é I2C mas é um exemplo de um protocolo que é similar ao nível físico, uma saída em colector aberto (open colector) que não é mais do que um transístor a ligar "o pino" ao GND, e uma resistência de pull-up.

O conjunto formado por todos os dispositivos que estão ligados ao pino e a cablagem tem uma certa capacitância, como um condensador de valor pequeno em paralelo com o bus (na verdade a capacitância é distribuída pelo bus, não está num único local, mas do ponto de vista de cada dispositivo é como se se tratasse de um único condensador ligado ao bus).

Para mudar a tensão no bus (no pino/linha) é preciso dar ou tirar corrente desse condensador. O transistor dentro dos chips tira de lá corrente mais depressa do que a resistência consegue meter, daí que a tensão no bus desce (para GND) mais depressa do que a resistência consegue fazê-la subir (para Vcc).

O transistor quando ligado pode ser equivalente a meter uma resistência de 20 - 50 Ohm entre o bus e o GND. Já a resistência é no mínimo uns 470 Ohm, portanto limita muito mais o fluxo de corrente (a entrar no condensador) do que o transístor (a sair do condensador).

O resultado é que, como se vê na scopeshot em anexo, a linha demora mais tempo a subir para Vcc do que a descer para GND. Quando é que isto é um problema? Quando o tempo que demora a subir "empata" na velocidade a que queremos transmitir os bits. Por exemplo, se a linha demora 10us a subir, não podemos transmitir bits no bus a 400 kbits/s, pois só o tempo que um bit deveria estar estável num dos 2 estados são ~2.5us, e portanto no tempo que demora a subir já deveríamos ter transmitido 4 bits.

A resistência de pull-up tem sempre que ser bastante (digamos, pelo menos 10x) maior do que a resistência equivalente do transístor quando ligado. Isto porque o transístor tem que ser "mais forte" a puxar a linha para GND, senão a linha fica com um valor a meio e não é 0 (GND) nem 1 (Vcc). Portanto num esquema deste tipo a linha desce sempre mais depressa do que sobe. Quanto mais pequeno for o valor da resistência, mais corrente passa e mais depressa a linha sobe,
« Última modificação: 05 de Outubro de 2018, 18:46 por Njay »

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Bus I2c necessita de pullups ?
« Responder #4 em: 06 de Outubro de 2018, 09:38 »
O que o Kamuttier disse está correto, I2C é um barramento coletor aberto, as resistência puxam para o High, qualquer elemento no bus pode puxar para Low.
O que acontece e se calhar é por isso que nunca o Vasco deu por ela, é que a maior parte dos módulos (PCBs) com chips I2C já incluem as resistências, ou no caso de Arduinos tem as pull-up internas.
Já agora fica o apontamento, 10k pode ser muito alto quando se quer maiores velocidades ou distâncias maiores. Se pesquisarem sobre o assunto encontram mais informação.

Mas se o Arduino já tem os pullups porque é que dizem para por pullups externos para evitar o Mr. Frezz... ???
A ideia que eu tinha é que isto só começava a ser um problema quando a) se queriam velocidades +elevadas; b) quando o bus era muito longo; c) quando havia muitos devices no bus. Mas numa página sobre um OLED nenhuma destas situações é provável.

O problema não é encontrar a info, é selecionar aquela que se aplica ao nosso caso. Já brinquei o suficiente com o I2C nos arduinos para saber que quando não trabalha 99.9999999% das vezes a culpa é apenas minha: os contactos da breadboard / o endereço errado / SCL no SDA.
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Bus I2c necessita de pullups ?
« Responder #5 em: 06 de Outubro de 2018, 12:06 »
Qual é o valor das resistências de pull-up interna do "Arduino"?
Dica: tá na ds

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Bus I2c necessita de pullups ?
« Responder #6 em: 06 de Outubro de 2018, 12:26 »
Qual é o valor das resistências de pull-up interna do "Arduino"?
Dica: tá na ds

No  328P garantidos valores entre 20K e 50K. Aparentemente o hw I2C faz um mambo jambo qq para manter os pullups mesmo quando o pino está em output.

O que entendo do que li é que faz sentido ter pullups externos entre os 5K e os 10K de modo que o bus tenha sumo suficiente. Faz sentido ?
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Bus I2c necessita de pullups ?
« Responder #7 em: 06 de Outubro de 2018, 13:18 »
Qual é o valor das resistências de pull-up interna do "Arduino"?
Dica: tá na ds

No  328P garantidos valores entre 20K e 50K.

Certo.

Citar
Aparentemente o hw I2C faz um mambo jambo qq para manter os pullups mesmo quando o pino está em output.

Mambo jambo nenhum. O pull-up é controlado individualmente, eles ligam-no quando quiserem, podes ver o esquema de controlo de um pino na DS. De qualquer forma uma resistência de pullup não interfere de nenhuma forma "fundamental" com um pino num modo de output (open colector ou totem pole).

Citar
O que entendo do que li é que faz sentido ter pullups externos entre os 5K e os 10K de modo que o bus tenha sumo suficiente. Faz sentido ?

O tempo que a linha demora a chegar a 5V depende da resistência e da tal capacitância. Essa capacitância é a soma da capacitância da cablagem do bus e da capacitância dos pinos dos chips que lá estão ligados, e cada chip tem uma capacitância nos pinos de input - a dos pinos dum ATmega328P também está listada na DS -> 10pF máximo.
Na simulação em anexo tens o comportamento da linha do bus a levantar quando tens resistências de 1K, 10K, 20K e 50K e uma capacitância *total* de 20pF no bus (digamos que tens dois slaves I2C ou um slave e umas linhas compridas). O tempo de 1 bit num bus I2C a 400Kbps é de 2.5us, portanto vês que os sinais estão a ficar marginais com um pullup de 50K, há muito pouca tolerância a interferências (e há outras questões como tempos de "hold" do sinal e afins), e as tolerâncias têm que ser grandes para as coisas funcionarem sempre bem.

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Bus I2c necessita de pullups ?
« Responder #8 em: 06 de Outubro de 2018, 20:16 »
O tempo que leva a chegar a 0V é igualmente importante ?
Imagino que quanto menor o pullup mais difícil seja escrever um 0, portanto divide-se o mal pelas aldeias ? Pelo boneco eu diria que o valor deverá ser entre 5k e 10k... :-)
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Bus I2c necessita de pullups ?
« Responder #9 em: 07 de Outubro de 2018, 13:29 »
O tempo que leva a chegar a 0V é igualmente importante ?

Sim, claro, mas como é um transístor que puxa a linha para o GND e ele tem uma "bocarra" maior :D, nestes esquemas em open colector com R de pullup é sempre o tempo de subida que limita a velocidade da transição e, logo, a velocidade máxima de transmissão. Repara no scopeshot do meu outro post atrás, vê-se bem como o tempo de descida é bem mais curto que o de subida.

Citação de: vasco
Imagino que quanto menor o pullup mais difícil seja escrever um 0, (...)

Exacto, quanto menor o pullup mais difícil é puxar a linha ao GND, mas não só. Também há mais consumo de energia. O pullup tem que ser tal que o transístor de saída no chip não tenha dificuldade em puxar e manter a linha ao GND, dentro do tempo necessário ao suporte da velocidade de transmissão desejada e dentro também do consumo máximo aceitável. Mas e ainda!, o próprio transístor de saída tem uma corrente máxima que pode puxar, e essa corrente não deve ser excedida; podes nem sequer poder aproximar-te muito dela, pois à medida que a corrente de colector (nos BJT, corrente de dreno nos FET) aumenta, a queda de tensão também aumenta e portanto o GND é cada vez menos GND (posso desenvolver isto se houver interesse).

Citação de: vasco
(...) portanto divide-se o mal pelas aldeias ? Pelo boneco eu diria que o valor deverá ser entre 5k e 10k... :-)

Depende... depende da velocidade a que queres transmitir dados. E há ainda outro efeito, que é a susceptibilidade a interferências (sempre coisas novas a aparecer, não é? Com tanta coisa do contra, até parece mentira como é que tudo isto funciona :D) . Uma resistência de pullup mais alta torna a linha mais sensível a interferências externas (por exemplo de RF). Se calhar já viste por aí os termos "weak pullup/down" ou "strong pullup/down". Não há categorias definidas (em geral é tudo relativo, no contexto de um mesmo circuito ou sistema), mas um pullup de 1K já é em geral considerado um strong pullxxx. Um pullup de 20K já entra na categoria dos weak pullxxx.
Uma linha com uma resistência de pullup de 10K é mais facilmente influenciada do que uma com 5K. Para alterares a linha, por interferência externa, para, digamos metade de Vcc, com a Rpullup de 5K precisas do dobro da corrente (ou seja, de um sinal mais forte). Se meteres uma Rpullup de 1M, se calhar até já consegues alterar significativamente a tensão da linha só por encostar lá um dedo...

Em toda esta discussão, quem diz pullup também diz pulldown, a mesma teoria aplica-se, "invertendo" os níveis de tensão de que estamos a falar.
« Última modificação: 07 de Outubro de 2018, 13:34 por Njay »

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Bus I2c necessita de pullups ?
« Responder #10 em: 07 de Outubro de 2018, 21:26 »
Bom, fiz um teste.
Com pullups de 5K *** NÃO *** funciona. Se houver um device no bus o I2Cscanner encontra devices em todos os addrs, se não houver nenhum device diz unknown error at addr 0x.. para todos os addrs (Wire.endTransmission() retorna valor 4)
Com pullups de 10K funciona.
E sem pullups com um bus com 2 devices que no total deve ter aprox 25cm também funciona sem nada.

Só fui experimentar os pullups porque me esqueci que um OLED I2C *** NÃO *** responde se tiver o pino RES(et) LOW, como o I2Cscanner não levanta o pino o OLED ficava em reset e não respondia... :-o foram umas quantas horas de volta disto...
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Bus I2c necessita de pullups ?
« Responder #11 em: 07 de Outubro de 2018, 23:33 »
Possivelmente já existem pull-ups algures no sistema, e os 5K em paralelo com esses pullups resultam num pull-up demasiado baixo (forte), os transístores dos chips não conseguem puxar a linha para suficientemente perto do GND. Com 10K a influência é menor e já conseguem. Mas para ter a certeza só estudando os chips que estão no bus, metendo o osciloscópio ou medindo o pull up (com o bus "parado", medir a resistência entre uma das linhas e Vcc).

É normal um chip não responder enquanto tem o ~RESET activo...
« Última modificação: 07 de Outubro de 2018, 23:53 por Njay »

Offline vasco

  • Mini Robot
  • *
  • Mensagens: 444
Re: Bus I2c necessita de pullups ?
« Responder #12 em: 08 de Outubro de 2018, 14:15 »
Possivelmente já existem pull-ups algures no sistema, e os 5K em paralelo com esses pullups resultam num pull-up demasiado baixo (forte), os transístores dos chips não conseguem puxar a linha para suficientemente perto do GND. Com 10K a influência é menor e já conseguem. Mas para ter a certeza só estudando os chips que estão no bus, metendo o osciloscópio ou medindo o pull up (com o bus "parado", medir a resistência entre uma das linhas e Vcc).

Vou explorar isso, é útil saber determinar se é necessário ou não adicionar os pullups.

Citar
É normal um chip não responder enquanto tem o ~RESET activo...

Só não foram horas mal gastas porque a resolução de um problema é sempre positiva, mas estava a passar-me um bocado. :-)
Stupid men are often capable of things the clever wouldn't dare to contemplate.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Bus I2c necessita de pullups ?
« Responder #13 em: 08 de Outubro de 2018, 19:56 »
As datasheets dizem... ou então metes 10K 100K ao GND, se o bus em repouso (com o circuito ligado, claro) não estiver a muito perto de Vcc (multimetro) é porque não há pullups nenhuns.
« Última modificação: 11 de Outubro de 2018, 17:52 por Njay »

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Bus I2c necessita de pullups ?
« Responder #14 em: 11 de Outubro de 2018, 17:51 »
Fiz umas correcções no post anterior.