Interface com I²C da familia dsPIC33F

  Ola, hoje iremos iniciar a implementação do programa de interface do microcontrolador dspic33f com um Rtc, nesta primeira parte apresentamos os conceitos da interface I²C que será usada.

1 - Visão geral

O modulo circuito inter-integrado (I²C) é uma interface serial útil para comunicar com outros periféricos ou dispositivos microcontrolados. Estes dispositivos podem ser EEPROM serials, dispositivos de display, conversores A/D, etc.

O modulo I²C pode operar qualquer um dos sistemas abaixo
* Onde o Dspic age como o dispositivo escravo
* Onde o Dspic age como o dispositivo mestre em um sistema mestre único (escravo também pode ser ativo)
* Onde o Dspic age como um dispositivo mestre/escravo em um sistema multi-mestre

O modulo I²C contem lógica mestre e lógica escravo independentes, cada um gerando interrupções baseados em seus eventos, Em sistemas multi-mestre, o software simplesmente particiona em controlador mestre e controlador escravo.                                                    

Quando a lógica mestre do I²C está ativo, a lógica escrava pode permanecer ativa também, detectando o estado do barramento e recebendo mensagens de si mesma em um sistema mestre ou de outros mestre em um sistema multi-mestre. Nenhuma mensagem é perdida durante a decisão de disputa pelo barramento no sistema multi-mestre.

No sistema multi-mestre, colisão no barramento com outros mestre no sistema são detectado e o modulo providencia o método de terminar e reiniciar a mensagem.

O I²C contem um gerador de taxa de comunicação (baud rate), sendo que este não consome recursos do sistema.


1.1 - CARACTERISTICAS

* lógica mestre e escrava independentes
* suporte a multi-mestre, sem perda de mensagem na decisão de disputa.
* detecta endereços de 7 e 10 bits do dispositivo
* modo de repetição do barramento, aceita todas as mensagens como escravo independente do endereço.
* Ajuste automático do relógio SCL, prove atrasos para o processador responde a requisição de dados pelo escravo.
* suporta especificações de barramento de 100khz e 400khz





2 - CARACTERISTICAS DO BARRAMENTO I²C

O barramento I²C é uma interface serial de dois fios. A interface do I²C emprega um compreensivo protocolo para assegurar a validade da transmissão e recepção de dados. Quando comunicando um dispositivo é o mestre que inicia a transferência no barramento e geral o sinal de relógio que permitem a transferência, enquanto outros dispositivos agem como escravos respondendo a transferência. O linha do relógio SCL sai do mestre e entra no escravo, mesmo que ocasionalmente o escravo controle a linha SCL. A linha de dados SDA pode ser entrada ou saída tanto para o mestre como para o escravo.                          

Devido as linha SDA e SCL serem bidirecionais, os estágios de saída controlados pelas linhas SDA e SCL devem conter uma drenagem para a potencia em ordem para realizar uma função AND nos fios do barramento. Resistores externos de pull-up são usados para assegurar um alto nível quando nenhum dispositivos estiver mantendo a linha baixa.            

No protocolo da interface I²C, cada dispositivo tem um endereço. Quando o mestre deseja iniciar uma transferência de dados, primeiro transmite o endereço para o dispositivo que deseja falar. Todos os dispositivos ouvem para ver de qual endereço se trata. Com este endereço, bit 0 específica se o mestre deseja escrever ou ler o dispositivos escravo. O mestre e o escravo são sempre em modos opostos (transmissor/receptor) da operação durante a transferência de dados. Ou seja, eles podem ser imaginados como operando nestas duas relações:
* mestre transmitindo - escravo recebendo                    
* escravo transmitindo - mestre recebendo
Em ambos os caso o mestre origina o sinal SCL do relógio



2.1 - PROTOCOLO DO BARRAMENTO

O seguinte protocolo I²C de barramento foi definido:

* transmissão de dados somente pode ser iniciada se o barramento não estiver ocupado
* durante transferência de dados, a linha de dados deve permanecer estável  enquanto linha de relógio SCL estiver alta. Mudanças na linha de dados enquanto a linha SCL estiver alta será interpretada como condições de fim ou inicio.                                  


2.1.1 - Inicio de transferência de dados (S) START

Após o barramento estar em estado ocioso, uma transição de alto para baixo da linha SDA, enquanto o relógio SCL estiver alto, determina uma condição de inicio. Todos os dados transferidos devem começar com a condição de inicio


2.1.2 - Parada de transferência de dados (P) STOP

Uma transição de baixo para alto da linha SDA enquanto o linha de relógio SCL estiver alta determina uma condição de parada. Toda a transferência de dados deve terminar com a condição de parada.    


2.1.3 - Inicio repetido (R) REPEATED START

Após um estado Aguardo, uma transição de alto para baixo na linha SDA enquanto a linha de relógio SCL estiver alta determina a condição de inicio repetido. Inicio repetido permite ao mestre mudar o direcionamento do barramento sem depende do controle do mesmo.  


2.1.4 - Dados validos (D) DATA VALID

O estado da linha SDA representa a validade da linha quanto após uma condição de inicio a linha SDA esta estável pela duração de um período de sinal de relógio alto. Existe somente um bit de dados por relógio SCL.                                                  


2.1.5 - Confirmando (A) ou não confirmado(N) ACKNOWLEDGE or NOTACKNOWLEDGE

Todos os byte de dados transmitido devem ser confirmado ou não confirmados pelo receptor. O receptor deve colocar a linha SDA baixo para uma ACK ou soltar a linha SDA para um NACK. A confirmação e do período de um bit usando um pulso do SCL.                    


2.1.6 - Espera / dado invalido(Q) WAIT / DATA INVALID

Os dados na linha devem ser mudados durante o período baixo do sinal do relógio. Dispositivos podem estreitar o tempo baixo do pulso, ao abaixar a linha SCL provocando um aguardo no barramento.          


2.1.7 - Barramento ocioso (I) BUS IDLE

Tanto a linha de dados e relógio  mantém alta todos o tempo após uma condição de parada e antes de uma condição de inicio.              



2.2 - MENSAGEM DO PROTOCOLO


2.2.1 - Mensagem de inicio

Cada mensagem é iniciada com a condição de inicio e termina com a condição de parada. O numero de bytes de dados transferidos entre as condições de inicio e parada é determinada pelo dispositivo mestre. Como definido pelo protocolo de sistema, os bytes da mensagem devem ter um significado especial significando algo como byte de endereço do dispositivo ou byte de dados.                          


2.2.2 - Endereço do escravo

O primeiro byte é o endereço do dispositivo que deve fazer parte de qualquer mensagem I²C, deve conter o endereço do dispositivo e o bit de RW = 0, para indicar mestre transmite escravo recebe.


2.2.3 - Confirmação do escravo

O recebimento da mensagem é obrigatório gera um sinal de confirmação ACK, após a recepção de cada byte. O dispositivo mestre deve gerar um pulso SCL extra, que estará associado ao bit de confirmação.                                              


2.2.4 - Mestre transmite

Para cada byte de dado transmitido pelo mestre, o escravo deve confirmar cada byte.                                              


2.2.5 - Inicio repetido

O escravo pode retornar informações para de dados para o mestre. Devendo se observar o bit RW do primeiro byte de endereço do dispositivo que especificou transmissão do mestre e recepção do escravo, para alterar a direção do barramento sem encerrar a mensagem o mestre manda um inicio repetido, seguido do byte de endereço com o mesmo valor anterior e bit RW = 1 para indicar escravo transmite mestre recebe.                                                    


2.2.6 - Escravo responde

Agora que o escravo transmite o byte de dados controlando a linha SDA, enquanto o mestre continua a originar os pulsos.              


2.2.7 - Mestre confirma

Durante as leituras o mestre deve terminar a requisição de dados gerando uma não confirmação NACK no ultimo byte da mensagem.      


2.2.8 - Mensagem de parada

O mestre envia uma condição de parada para terminar a mensagem e retornar ao estado ocioso do barramento.                        




3 - REGISTRADORES DE CONTROLE E STATUS

O modulo I²C tem 6 registradores acessíveis ao usuário para operações I²C. Os registradores são acessados tanto em modo BYTE como em modo WORD.

* Registrador de controle (I2CCON): Este registrador controla as operações do I²C.
* Registrador de status (I2CSTAT): O registrador contem os flags de status indicando o estado do modulo durante as operações.        
* Registrador do buffer de recepção (I2CRCV): Este e o buffer do registrador pelo qual os dados podem ser lidos, este registrador é somente para leitura.                                        
* Registrador de transmissão (I2XTRN): Este é o registrador de transmissão, bytes são escritos neste registrador durante a operação de transmissão. O registrador I2CTRN é um registrador de ler/escrever.                                                  
* Registrador de endereço (I2CADD): O registrador I2CADD armazena o endereço do dispositivo escravo.                                
* Registrador de recarga para gerador de taxa de comunicação (IC2BRG):
Armazena a taxa de comunicação que será usada pelo modulo I²C.

O I2CTRN é um registrador que transmite os dados escritos nele. Este registrador é usado quando o modulo opera como mestre transmitindo dados para o escravo ou como escravo enviando resposta de dados para o mestre. Conforme a mensagem avança o registrador I2CTRN transfere bits individualmente. Por causa disto o registrador somente deve ser sobrescrito enquanto estiver com o barramento ocioso.                  

Dados sendo recebidos pelo mestre ou pelo escravo são armazenados em um registrador não acessível chamado I2CRSR. Quando a recepção do byte é completada, o mesmo é transferido para o registrador I2CRCV. Em operações de recepção os registradores I2CRSR e I2CRCV criam um buffer duplo de recepção, permitindo receber outro byte enquanto o anterior ainda não foi lido do buffer.                                        

Se o modulo recebe outro byte completo antes do software ter lido o buffer de recepção, um estouro de recepção ocorre e será indicado pelo I2COV. O byte no registrador I2CRSR será perdido.    

O registrador I2CADD mantém o endereço do dispositivo escravo. Em modo de 10 bits, todos os bit são relevantes. No modo 7 bits, somente I2CADD<6:0> são relevantes. O A10M(I2CCON<10>) especifica o modo esperado para endereçamento do escravo.  

Na proxima postagem apresentaremos a implementação das rotinas que realizam a interface aqui apresentada.