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: I²C ou I2C  (Lida 41064 vezes)

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

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
I²C ou I2C
« em: 24 de Julho de 2008, 17:31 »
Protocolo I²C ou I2C

O protocolo I²C foi desenvolvido pela Philips em 1996, e veio para ficar pois este permite uma boa modelarização das comunicações, baixando o tempo e custo de desenvolvimento de dispositivos, assim como uma grande flexibilidade no funcionamento, consumindo pouca corrente, e sendo bastante imune a ruídos.

Deixemos-nos de teorias pois não é o objectivo deste artigo, existe muita informação sobre este barramento e por isso vamos tentar apenas criar aqui um local de fácil compreensão e consulta do protocolo.



Começamos então pelo modo Standard, ou Single Master.

O barramento é conhecido por utilizar apenas dois fios para comunicação entre vários dispositivos electrónicos (128 slaves creio eu devido à estrutura que iremos analisar mais à frente.), mas contudo este necessita de 4 fios, dois de alimentação, e os dois fios de dados.

Estes são então:

  • VCC (normalmente +5V)
  • GND (massa comum entre os equipamentos, muito importante para que quando os dispositivos queiram dizer zero, o consigam dizer de forma perceptível para todas as outras máquinas)
  • SDA (Serial DAta Line)
  • SCL (Serial CLock)

No esquema a baixo pode-se facilmente identificar a estrutura da rede:


R --> pullup opcional, raramente são mencionadas mas devem de se usar entre 4KOhm a 10KOhm.


Assim, como na maioria dos barramentos, meter um fio a VCC (quer este seja a 5V ou até mesmo a 3,3V, pois testei a utilização de 3,3V para este barramento e funciona sem quaisquer problemas, mesmo com um master a comunicar e a ler entre 0V~5V) significa mete-lo a HIGH, ou a estado binário 1 (um).

E como é de calcular, se os estados são binários, serão o oposto ou seja meter um fio a GND (0V quer para um circuito entre 0V~5V quer para entre 0V~3,3V) significa mete-lo a LOW, ou estado 0 (zero).


Assim passo a mostrar o esquema de comunicações:


Passando então a explicar:
  • Start bit é gerado pelo Master
  • 7 bits de endereço são dados pelo master para dizer com que slave pretende comunicar
  • 1 bit indica se existe intenção de escrita ou de leitura nesse dispositivo
  • slave após se ter identificado com aquele endereço diz que tomou conhecimento
  • 1 byte (8 bits) de dados são mandados para o slave ou pelo salve dependendo da intenção anterior de R/W
  • após cada thread de dados um ack bit é dado pelo outro dispositivo para dizer que recebeu o byte inteiro
  • a tarefa repete-se desde o ponto 5 até que seja dado o stop bit representado por um Fim no esquema

Bits de start e de stop:


Outras condições de estado:
  • SDA só pode variar com SCL a LOW, e quando SCL subir SDA tem que se manter estável até que SCL desça. Qualquer variação de SDA enquanto SCL esta a HIGH será interpretado como um START ou STOP bit.
  • O dispositivo que está endereçado naquele momento ou acaba de ficar endereçado deve de responder com um acknowledge bit após cada byte transmitido. O master gerará um SCL extra após cada byte, ao qual o slave deverá fazer pull down do SDA para que o master saiba que o byte foi bem recebido.

Exemplos de utilização do protocolo I2C com o Arduino Diecimila:
« Última modificação: 16 de Janeiro de 2009, 12:08 por TigPT »

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:I²C ou I2C
« Responder #1 em: 16 de Janeiro de 2009, 12:14 »
Tenho uma dúvida e gostava que quem já esteja mais familiarizado com esta tecnologia me esclareça.

O bus I2C tem que ter pullups (convém), a pergunta é:
Só pode ter um pullup ao longo do bus todo, ou pode ter mais do que um pull up, por exemplo, meter um pullup no mesmo bus por cada slave que se adiciona!?

Obrigado ;)

Offline HyugaTS

  • Mini Robot
  • *
  • Mensagens: 16
  • Kill all humans!
Re:I²C ou I2C
« Responder #2 em: 16 de Janeiro de 2009, 15:00 »
Talvez este site te ajude
I²C

My software never has bugs. It just develops random features.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:I²C ou I2C
« Responder #3 em: 16 de Janeiro de 2009, 15:26 »
O artigo está interessante, mas mais uma vez não especifica se posso utilizar múltiplos pullups...

Vou ter que fazer as contas/testes para tomar as minhas decisões, mas obrigado, fica mais uma boa fonte de informação para todos ;)

Offline vanila

  • Mini Robot
  • *
  • Mensagens: 68
Re:I²C ou I2C
« Responder #4 em: 16 de Janeiro de 2009, 20:34 »
Acho que não viste bem:
"There should be a resistor from the SCL line to the 5v line and another from the SDA line to the 5v line. You only need one set of pull-up resistors for the whole I2C bus, not for each device, as illustrated below:
 "
Não sei se correcto mas no documento diz que só deves utilizar uma resistência de pull-up por cada linha do Bus I2C e não por cada Device ligado. ;) Ao pores várias resistências de pull-up estás na verdade a inserir várias resistências em paralelo logo, a baixar a resistência, influenciando o comportamento dos circuitos.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:I²C ou I2C
« Responder #5 em: 16 de Janeiro de 2009, 20:37 »
Eu compreendo, queria perceber é se mesmo assim posso, se os dispositivos deixam, visto falarem de  1k8 (1800 ohms) a 47k (47000 ohms), se meter de 47K, posso meter uma por device que vai baixando mas não chega aos 1k8, logo não existe problema.

Concordam?

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re:I²C ou I2C
« Responder #6 em: 27 de Janeiro de 2009, 00:18 »
Só pode ter um pullup ao longo do bus todo, ou pode ter mais do que um pull up, por exemplo, meter um pullup no mesmo bus por cada slave que se adiciona!?

Bem, vou arriscar e mandar isto um bocado para o ar, uma vez que nunca tinha ouvido falar em I2C e a minha experiencia tambem não é muita... Mas pode ser que ajude.
Qual seria a tua ideia ao colocar um pullup por slave? É que basta teres apenas uma resistência entre a alimentação e cada bus. Cada uma delas é suficiente para "puxar" os 5V para cada um dos "slaves". O "puxar"os 5V ou ligar à massa estará dependente das indicações que dás no "master" através da tal combinação de bits.

Edit: continuando o raciocínio, são esses bits que depois fazem com que os transístores indicados na figura estejam ao corte (a saída [tensão do colector] fica a +vcc ou coisa parecida) ou a conduzir (a saída fica a gnd)

Espero não ter dito nenhum disparate  :-X

« Última modificação: 27 de Janeiro de 2009, 00:24 por msr »

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:I²C ou I2C
« Responder #7 em: 27 de Janeiro de 2009, 00:22 »
A ideia era fazer slaves com pullups no circuito independentemente de os utilizar sozinhos ou num circuito com vários.

Mas o melhor é mesmo meter só um pullup para evitar que os slaves ou o master não consigam puchar os pullups todos a GND.

Já agora, que achaste do artigo? Ficaste a conhecer o mínimo do protocolo ou ficaram muitas dúvidas? (para poder alterar se necessário)

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re:I²C ou I2C
« Responder #8 em: 27 de Janeiro de 2009, 00:46 »
Acho que está bom! Mas talvez só com prática entenda melhor a verdadeira utilidade disto, que acho que é o que está a faltar para te endender...  ;D

Citar
Mas o melhor é mesmo meter só um pullup para evitar que os slaves ou o master não consigam puchar os pullups todos a GND.
De qualquer das maneiras, com esta voltei a não te perceber... O pullup é o que puxa para os 5V, certo? O que puxará para o gnd é o pulldown (que no caso da figura ali de cima é o transístor). Tendo isto em conta tens uma coisa deste género:


Imagina que tens N slaves idênticos a puxar (através da resistência/pullup) os 5V. Se tiveres uma resistência/pullup por cada slave ficas com N resistências em paralelo. Como no paralelo a que predomina é a que tem o valor mais baixo isso iria corresponder a teres usado apenas uma resistência (com o valor aproximado da resistência mais baixa que tenhas usado) pelo que é desnecessário o uso de uma resistencia por slave.


Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:I²C ou I2C
« Responder #9 em: 27 de Janeiro de 2009, 00:54 »
Várias resistências em paralelo não daria uma resistência equivalente igual à mais baixa, mas sim uma resistência equivalente bastante mais baixa.

Mas para o caso é melhor meter só uma vez no bus.

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re:I²C ou I2C
« Responder #10 em: 30 de Janeiro de 2009, 20:38 »
Várias resistências em paralelo não daria uma resistência equivalente igual à mais baixa, mas sim uma resistência equivalente bastante mais baixa.

Tens razão, eu tava a pensar em resistencias com valores diferentes, e mm assim só seria "uma boa aproximação" para poucas resistências.
Não sei se te ajudei em alguma coisa, mas enfim. A intenção era boa ;)

Offline Tecsilveira

  • Mini Robot
  • *
  • Mensagens: 1
Re:I²C ou I2C
« Responder #11 em: 10 de Abril de 2009, 15:49 »
Olá .


Erro no primeiro ACK  . 

O primeiro ACK tanto no modo Escrita : (startbit + 1101000 + 0 (write)  e
O primeiro ACK tanto no modo Leitura :( startbit + 1101000  + 1(Read)
Vem sempre do Slave  DS1307 ?

Então porque que nessa rotina abaixo para o modo Write eu recebo o primeiro ACK
normalmente :

inicio:
mov a, #11010000b
lcall startbit
lcall envio
lcall ack                   ;    nesse caso da escrita ele nao faz a rotina de erro do ACK
                               ;fica sempre no loop
ljmp inicio

E nessa abaixo eu mudo somente o Bit de Escrita para Leitura e o slave não manda o ACK

inicio:
mov a, #11010001b
lcall startbit
lcall envio
lcall ack                            ; não recebo o ACK ? porque?
ljmp inicio

Qual o defeito nesse caso , não consegui detectar o problema , tem como ajudar-me ?

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;rotina de detecção do ACK e erro_ack;;;;;;;;;;;;;;;;;;;;;
ack:
setb p0.1
lcall menor
setb p0.0
mov c,p0.1
jc erro_ack
lcall maior
clr p0.0
lcall menor
ret

erro_ack:
clr p0.0
clr p0.1
clr p0.7

sjmp $







Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re:I²C ou I2C
« Responder #12 em: 11 de Abril de 2009, 09:23 »
Eu compreendo, queria perceber é se mesmo assim posso, se os dispositivos deixam, visto falarem de  1k8 (1800 ohms) a 47k (47000 ohms), se meter de 47K, posso meter uma por device que vai baixando mas não chega aos 1k8, logo não existe problema.


O cálculo das resistências de Pull-Up, é feito de acordo com a capacidade dos dispositivos instalada no barramento.
Todos os chips que usam o barramento, têem uma capacidade por defeito. Indicada no datasheet.

Estes condensadores parasitas devem ter a posibilidade de carregar/descarregar na totalidade, a cada transição do sinal, para não criar ondas sinusoidais, em vez das necessárias quadradas.

Uma resistência de 4k7 é sufice para a maioria dos casos.
Se se aumentar a quantidade de chips pendurados no barramento, então podemos baixar para 2k2, e mesmo 1k se o barramento tiver umas dezenas de metros e vários participantes.

Atenção também aos retornos das massas, pois nos casos dos Robots com muitos motores, podem trazer ruido parasita que pode mascarar a comunicação.
Já me aconteceu isso, quando tinha os meus formandos de volta dos simples DearRobot, quando um deles se lembrou de ligar mais servos ao sistema.
O problema teve que ser resolvido com a ajuda do osciloscópio, que foi quando vi as ondas redondas e misturadas com ruido, em vez de quadradas e certinhas. Mesmo a baixa velocidade.

Espero ter ajudado.
Para cálculos directos, usar o datasheet para saber quais as capacidades de cada chip, e fazer as contas da malha RC, tendo em conta os tempo turn-on/turn-off. E se não tiverem pressa, usem a velocidade mais baixa do barramento.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:I²C ou I2C
« Responder #13 em: 11 de Abril de 2009, 11:39 »
Muito obrigado asena, realmente estava a deixar isso passar-me ao lado.

Tecsilveira, não estou a ver qual é o problema, esse assembly é para que arquitectura?

Offline Tyran

  • Mini Robot
  • *
  • Mensagens: 293
Re:I²C ou I2C
« Responder #14 em: 06 de Maio de 2009, 12:14 »
@Tecsilveira, penso que o problema está na tua rotina de ack pois não estará bem implementada penso, mas eu também só agora estou a estudar I2C (TWI). E também não sei que fazem algumas rotinas que estás ai a chamar :P

cumpzz