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.
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:
O que acontece quando os pullups I 2 C são omitidos?
É 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.h
conversar 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.
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.
Respostas:
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.
Provavelmente não. Nesse caso em particular (MCU, RTC, nada mais), definitivamente não.
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
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.
fonte
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.
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.
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.
fonte
You do have pull-ups, just not ones you expected.
- Acho que você acertou em cheio. Obrigado!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.
fonte
Provavelmente, o barramento I2C simplesmente não funcionará.
Mais provável que não.
fonte
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.
fonte
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.
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.
fonte
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
fonte