A folha de dados da EEPROM 24LC256 afirma que:
O barramento SDA requer um resistor pull-up para VCC (típico de 10 kΩ para 100 kHz, 2 kΩ para 400 kHz e 1 MHz).
Eu pensei que qualquer resistor com um valor de kΩ faria o trabalho (e parece que minha EEPROM funciona bem em diferentes frequências com um resistor de 10 kΩ).
Minhas perguntas são:
- existe um valor correto para resistores pull-up?
- existe uma lei / regra para determinar esse valor?
- como os diferentes valores de resistência afetam o barramento de dados I²C?
Respostas:
A resistência correta à tração para o barramento I 2 C depende da capacitância total no barramento e da frequência em que você deseja operar o barramento.
A fórmula da folha de dados do ATmega168 (que eu acredito que vem da especificação oficial I 2 C) é -
O Microchip 24LC256 especifica uma capacitância máxima de pinos de 10pF (o que é bastante típico). Conte o número de dispositivos que você possui em paralelo no barramento e use a fórmula acima para calcular um intervalo de valores que funcionarão.
Se você estiver desligando as baterias, usaria valores que estão no limite superior da faixa. Se não houver limites de energia na fonte de energia ou problemas de dissipação de energia nos CIs, usaria valores na extremidade inferior da faixa.
Eu vendo alguns kits com um I 2 C RTC (DS1337). Incluo resistores 4K7 no kit, o que parece ser um compromisso razoável para a maioria dos usuários.
fonte
Faz sentido que frequências mais altas exijam flexões de resistência mais baixas: uma resistência mais baixa carregará / descarregará a capacitância do cabo mais rapidamente, o que resulta em bordas mais íngremes. Com os pulsos mais amplos de frequências mais baixas, uma borda menos íngreme não influencia tanto a forma do pulso.
Portanto, a especificação I2C fornece valores máximos para os resistores pull-up em função da capacitância do barramento para três classes de velocidade:
Os valores mínimos são definidos em função da tensão do barramento e devem limitar a corrente através dos drivers.
fonte
Há um intervalo correto de valores, no entanto, é difícil descrever exatamente o que é esse intervalo. Geralmente, 10k funciona.
As saídas digitais têm uma capacidade especificada de obter ou reduzir a corrente. Se sua saída pudesse afundar 5 mA e a saída fosse conectada através de um pull-up de 5 V e, em seguida, definida como 0, você precisaria de um mínimo de resistência de 1k. Se você usar menos de 1k, a saída não poderá absorver corrente suficiente para puxar o pino até 0V. Se você usar um valor maior, como 10k, o pino precisará apenas diminuir 0,5 mA, o que é muito menor do que a sua classificação.
As entradas digitais possuem uma corrente de fuga especificada. É como a quantidade de corrente necessária para "manter" um 0 ou 1 em uma entrada. Se o seu resistor de pull-up for muito grande, ele não poderá superar a corrente de fuga. Se apenas superar a corrente de fuga, qualquer ruído no circuito poderá ser suficiente para alterar a entrada.
Ao usar saídas digitais que podem afundar e gerar corrente ("driver do totem", "driver push-pull"), você pode ficar tentado a não usar resistores de pull-up ou pull-down. No entanto, é muito importante que as entradas do CMOS não possam flutuar ou que possam extrair corrente excessiva ... e é muito fácil esquecer que os pinos bidirecionais do MCU geralmente aparecem como entradas!
O I2C e outros protocolos como ele usam saídas "dreno aberto" (ou "coletor aberto"). Em vez de ter saídas que podem ser puxadas para cima e para baixo, e saídas de dreno abertas só podem ser puxadas para baixo. É por isso que o resistor de pull-up externo é necessário. Agora existem restrições adicionais na faixa de resistores pull-up; o valor de pull-up formará um circuito RC com a capacitância do barramento. Um valor muito pequeno impedirá novamente os drivers de saída de afundar corrente suficiente para puxar o pino até 0. No entanto, um valor muito alto levará muito tempo para carregar a capacitância do barramento.
Se houver tempos de configuração / espera que você não tem permissão para violar, eles o ajudarão a determinar uma constante de tempo de RC. A capacitância do barramento é amplamente determinada pelo layout da placa de circuito impresso; portanto, você pode escolher um valor R que combina com o C para fornecer um valor confortável dentro do tempo de configuração / espera da sua entrada digital.
fonte
Valores baixos de pull-up (resistência mais baixa) podem melhorar as bordas das transições de sinal, mas às vezes podem ser muito rígidos - se os dispositivos no barramento não puderem afundar a corrente de pull-up, você obtém uma lógica 'baixa', que não é realmente tão baixa , o que pode causar erros de comunicação (e muita dor.)
Eu aceitaria a maior resistência à tração que oferece comunicações confiáveis.
fonte
Para baixas frequências, o valor realmente não importa, mas para altas frequências, ele pode ter um efeito de filtragem no sinal, em combinação com outras capacitâncias do circuito, razão pela qual recomendam valores diferentes para diferentes velocidades.
fonte
Um problema que ainda não vi mencionado é o consumo de energia. Se alguém estiver usando uma fonte de 3,3 volts, um resistor de 3,3K ao terra desperdiçará 1mA de corrente (3,3mW de energia) sempre que a saída for baixa. Usar um resistor de 10K reduziria a corrente e a potência em um fator de três. Se houver muita comunicação no barramento I2C, esse consumo de energia poderá acabar sendo uma porção significativa do consumo geral de energia, especialmente se o barramento puder ficar baixo por longos períodos de tempo. Por exemplo, se alguém estiver lendo 100 bytes / segundo, mas após a leitura de cada byte, o barramento ficará com o dispositivo emitindo o primeiro bit do próximo byte, e a maioria desses bytes tiver o MSB limpo, o barramento poderá gastar 90% de o tempo com SCL e SDA baixo. Dependendo do que mais o sistema estiver fazendo, isso poderá aumentar enormemente o consumo de energia.
Para economizar energia, pode ser útil ter um resistor "pull-up" conectado a um pino de E / S, e não ao VDD. Embora eu não tenha visto as implementações de hardware I2C oferecerem suporte a isso, ter os dados de saída mestre em um pino de E / S separado conectado ao barramento via resistor, em vez de usar um driver de coletor aberto e um resistor de pull-up fixo, evitará desperdiçando corrente quando o mestre deseja emitir um "0". Além disso, se o mestre deixar o SCK baixo por um tempo sem se preocupar com o que está no SDA, ele poderá desativar a solicitação até que esteja pronto para mais comunicação. Se nenhum dos dispositivos precisar usar o alongamento do relógio, o mestre pode simplesmente usar uma saída direta para o SCK e não se incomodar com qualquer puxão nesse fio.
Se alguém usa um software de processamento de bits com um processador rápido e deseja obter um bom desempenho apesar da alta capacitância de barramento, a abordagem acima pode ser combinada com o uso de flexões fracas incorporadas de um processador. Ao ler os dados, ative um pull-up muito forte, brevemente, imediatamente após cada borda de queda do SCK e depois mude para um pull-up fraco. A forte tração puxa a linha alta, apesar da capacitância, e uma vez que a linha é puxada alta, a tração fraca será capaz de mantê-la alta. Mesmo que um dispositivo tenha problemas para puxar a linha para baixo contra a tração forte, poderá fazê-lo assim que a tração forte for desligada.
fonte
http://www.cypress.com/knowledge-base-article/rise-and-fall-time-specifications-scl-and-sda-lines-i2c
fonte
Aqui estão as formas de onda, por 400kiloBits / segundo (forma de onda 101010 de 200KHz). O RC tem 4.7K ohm e 212pF. O valor RC permite a acomodação de 2 TAU.
fonte