LusoRobótica - Robótica em Português

Electrónica => Protocolos => Tópico iniciado por: TigPT em 24 de Julho de 2008, 17:31

Título: I²C ou I2C
Enviado por: TigPT 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:


No esquema a baixo pode-se facilmente identificar a estrutura da rede:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.lusorobotica.com%2Fimg%2Fartigos%2Fi2c_esquema.jpg&hash=8326455cf62bc6d5481ef0744c678a82c326ba60)

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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.lusorobotica.com%2Fimg%2Fartigos%2Fi2c_proto.jpg&hash=2efee82dadede305435a4b273e71a3c196cd6746)

Passando então a explicar:

Bits de start e de stop:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.lusorobotica.com%2Fimg%2Fartigos%2Fi2c_start_stop.jpg&hash=ee934ca54e49cb3b805a3c6397831e95c08f5016)

Outras condições de estado:

Exemplos de utilização do protocolo I2C com o Arduino Diecimila:
Título: Re:I²C ou I2C
Enviado por: TigPT 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 ;)
Título: Re:I²C ou I2C
Enviado por: HyugaTS em 16 de Janeiro de 2009, 15:00
Talvez este site te ajude
I²C (http://www.robot-electronics.co.uk/htm/using_the_i2c_bus.htm)
Título: Re:I²C ou I2C
Enviado por: TigPT 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 ;)
Título: Re:I²C ou I2C
Enviado por: vanila 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:
 (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.robot-electronics.co.uk%2Fimages%2Fi2ca.GIF&hash=7eb071c694e27841a447c470fbef965af48e5278)"
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.
Título: Re:I²C ou I2C
Enviado por: TigPT 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?
Título: Re:I²C ou I2C
Enviado por: msr 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

Título: Re:I²C ou I2C
Enviado por: TigPT 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)
Título: Re:I²C ou I2C
Enviado por: msr 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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.letronet.com.br%2Fpsist%2Fppesq%2Fppesqlivcap%2Fppesqed%2Fppesqedd3%2Ftped3%2Fed3-9.jpg&hash=391e9d265ab04e3d65182aa7a1fe70ac6eab1180)

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.

Título: Re:I²C ou I2C
Enviado por: TigPT 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.
Título: Re:I²C ou I2C
Enviado por: msr 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 ;)
Título: Re:I²C ou I2C
Enviado por: Tecsilveira 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 $






Título: Re:I²C ou I2C
Enviado por: Sérgio_Sena 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.
Título: Re:I²C ou I2C
Enviado por: TigPT 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?
Título: Re:I²C ou I2C
Enviado por: Tyran 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
Título: Re: I²C ou I2C
Enviado por: GnGz em 09 de Julho de 2010, 18:35
Não existe nada mais facil para aprender i2c não consigo compreender quase nada.
Título: Re: I²C ou I2C
Enviado por: beirao em 09 de Julho de 2010, 18:59
Não existe nada mais facil para aprender i2c não consigo compreender quase nada.

Se quiseres, manda-me uma PM com o teu mail que eu envio-te um tutorial que tenho que, na minha opinião, está bastante esclarecedor!
Título: Re: I²C ou I2C
Enviado por: FET_Destroyer em 09 de Julho de 2010, 19:05
Boas beirao
Porque não posta-lo aqui?
Deve haver muito pessoal que percebe pouco de I2C incluindo eu.
Assim ficava disponível para quem quisesse.

Cumps
Título: Re: I²C ou I2C
Enviado por: maurosmartins em 09 de Julho de 2010, 22:51
Olá pessoal, só meter mais uma acha para a fogueira.

O I2C bem como o SPI, o one wire, etc são conhecidos como board level protocol e por isso a sua utilização em cabos de grandes dimensões é desaconselhada.

Para comunicações a distancias maiores, podemos usar CAN, RS485, etc.

Para quem quer um tutorial (está em ingles) este foi o que usei quando comecei a mexer com I2C, penso que é fácil de seguir
http://www.best-microcontroller-projects.com/i2c-tutorial.html (http://www.best-microcontroller-projects.com/i2c-tutorial.html)

Cumprimentos, Mauro.
Título: Re: I²C ou I2C
Enviado por: beirao em 10 de Julho de 2010, 01:04

Ora aqui esta! o PDF é o tutorial e o rar tem dois exemplos...

Nao era bem este tutorial que queria colocar, mas agora é o unico que tenho... Agradeçam ao IPL ;)

O tutorial é sobre MSSP, ou seja, tem I2C e SPI..

Digam se vos foi util ou nao!

cumps
Título: Re: I²C ou I2C
Enviado por: GnGz em 10 de Julho de 2010, 10:05
Obrigado
Título: Re: I²C ou I2C
Enviado por: FET_Destroyer em 10 de Julho de 2010, 13:50
Muito boa info nesse PDF, e melhor ainda, é para PIC  ;D
Título: Re: I²C ou I2C
Enviado por: Sérgio_Sena em 14 de Julho de 2010, 17:22
Esse manual está bem explicito, gostei!

Vejam este, no capítulo de Comunicações Série. Manual de Microcontroladores PIC (http://www.antoniosergiosena.com/files/curso_pic/manual_PICmicro__a.s.sena___senaeng.com.pdf).
Título: Re: I²C ou I2C
Enviado por: Kristey em 21 de Dezembro de 2013, 00:41
Olá pessoal, só meter mais uma acha para a fogueira.

O I2C bem como o SPI, o one wire, etc são conhecidos como board level protocol e por isso a sua utilização em cabos de grandes dimensões é desaconselhada.

Para comunicações a distancias maiores, podemos usar CAN, RS485, etc.

Para quem quer um tutorial (está em ingles) este foi o que usei quando comecei a mexer com I2C, penso que é fácil de seguir
http://www.best-microcontroller-projects.com/i2c-tutorial.html (http://www.best-microcontroller-projects.com/i2c-tutorial.html)

Cumprimentos, Mauro.

estava a pensar usar comunicação I2C para ligar modulos que teriam uns PCF874.
Esses módulos estariam a uns 3 ou 4 metros do Master que seria um ATMEGA...
Sendo assim, será melhor pensar noutra solução?
Título: Re: I²C ou I2C
Enviado por: dropes em 21 de Dezembro de 2013, 01:46
PCF8574
Não me parece que sejam assim tão comprido, o máximo que pode acontecer é teres de baixar a velocidade de comunicação.
Isso seria mais preocupante se fossem 50 ou 100metros, a capacidade máxima do cabo é de 400 a 500pF.

Segue os conselhos do Asena.
Título: Re: I²C ou I2C
Enviado por: Kristey em 21 de Dezembro de 2013, 12:26
O link que ele postou aqui nao está a abrir...
Vou testar e ver se resulta mas, primeiro tenho que por isto a funcionar na breadboard
Título: Re: I²C ou I2C
Enviado por: Sérgio_Sena em 21 de Dezembro de 2013, 12:40
Link corrigido.

Manual estah aqui tambem :: http://lusorobotica.com/index.php?topic=1041.0 (http://lusorobotica.com/index.php?topic=1041.0)

Título: Re: I²C ou I2C
Enviado por: Kristey em 22 de Dezembro de 2013, 01:27
Obrigado ;)