Módulo Tiny RTC I2C – Parte 1

i2c
Este post faz parte da série Módulo Tiny RTC I2C. Leia também os outros posts da série:

Quando falamos de tempo para um projeto eletrônico, estamos falando de RTC. Um dispositivo que se dedica exclusivamente ao controle do tempo e ao cálculo de calendário, com um consumo de energia mínimo e controle de bateria integrada. Parece ótimo, e de fato é!

No entanto, essa montagem ainda exige a preparação de um esquema, PCB, compra de componentes, desenvolvimento de software… ou apenas um módulo. Vamos apresentar esse módulo, o Tiny RTC I2C, que integra não apenas a sua solução de RTC, mas também bateria e uma memória EEPROM.

Neste primeiro artigo, vamos descrever como funciona a comunicação I2C, apresentando detalhes sobre o RTC e a memória.

Esta série foi desenvolvida com o hardware oferecido pelo loja FILIPEFLOP, a qual foi fundamental para o desenvolvimento deste projeto, pois sem o auxílio do hardware, o projeto se tornaria inviável.

O módulo Tiny RTC I2C

O RTC (Real Time Clock) é de um dispositivo de funcionamento bastante claro. Seu principal componente é o circuito integrado DS1307, um RTC fabricado pela Maxim-IC.

Figura 1: À esquerda vemos o DS1307 e o AT24C32. À direita temos o espaço para o DS18B20 e a bateria LIR2032.
Figura 1: À esquerda vemos o DS1307 e o AT24C32. À direita temos o espaço para o DS18B20 e a bateria LIR2032.

O módulo também é dotado de uma bateria recarregável, que mantém o RTC funcionando enquanto o equipamento está desligado. Trata-se de uma LIR2032, que possui as mesmas dimensões da CR2032 e capacidade de 35mAh. Trataremos dela com muitos detalhes no próximo artigo.

Além do RTC, o módulo possui uma memória AT24C32. Trata-se de uma memória EEPROM serial de 32Kbits, capaz de realizar 1.000.000 (1 milhão) de escritas e armazenar dados por até 100 anos.

O módulo ainda é dotado de um espaço reservado para um sensor de temperatura DS18B20. Esse circuito integrado é implementado em um encapsulamento TO-92, e tem como principal característica a troca de dados de maneira bidirecional em apenas um único pino de comunicação, o 1-Wire. Assim como a bateria, vamos tratar com mais detalhes dessa comunicação no próximo artigo.

O esquemático deste módulo é bastante simplificado, sendo de fácil adaptação nos projetos que seja necessário o uso desse módulo.

Imagem H: Esquemático do módulo Tiny RTC I2C.
Figura 2: Esquemático do módulo Tiny RTC I2C.

Comunicação I2C

Os principais componentes desse módulo se comunicam através de um canal serial síncrono denominado I2C (Inter-Integrated Circuit), que segue o padrão Mestre/Escravo. Toda a comunicação é feita através de dois sinais, SDA e SCL, e por esse motivo alguns fabricantes também denominam esse protocolo como TWI (Two Wire Interface) ou 2-Wire Serial.

Os sinais de comunicação são o SDA (Serial Data) e o SCL (Serial Clock). O SDA é bidirecional, permitindo a troca de informações entre o mestre e os escravos de maneira não simultânea (Half-Duples). Já o SCL é o sinal de sincronismo, gerado apenas pelo Mestre do canal.

Ambos os sinais fazem a comunicação através de uma interface de dreno aberto, o que significa que há apenas um transistor para chavear o sinal de 0V (GND). A indicação de 1 (VCC) é dada através de dois resistores de pull-up, tipicamente com valores entre 2K2Ω e 4K7Ω. Essa estratégia garante que não haverá curto-circuito no caso de um erro de protocolo.

Imagem AA: Resistores de pull-up no SDA e SCL.
Figura 3: Resistores de pull-up no SDA e SCL.

A troca de dados válidos acontece quando o SCL mantém um patamar positivo. Neste momento, podemos confiar que os dados presentes estão corretos. Quando o SCL está em zero, o sistema altera os bits para o próximo patamar válido. Dessa forma, não há mudança de dados enquanto o clock estiver em nível alto.

O estado inativo (idle) do canal sem a troca de informações é com ambos os sinais (SDA e SCL) e 1. Dessa forma, ficou determinado que o início da comunicação (start-bit) acontece na borda de descida do SDA com o SCL em alto, e o fim da comunicação com a borda de subida desse mesmo pino. Como essa situação não acontece durante a troca de dados normal, que mantém o dado constante durante todo o estado de SCL em alto, temos a indicação correta do Start-Bit e Stop-Bit.

Imagem CC: Definição de Start-Bit e Stop-Bit na I2C.
Figura 4: Definição de Start-Bit e Stop-Bit na I2C.

Esse canal permite o endereçamento de até 127 dispositivos, pois troca 7 bits de endereço e costumeiramente mantém o mestre da comunicação com 00h. O bit menos significativo (bit 0) é separado para a indicação de leitura ou escrita de dados, onde a leitura é indicada com o bit 1 e a escrita com o bit 0.

Imagem BB: Forma de onda do início de um frame I2C.
Figura 5: Forma de onda do início de um frame I2C.

Finalizando a troca do byte, há a indicação de ACK ou NACK. Essa informação indica que esse byte (seja endereço ou dado) foi recebido corretamente pelo dispositivo escravo. Caso este tenha recebido corretamente, ele indicará ACK (bit 0). Caso contrário, indicará NACK (bit 1).

A velocidade de comunicação é ligada à frequência de clock gerada, pois cada pulso de clock é a transferência de 1 bit de dado. O padrão de comunicação I2C normalmente limita essa velocidade em 400KHz, o que significa uma transferência máxima de 400Kbps. No entanto, essa velocidade pode ser maior ou menor, de acordo com o componente utilizado. A velocidade máxima da comunicação será a velocidade máxima mais baixa dos dispositivos conectados.

Conectores

O módulo Tiny RTC I2C tem seu acesso ao mundo externo através de dois conectores, P1 e P2. Neles é possível fazer acesso à alimentação, à bateria, ao canal I2C, Canal 1-Wire, e saída SQ do RTC.

A comunicação I2C é apresentada em ambos os conectores, permitindo a ligação de outros módulos ou outros dispositivos. É possível verificar que o módulo já apresenta os resistores de pull-up, R2 e R3, com valores de 3K3Ω.

Imagem DD: Conectores P1 e P2.
Figura 6: Conectores P1 e P2.

Para permitir toda e qualquer ligação externa, o módulo não apresenta conectores soldados. Dessa forma é possível fazer a ligação de fios, barra de pinos, ou barra de terminais, dependendo do projeto adotado.

Imagem EE: Conectores e resistores de Pull-Up.
Figura 7: Conectores e resistores de Pull-Up.

Para os nossos testes, faremos a montagem de uma barra de terminais torneada. Dessa forma, é possível fazer uso do Kit Jumper Macho-Macho x65.

Imagem FF: Solda de conectores.
Figura 8: Solda de conectores.

Essa estratégia permitirá uma fácil ligação entre proto-boards e kits, como o Arduino ou BeagleBone Black.

Imagem GG: À esquerda temos o "Kit Jumper Macho-Macho", e à direita temos o resultado com o conector.
Figura 9: À esquerda temos o “Kit Jumper Macho-Macho” [8], e à direita temos o resultado com o conector.

Relógio de Tempo Real DS1307

O Relógio de Tempo Real (RTC) deste módulo é o DS1307. Um componente bastante completo, integra toda a funcionalidade necessária para essa função. Dentro do barramento I2C, se apresenta com o endereço 68h (110.1000b).

Imagem II: Forma de onda de leitura e escrita de dados.
Figura 10: Forma de onda de leitura e escrita de dados.

Esse RTC possui uma interface bastante padrão. O canal de comunicação I2C exige apenas dois sinais de comunicação com uma CPU, como vimos anteriormente. Necessita apenas um cristal oscilador externo, sem a necessidade de capacitores ou resistores, pois já possui essa interface interna.

Ligação típica do DS1307.
Figura 11: Ligação típica do DS1307.

A interface de bateria e o chaveamento entre a alimentação principal (VCC) e a bateria (VBat) é feita automaticamente, tendo uma baixa perda na interface interna de ligação.

Esquemático do módulo para o RTC.
Figura 12: Esquemático do módulo para o RTC.

Internamente possui 512 bits (64×8 bits) de memória RAM para o trabalho. Essa memória é separada e possui endereços específicos para a horário e calendário, fazendo o incremento e a sequência lógica automaticamente.

Para essa função, utiliza 8 bytes (64 bits) dessa memória, e permite que se utilize os outros 56 bytes restantes como RAM externa. A grande vantagem do uso dessa RAM é que ela não se perde quando o dispositivo é desligado. A bateria não apenas manterá a memória funcionando, como também irá reter os dados gravados nesse espaço.

Tabela 1: Mapa de memória do DS1307.

Tabela 01: Mapa de memória do DS1307.

Toda a contagem do tempo é feita em BCD. Isso significa que os valores apresentados estarão em hexadecimal, mas representarão valores decimais, sem conversão de base. Isso significa que o valor 00h representará o valor 0 decimal, assim como 01h representará o valor decimal. No entanto, depois do valor 09h (0000.1001 binário), o valor seguinte não será 0Ah (0000.1010 binário), mas saltará automaticamente para 10h (0001.0000 binário). Dessa forma a contagem permanece com a sequência decimal, mesmo sendo apresentada em hexadecimal.

Tabela 2: Sequência dos valores em BCD.

HexaBinárioValor Representado
00h0000 0000 b0
01h0000 0001 b1

.
.
.

.
.
.

.
.
.
09h0000 1001 b9
10h0001 0000 b10
11h0001 0001 b11
.
.
.
.
.
.
.
.
.
99h1001 1001 b99

Cada endereço de memória do dispositivo é dedicado para um conjunto de 8 bits. Como dissemos, os primeiros 8 bytes são reservados para o horário e o calendário. A escrita nesses endereços de memória significa alterar a data e hora atual, e isso acontece com o dispositivo em funcionamento.

CONTROL REGISTER (07h)

O endereço 07h é denominado CONTROL REGISTER (Registro de Controle), e é dedicado às configurações do dispositivo. 

 Tabela 3: Mapa de bits do CONTROL REGISTER.

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
OUT00SQWE00RS1RS0

Nele fazemos o controle da saída quadrada de sinal, presente no pino SQW do RTC, e no conector P1 no pino 7 (SQ). Suas configurações são:

  • OUT (Bit 7) – Output Control

Este bit é um espelho do estado do pino SQW. Caso este bit esteja em 1, o pino SQW estará em 1. Da mesma forma, se este bit estiver em 0, o pino terá 0 de maneira correspondente. Dessa forma é possível que o software, através do canal I2C, verifique o estado do pino, caso este não esteja montado.

  • SQWE (Bit 4) – Square Wave Enable

Quando este bit estiver em 1, a saída de onda quadrada será habilitada. O estado inicial deste bit é 0.

  • RS1 e RS0 (Bits 1 e 0) – Rate Select 

Uma vez que SQWE esteja habilitado, estes dois bits selecionam a frequência de saída do sinal em SQWE. Esta seleção é bastante útil, pois reflete uma taxa da frequência do cristal de 32.768Hz. Suas possibilidades são:

RS[1:0]Frequência (SQW)
001 Hz
014.096 Hz
108.192 Hz
1132.768 Hz

Referências

[1] – Módulo Tiny RTC I2C – FILIPEFLOP

[2] – Maxim IC – RTC DS1307

[3] – Power Stream – LIR2032

[4] – Atmel – AT24C32

[5] – Maxim IC – DS18B20

[6] – Wikipedia – 1-Wire

[7] – Wikipedia – http://en.wikipedia.org/wiki/I%C2%B2C

[8] – Kit Jumpers Macho-Macho 65x – FILIPEFLOP

[9] – Wikipedia – Binary Coded Decimal

Figura 1 – Fonte: Embarcados 

Figura 2 – Fonte: Módulo Tiny RTC I2C – FILIPEFLOP

Figura 3 – Fonte: Cypress – AN50987

Figura 4 – Fonte: Atmel – DOC0336

Figura 5 – Fonte: Electronics and Electrical Quizzes – I2C

Figura 6 – Fonte: Embarcados 

Figura 7 – Fonte: Embarcados 

Figura 8 – Fonte: Embarcados 

Figura 9 – Fonte: Kit Jumpers Macho-Macho 65x – FILIPEFLOP

Figura 10 – Fonte: Maxim IC – RTC DS1307

Figura 11 – Fonte: Maxim IC – RTC DS1307

Figura 12 – Fonte: Módulo Tiny RTC I2C – FILIPEFLOP

Tabela 1 – Fonte: Maxim IC – RTC DS1307

Tabela 2 – Fonte: Wikipedia – BCD

Tabela 3 – Fonte: Maxim IC – RTC DS1307

Tabela 4 – Fonte: Maxim IC – RTC DS1307

Crédito da imagem destacada: Módulo Tiny RTC I2C – FILIPEFLOP

Outros artigos da série

Módulo Tiny RTC I2C – Parte 2 >>

Engenheiro Eletricista formado PUC-SP e Técnico em Eletrônica pela ETE Getúlio Vargas, é especialista em projetos eletrônicos analógicos e digitais, especialmente no condicionamento de sinais analógicos e integração entre dispositivos digitais.

Nos últimos anos, vem atuando no desenvolvimento de software embarcado para núcleos ARM Cortex e na construção de hardwares para sistemas de potência.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Home » Comunicações » Módulo Tiny RTC I2C – Parte 1
Comentários:
Notificações
Notificar
guest
7 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Daniel Quadros
Daniel Quadros (@dquadros)
Membro
28/03/2020 11:17

Excelente artigo, muito completo e claro!

Renato Augusto Tavares
Renato Tavares
20/10/2015 20:06

Será que poderia arrumar os diagramas no CadSoft EAGLE? Ta meio confuso esses diagramas ai…

Francesco Sacco
Reply to  Renato Tavares
21/10/2015 09:19

Olá Renato,

Não sei se entendi direito. Você precisa do esquemático no Eagle?
Veja se este está mais condizente com o que precisa:
http://www.hobbyist.co.nz/sites/default/files/docs/RTC/Tiny_RTC_schematic.pdf

Um abraço.

Rafael Dias
Rafael Dias
22/07/2015 16:12

encontrei um bom artigo de como se calcular os resistores de pull-up das linhas SDA e SCL. Pode ser útil a alguém:
http://www.edn.com/design/analog/4371297/Design-calculations-for-robust-I2C-communications

Francesco Sacco
Reply to  Rafael Dias
24/07/2015 10:04

Olá Rafael,
Muito bacana esse link. A teoria que ele apresenta não serve apenas para I2C, mas também para OneWire.
Obrigado por compartilhar.

Renato Augusto Tavares
17/07/2015 15:24

Continue com essa matéria! Muito boa e importante, louco pela segunda parte.

Francesco Sacco
Reply to  Renato
17/07/2015 18:09

Olá Renato,

Obrigado pelo retorno. Fico feliz que tenha gostado.
Esse artigo foi dividido em 3 partes e a segunda já está pronta. Espero que goste também.
Um abraço.

Talvez você goste:

Séries



Outros da Série

Menu