Módulos de Comunicação Série
O módulo EUSART - Enhanced Universal Synchronous Asynchronous Receiver Transmitter - Receptor/
Transmissor Síncrono/Assíncrono Série Avançado, é um periférico interno de comunicações I/O série. Tam- bém é conhecido como SCI - Serial Communications Interface - Interface de Comunicações Série.
Contém todos os geradores de relógio, “shift-registers” e registos de dados necessários para fazer uma emissão, ou recepção, de dados série, independentemente da execução do programa principal. Como o seu nome indica, aparte do uso do relógio para sincronização, este módulo também pode estabelecer comunicações assíncronas, o que o torna insubstituivel em algumas aplicações.
Como exemplo, no caso de ser difi cil, ou impossivel, de disponibilizar canais especiais de Relógio e Dados, ex.: controlo remoto por rádio ou infravermelhos, o módulo EUSART é uma solução bastante conveni- ente.
O sistema EUSART, dentro do PIC16F887, tem as seguintes características:
Transmissão/Recepção Assíncrona em Full-Duplex (envia e recebe ao mesmo tempo);
Tamanho de dados confi guravel entre 8 ou 9 bits;
Detecção de endereço no modo de 9 bits;
Detecção de erro, de registo de entrada já cheio;
Comunicação Hall-Duplex (ou envia, ou recebe) no modo Síncrono Mestre, ou Escravo.
•
•
•
•
•
Modo Assíncrono da EUSART
A EUSART transmite e recebe dados, usando um formato normalizado de “non-return-to-zero (NRZ)”, ou não-retorna-ao-zero. Como de pode ver na fi gura abaixo, este modo não usa sinal de relógio, enquanto os dados estão a ser transferidos:
EUSART em modo Assíncrono
Cada pacote de dados é transferido da seguinte maneira:
Quando parado, o pino de saída está no estado lógico 1;
Cada transmissão de dados começa com um bit START, que é sempre zero (0);
Cada pacote de dados tem 8 ou 9 bits de tamanho, onde o LSB é sempre o primeiro a ser transferido;
Cada transmissão de dados termina com um bit de STOP, que tem sempre estado lógico (1).
•
•
•
•
Transmissor Assíncrono da EUSART
Transmissor Assíncrono da EUSART
De maneira a possibilitar a transmissão de dados com o módulo EUSART, é necessário confi gurá-lo para trabalhar como transmissor. Ou seja, é necessário defi nir o estado dos seguintes bits:
TXEN = 1 - O transmissor da EUSART está ligado, activando este bit no registo TXSTA;
SYNC = 0 - A EUSART está confi gurada para funcionar em modo assíncrono, desactivando este bit do registo TXSTA;
SPEN = 1 - Activando este bit do registo RCSTA, a EUSART é activada e o pino TX/CK é automaticamente confi gurado como saída. Se este bit é simultaneamente usado para alguma função analógica, esta deve ser desactivada, limpando o bit correspondente no registo ANSEL.
O cerne do transmissor EUSART, é o “shift-register” TSR, que não é directamente acessivel pelo utilizador. De maneira a iniciar a transmissão, o módulo deve estar ligado, activando o bit TXEN. Os dados a enviar, devem ser escritos no registo TXREG, o que vai causar a seguinte sequência de eventos:
O byte é imediatamente transferido para o “shift-register” TSR;
O registo TXREG mantém-se vazio, o que é indicado pela fl ag TXIF do PIR1. Se o bit TXIE do registo PIE1 estiver activo, uma interrupção é gerada. De qualquer modo, quer a interrupção esteja activa, ou não, esta fl ag é sempre activada. Também, não pode ser apagada pelo sotware, mas é apagada quando se escreve para o TXREG;
A electrónica “empurra” os dados para o pino TX, ao mesmo ritmo do relógio interno: START bit ... dados ... STOP bit;
Quando o último bit abandona o TSR, o bit TRMT do registo TXSTA é automaticamente activado;
Se, entretanto, o TXREG recebeu um novo caracter, todo o procedimento é repetido imediatamente ao STOP bit do caracter anteriormente transmitido.
O envio de dados de 9 bits, é habilitado activando o bit TX9 do TXSTA. O bit TX9D do TXSTA é o nono MSB. Quando da transferência, o TX9D deverá ser escrito, antes de escrever para o TXREG. Todos os noves bits de dados serão transmitidos, assim que a escrita no TXREG estiver completa.
•
•
•
•
•
Receptor Assíncrono da EUSART
Receptor Assíncrono da EUSART
Para activar a recepção de dados, é necessário fazer o seguinte:
CREN = 1 - O receptor da EUSART é ligado, activando este bit no registo RCSTA;
SYNC = 0 - A EUSART está confi gurada para funcionar em modo assíncrono, desactivando este bit do registo TXSTA;
SPEN = 1 - Activando este bit do registo RCSTA, a EUSART é activada e o pino TX/CK é automaticamente confi gurado como saída. Se este bit é simultaneamente usado para alguma função analógica, esta deve ser desactivada, limpando o bit correspondente no registo ANSEL.
Quando estes passos forem concluidos, e o START bit detectado, os dados são transferidos para o shift-regis- ter RSR pelo pino RX. Quando o STOP bit fôr recebido, a seguinte ocorre:
Os dados são automaticamente transferidos para o RCREG, se vazio;
A fl ag RCIF é activada, e uma interrupção, se estiver habilitada pelo bit RCIE no PIE1, ocorre. De igual forma ao transmissor, a fl ag é limpa apenas quando se lê do RCREG. Não esquecer que é uma memória de recepção de dois bytes, o que permite receber dois caracteres simultaneamente;
Se o RCREG estiver ocupado, com os dois bytes e o shift-register detectar um STOP bit, o bit the Over- fl ow OERR vai ser activado. Neste caso, os dados que chegaram são perdidos, e o bit OERR deverá ser limpo pelo software. Tal é feito desactivando e activando o bit CREN. NOTA: não é possivel receber novos dados, enquanto o bit OERR estiver activo;
Se o STOP bit for zero, o bit FERR do RCSTA é activado, indicando erro na recepção;
Para receber dados com 9 bits, é necessário activar o bit RX9 no RCSTA.
Detecção de Erros na Recepção
Há dois tipos de erros que o microcontrolador pode detectar automaticamente. O primeiro é chamado de erro de Framing, e ocorre quando o receptor não detecta o STOP bit no tempo certo. Este erro é indicado pelo bit FERR do RCSTA.
Se este bit estiver activado, signifi ca que a última recepção de dados pode estar incorrecta.
É importante lembrar:
Um erro de Framing não gera uma interrupção por si próprio;
Se este bit estiver activo, os últimos dados têem erros;
Um erro de Framing, não impossibilita a recepção de dados;
O bit FERR é limpo, lendo os dados recebidos;
O bit FERR não pode ser limpo por software. Se necessário, pode ser limpo, desactivando o bit SPEN do RCSTA. Vai simultaneamente causar Reset de todo o sistema EUSART.
Outro tipo de erro, é chamado de “Overrun”. A memória de receoção pode conter dois caracteres. Um erro overrun vai ser gerado se o terceiro caracter é recebido. Simplesmente não há espaço para outro byte, e um error é inevitavel. Quando esta situação acontece, o bit OERR do RCSTA é activado. As consequências são as seguintes:
•
•
•
•
•
•
•
•
•
•
Os dados já recebidos, e armazenados na memória de recepção, podem ser normalmente lidos;
Nenhum byte adicional vai ser recebido, enquanto o bit OERR não for desactivado;
Este bit não é directamente acessivel. Para o limpar, é necessário desactivar o bit CREN do RCSTA, ou fazendo um Reset ao módulo EUSART, limpando o bit SPEN do TCSTA.
Recepção de dados de 9 bits
Além de receber dados de 8 bits, o sistema EUSART suporta recepção de dados com 9 bits.
No lado transmissor, o nono bit está “agarrado” ao byte original, mesmo antes do STOP bit. No lado receptor, quando o bit RX9 do RCSTA está activo, o nono bit vai ser automaticamente escrito no bit RX9D, do mesmo registo.
Quando este byte é recebido, o programador deve ter em atenção em como o vai ler. O nono bit deverá ser lido antes de ler os restantes 8 bits, pois se não o fi zer, o nono bit será automaticamente limpo.
Recepção de dados a 9 bits
•
•
•
Detecção de endereços
Quando o bit ADDEN do registo RCSTA está activo, o módulo EUSART está habilitado a receber dados de 9 bits, onde todos os dados de 8 bits serão ignorados. Embora pareça uma restrição, este modo permite a comunicação série entre vários microcontroladores.
O principio de operação é simples. O Mestre envia 9 bits, que representa o endereço de um microcontrolador.
Todos os microcontroladores Escravos que partilham a linha de transmissão, recebem estes dados. Todos os escravos deverão ter o bit ADDEN activado, para permitir a detecção de endereço.
Depois da recepção, cada Escravo verifi ca se esse endereço é o seu. O software, depois de confi rmar o endereço, deverá desactivar a detecção de endereço, limpando o bit ADDEN. O dispositivo Mestre continua o envio de dados de 8 bits. Todos os dados passando pela linha de transmissão, vão ser recebidos e reconhecidos apenas pelo Escravo já correctamente endereçado. Após receber o último byte, o Escravo deverá activar o bit AD- DEN.
de maneira a poder detectar outra vez os endereços.
Registo TXSTA
CSRC - Bit de selecção da origem do relógio. É apenas usado no modo síncrono.
1 - modo Mestre. Clock é gerado internamente pelo gerador de Baud Rate;
0 - modo Escravo. Clock é gerado por uma fonte externa.
TX9 - Bit de activação de transmissão de 9 bits 1 - Transmissão a 9 bits
0 - Transmissão a 8 bits
TXEN - Bit de activação da Transmissão 1 - Transmissão activa
0 - Transmissão desligada
SYNC - Bit de selecção do modo da EUSART 1 - EUSART funciona no modo síncrono 0 - EUSART funciona no modo assíncrono
SENDB - Bit de envio de caracter de “break”. Apenas usado em modo assíncrono, e apenas no caso de desco- brir o standard do barramento LIN
1 - O envio do caracter Break activado 0 - O envio do caracter Break terminou
BRGH - Bit de selecção de High Baud Rate (alta velocidade de relógio) no modo assíncrono. Não afecta a EUSART no modo síncrono.
1 - EUSART funciona em alta velocidade 0 - EUSART funciona em baixa velocidade
TRMT - Bit de estado do Shift-Register de Transmissão 1 - Registo TSR está vazio
0 - Registo TSR está cheio
TX9D - Nono bit de dados transmitidos. Pode ser usado para endereço ou para bit de paridade.
Registo RCSTA
SPEN - Bit de activação da porta Série
1 - Porta Série activa. Os pinos RX/DT e TX/CK são automaticamente confi gurados como entrada e saída, respectivamente
0 - Porta Série desactivada
RX9 - Bit de activação da Recepção de 9 bits 1 - Recepção de 9 bits
0 - Recepção de 8 bits
SREN - Bit de activação de Recepção singular. Usado apenas em modo síncrono, quando o microcontrolador funciona como Mestre
1 - Recepção singular activada 0 - Recepção singular desactivada
CREN - Bit de activação de Recepção contínua Modo Assíncrono:
1 - Recepção contínua activada 0 - Recepção contínua desactivada Modo Síncrono
1 - Recepção contínua activada, até o bit CREN ser limpo 0 - Recepção contínua desactivada
ADDEN - Bit de activação de Detecção de Endereço 1 - Activa a detecção de endereço, com recepção a 9 bits
0 - Desactiva a detecção de endereço, e o nono bit pode ser usado como bit de paridade
FERR - Bit de erro de “Framing”
1 - Na recepção, erro de Framing detectado 0 - Sem erro de Framing
OERR - Bit de erro de “Overrun”
1 - Na recepção, erro de Overrun detectado 0 - Sem erro de Overrun
RX9D - O nono bit dos dados recebidos, pode ser usado com endereço, ou bit de paridade
BRG - Baud Rate Generator - Gerador de Relógio para a EUSART
Se se olhar atentamente para o diagrama do receptor/transmissor assíncrono da EUSART, em ambos os casos, pode ver-se que o sinal de relógio do temporizador local BRG, é usado para a sincronização. A mesma fonte de relógio é usada no modo síncrono.
Este temporizador consiste em dois registos de 8 bits, num total de 16 bits.
Gerador de Baud Rate da EUSART
Um número escrito para estes dois registos, determina o Baud Rate - Velocidade da porta Série. Além do mais, ambos o bit BRGH do TXSTA e o bit BRGH16 do BAUDCTL, infl uenciam a frequência de relógio.
A fórmula usada para calcular o Baud Rate, é dada pela tabela abaixo:
Bits BRG / EUSART Mode Baud Rate Formula
SYNC BRG1G BRGH
0 0 0 8-bit / assíncrono Fosc / [64 (n + 1)]
0 0 1 8-bit / assíncrono Fosc / [16 (n + 1)]
0 1 0 16-bit / assíncrono Fosc / [16 (n + 1)]
0 1 1 16-bit / assíncrono Fosc / [4 (n + 1)]
1 0 x 16-bit / assíncrono Fosc / [4 (n + 1)]
1 1 x 16-bit / assíncrono Fosc / [4 (n + 1)]
As tabelas seguintes, contêem valores que devem ser escritos no registo SPBRG, e nos bits SYNC, BRGH e BRGH16, de maneira a obter Baud Rates padronizadas.
As fórmulas usadas para determinar o Baurd Rate, são:
Registo BAUDCTL
ABDOVF - Flag de Overfl ow da detecção de Auto-Baud-Rate, é apenas usado no modo assíncrono, durante a detecção do baud rate
1 - Temporizador Auto Baud Rate chegou ao fi m 0 - Temporizador Auto Baud Rate não chegou ao fi m
RCIDL - Flag de Recepção parada, apenas usado no modo assíncrono 1 - A recepção está parada
0 - O START bit foi recebido, e a recepção está em progresso.
SCKP - Bit de selecção da polaridade do Relógio Síncrono Modo Assíncrono:
1 - Dados invertidos na transmissão no pino RC6/TX/CK 0 - Dados não invertidos na transmissão no pino RC6/TX/CK Modo Síncrono:
1 - Sincronização no fl anco ascendente do relógio 0 - Síncronização no fl anco descendente do relógio
WUE - Bit que habilita o Wake-up (“acordar”) pela EUSART
1 - O receptor aguarda por um fl anco descendente no pino RC7/RX/DT, para acordar o microcontrolador do modo Sleep
0 - O receptor funciona normalmente
ABDEN - Bit de habilitação de Detecção Automática do Baud Rate, apenas em modo assíncrono
1 - Modo de detecção automática do baud rate está ligado. Este bit é automaticamente limpo aquando da detecção do baud rate
0 - Modo de detecção automática do baud rate está desligado
Resumidamente:
Enviar dados pela EUSART em modo assíncrono:
O baud rate deverá ser ajustado, pelos bits BRGH do registo TXSTA, e BRG16 do registo BAUDCTL, e pelos registos SPBRGH eSPBRG;
O bit SYNC do TXSTA deverá ser limpo, e o bit SPEN do RCSTA deverá ser activado, de maneira a ligar a porta série;
Na transmissão de 9 bits, o bit TX9 do TXSTA deverá ser activado;
A transmissão de dados é habilitada, activando o bit TXEN do TXSTA. O bit TXIF do PIR1 é automati- camente activado;
Se for necessário haver um interrupção, o bit TXIE do PIE1, e os GIE e PEIE do INTCON deverão ser activados;
Na transmissão de 9 bits, o valor do nono bit deverá ser escrito no bit TX9D do TXSTA;
A transmissão inicia quando se escreve no registo TXREG;
Receber dados pela EURSAR em modo assíncrono:
O baud rate deverá ser ajustado, pelos bits BRGH do registo TXSTA, e BRG16 do registo BAUDCTL, e pelos registos SPBRGH eSPBRG;
O bit SYNC do TXSTA deverá ser limpo, e o bit SPEN do RCSTA deverá ser activado, de maneira a ligar a porta série;
Se for necessário haver uma interrupção, o bit RCIE do PIE1, e os GIE e PEIE do INTCON deverão ser activados;
Na recepção de 9 bits, o bit RX9 do RCSTA deverá ser activado;
A recepção de dados deverá ser habilitada, activando o bit CREN do RXSTA;
O registo RCSTA deverá ser lido, para tirar a informação de possiveis erros que ocorreram durante a transmisssão. Na recepção a 9 bits, o nono bit estará armazenado neste registo;
O byte recebido e armazenado no registo RCREG, deverá ser lido.
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Activar o modo de Detecção de Endereço:
O baud rate deverá ser ajustado, pelos bits BRGH do registo TXSTA, e BRG16 do registo BAUDCTL, e pelos registos SPBRGH e SPBRG;
O bit SYNC do TXSTA deverá ser limpo, e o bit SPEN do RCSTA deverá ser activado, de maneira a ligar a porta série;
Se for necessário haver uma interrupção, o bit RCIE do PIE1, e os GIE e PEIE do INTCON deverão ser activados;
O bit RX9 do RCSTA deverá ser activado;
O bit ADDEN do RCSTA deverá ser activado, o que habilita que um caracter recebido, seja interpretado como endereço;
A recepção de dados deverá ser habilitada, activando o bit CREN do RXSTA;
Imediatamente após os 9 bits serem recebidos, o bit RCIF do PIR1 é automaticamente activado. Se habil- itada, uma interrupção é gerada;
O registo RCSTA deverá ser lido, para tirar a informação de possiveis erros que ocorreram durante a transmisssão. Na recepção a 9 bits, o nono bit estará armazenado neste registo;
Os 8 bits recebidos e armazenados no registo RCREG, deverão ser lidos. Agora deve ser feita a verifi cação do endereço. Se coincidirem, é necessário limpar o bit ADDEN do RCSTA, o que possibilita a continui- dade da recepção em 8 bits.
•
•
•
•
•
•
•
•
•
Modo Síncrono da EUSART
O módulo MSSP - Master Sínchronous Serial Port, Porta Série Síncrona Mestre, é bastante útil, porque é ao mesmo tempo um dos mais complexos circuitos dentro do microcontrolador. Ele permite comunicações de alta velocidade entre o microcontrolador e periféricos externos, usando algumas linhas de I/O. É comum usá-lo para ligar a ecrãns LCD, conversores A/D, EEPROM’s série, shift-registers, entre outros.
A principal funcionalidade deste tipo de comunicações é a de ser síncrona, e óptimo para sistemas onde há um só Mestre, e um ou mais Escravos. O dispositivo Mestre tem os circuitos necessários para a geração do Baud Rate, e fornece o Relógio para todos os dispositivos do sistema. Os dispositivos Escravos, podem dessa maneira, eliminar o gerador de Relógio interno.
O módulo MSSP funciona das seguintes maneiras:
Modo SPI, Serial Peripheral Interface Modo I2C, Inter-Integrated Circuit
Módulo MSSP
•
•
Como se pode ver na fi gura, um módulo MSSP representa metade do hardware necessário para estabelecer uma comunicação série, enquanto que a outra metade está presente no dispositivo com que se vai trocar a informação. Apesar dos módulos serem iguais em ambos os lados, os seus modos são essencialmente diferentes, dependendo se operam como Mestre ou Escravo:
Se o microcontrolador a ser programado, controla outros dispositivos, então vai funcionar como Mestre.
Um módulo defi nido como tal, vai gerar o relógio quando necessário, e apenas quando informação é en- viada/recebida.
Depende do Mestre, se a ligação é estabelecida, ou não.
Se o microcontrolador a ser programado, é parte de um sistema periférico, então vai funcionar como dis- positivo Escravo. Então, terá sempre de aguardar os pedidos por parte do Mestre.
Modo SPI
O modo de SPI permite o envio/recepção simultânea, de dados de 8 bits, usando 3 linhas I/O;
SDO - Saída de dados série - linha de transmissão;
SDI - Entrada de dados série - linha de recepção;
SCK - Relógio série - linha de síncronização.
Em conjunto com esta linha, se o microcontrolador trocar informação com vários periféricos, a quarta linha, SS, também pode ser usada. Ver fi gura abaixo.
SS - Selecção de Escravo - um pino adicional usado para selecção de dispositivo. Está apenas activo se o micro- controlador está em modo Escravo.
Quando opera em modo SPI, o módulo MSSP usa um total de 4 registos:
SSPSTAT - registo de estado;
•
•
•
SSPCON - registo de controlo;
SSPBUF - registo de armazenamento de dados;
SSPSR - shift register (não disponivel directamente)
Os primeiros três registos são possiveis de escrever/ler, e podem ser alterado a qualquer momento, enquanto que o quarto registo, como não está disponivel, é usado para converter os dados para formato série.
Modo SPI
Como pode ser visto na fi gura abaixo, o cerne do módulo SPI consiste em, dois registos ligados aos pinos para receber, transmitir e sincronizar.
Modo SPI
O Shift Register, SSPRS, é directamente ligado aos pinos do microcontrolador, e usado para transmissão de dados em formato série. O SSPRS tem a sua entrada e saída, e desloca os dados para dentro/fora do disposi- tivo. Por outras palavras, cada bit que aparece na entrada (linha de recepção) simultaneamente empurra outro bit para a saída (linha de transmissão).
O registo SSPBUF, é um bloco de memória para temporariamente armazenar a informação escrita no SSPRS, até que os dados recebidos estejam prontos. Após a recepção dos 8 bits de dados, esse byte é deslocado para o SSPBUF.
Esta dupla memória dos dados recebidos, SSPBUF, permite ao próximo byte ser recebido, antes de ler os dados acabados de receber. Qualquer escrita no SSPBUF durante a transmissão/recepção de dados, é ignorada.
Nomeadamente, se as confi gurações do modo forem esquecidas, a transferência de dados SPI signifi ca que apenas se escreve e lê deste registo. Enquanto que o funcionamento do módulo em si, é automaticamente feito por hardware.
Resumidamente:
Antes de inicializar o SPI, é necessário especifi car certos pontos:
Modo Mestre, o pino SCK é a saída de relógio;
Modo Escravo, o pino SCK é a entrada de relógio;
Fase do bit de entrada, no meio ou no fi m do ciclo de relógio, bit SMP;
Flanco do relógio, bit CKE;
Baud Rate, só no modo Mestre;
Modo de selecção de Escravo, no modo Escravo apenas.
Passo 1
O byte a transmitir, deve ser escrito para a memória temporária SSPBUF.
Imediatamente depois, se o módulo SPI opera em modo Mestre, o microcon- trolador vai automaticamente fazer os passos 2, 3 e 4. Se o módulo SPI opera como Escravo, o microcontrolador não vai fazer nenhum destes passos, até que o pino SCK detectar um sinal de relógio.
•
•
•
•
•
•
Passo 2
Este byte é agora deslocado para o registo SSPSR, e a memória temporária SSPBUF não é limpa.
Passo 3
Sincronizado com o relógio de entrada, este byte é empurrado para o pino de saída, sendo o MSB primeiro, enquanto o registo é simultaneamente preenchido com bits do pino de entrada. No modo Mestre, o microcon- trolador gera o relógio, enquanto o Escravo usa o relógio externo SCK.
Passo 4
O registo SSPSR está preenchido, quando os 8 bits de dados forem recebidos. É indicado activando os bits BF e SSPIF. O byte recebido é automaticamente movido do SSPSR para o SSPBUF.
Como a transferência é feita automaticamente, o programa prin- cipal é normalmente executado, enquanto a transferência está em progresso. Nesse caso, a função do bit SSPIF é gerar uma inter- rupção, quando a transmissão está completa.
Passo 5
Finalmente, o byte armazenado no SSPBUF está pronto a ser usado, e movido para qualquer registo disponivel.
Modo I2C
O modo I2C é especialmente útil quando, o microcontrolador e um circuito integrado com o qual o micro deverá trocar informação, estiverem montados no mesmo sistema. Esta forma de transmissão de dados é co- mum a outros microcontroladores, ou circuitos integrados especializados, tais como memórias, sensores de temperatura, expansores de porta, relógios em tempo-real, etc.
Similarmente ao SPI, a transferência de dados por I2C é síncrona e bidireccional. Desta vez, apenas dois pinos são usados para a transferência de dados. Estes são o SDA, dados série, e o SCL, relógio série. O programador deve confi gurar estes pinos como entradas/saídas, através dos bits do TRISC.
Provavelmente não é directamente perceptivel, mas observando regras particulares (protocolos), este modo possibilita que 122 dispositivos diferentes estajam simultaneamente ligados, usando apenas dois pinos I/O.
Funciona da seguinte maneira; o relógio necessário para sincronizar a operação de ambos os dispositivos, é sempre gerado pelo Mestre. A frequência de relógio mais habitual é de 100KHz, mas não há limite no caso de frequência mínima.
Quando o Mestre e Escravo estão sincronizados com o relógio, toda a troca de dados é sempre iniciada pelo Mestre. Assim que o módulo MSSP está activo, fi ca a aguardar uma condição de Start.
Primeiro, o Mestre envia o bit de Start, depois o endereço de 7 bits do Escravo, e fi nalmente o bit que especifi ca se vai ler ou escrever no Escravo. A seguir ao bit de Start, os oito bits são enviados para o registo SSPSR.
Todos os Escravos partilham a linha de transmissão, e vão simultaneamente receber o primeiro byte, mas apenas um deles tem o endereço coincidente.
Depois do primeiro byte ter sido enviado, o Mestre entra em modo de recepção, e aguarda o ACK - Acknowl- edge (confi rmação) do Escravo com o endereço coindicente. Se o Escravo envia um ACK lógico 1, a transferên- cia vai continuar até o Mestre enviar o bit de Stop.
Esta é uma simples explicação de como dois dispositivos comunicam. Se necessário, este microcontrolador é capaz de controlar situações mais complicadas, onde 1024 dispositivos diferentes, partilhados por diferentes Mestres, estão ligados.
Transferência de Dados
A fi gura em baixo, mostra o diagrama de blocos do módulo MSSP no modo I2C:
Diagrama de blocos do módulo MSSP, em modo I2C
O módulo usa estes registos, para trabalhar em I2C.
SSPCON - registo de controlo 1 SSPCON2 - registo de controlo 2 SSPSTAT - registo de estado
SSPBUF - registo de memória temporária para transmissão/recepção SSPSR - registo Shift-Register (não directamente acessível)
SSPADD - registo de endereço SSPMSK - registo de máscara.
•
•
•
•
•
•
•
Registo SSPSTAT
SMP - Bit de amostragem
Modo SPI Mestre, este bit indica a fase dos dados 1 - O estado lógico é lido no fi m do ciclo de relógio, 0 - O estado lógico é lido no meio do ciclo de relógio.
Modo SPI Escravo. Este bit deve estar limpo, quando se usa SPI Escravo Modo I2C, Mestre ou Escravo
1 - Slew Rate - Controlo de interferências desligado, para velocidades de 100KHz;
0 - Slew Rate - Controlo de interferências ligado, para velocidades de 400KHz ou maiores.
CKE - Bit de selecção do fl anco de relógio CKP=0:
1 - Os dados são transmitidos no fl anco ascendente;
0 - Os dados são transmitidos no fl anco descendente.
CKP=1:
1 - Os dados são transmitidos no fl anco descendente.
0 - Os dados são transmitidos no fl anco ascendente;
D/A - bit de Dados/Endereço, é usado no modo I2C apenas 1 - Indica que o último byte recebido ou transmitido, foi de dados;
0 - Indica que o último byte recebido ou transmitido, foi de endereço.
P - O bit de Stop, é usado no modo I2C apenas 1 - O Stop bit foi detectado;
•
•
•
•
•
•
•
0 - O Stop bit não foi detectado;
S - Bit de Start, é usado no modo I2C apenas 1 - O bit de Start foi detectado;
0 - O bit de Start não foi detectado;
R/W - Bit de Escrita/Leitura, usado em I2C apenas. Este bit guarda a informação R/W a seguir ao endereço.
Só é válido desde a coincidência de endereço, até ao próximo bit de Start, Stop ou não-ACK.
I2C Escravo:
1 - Ler dados;
0 - Escrever dados.
I2C Mestre:
1 - Transmissão em progresso;
0 - Transmissão parada.
UA - Bit de refrescamento do endereço. É usado no modo de 10 bits de I2C.
1 - Indica que é necessário fazer o refrescamento do endereço no registo SSPADD;
0 - O endereço no SSPADD está correcto, e não precisa de ser refrescado.
BF - Bit de estado do Buff er - memória intermédia temporária Durante a recepção em SPI ou I2C:
1 - Recepção completa. O SSPBUF está completo;
0 - Recepção não completa. O SSPBUF está vazio.
Durante a transmissão em SPI ou I2C:
1 - Transmissão de dados em andamento (não inclui os bits ACK e STOP);
0 - Transmissão de dados completa (não inclui os bits ACK e STOP).
Registo SSPCON
WCOL - bit de detecção de Colisão de Escrita
1 - Colisão detectada. Uma escrita para o SSPBUF foi tentada, enquanto que a condição I2C não era válida para uma transmissão se iniciar;
0 - Não houve colisão.
SSPOV - Bit indicador de “Overfl ow” de Recepção
1 - Um novo byte foi recebido, enquanto o SSPSR continha o byte anterior. Como não há espaço para a recep- ção dos dados, um destes dois bytes deve ser limpo. Neste caso, o byte dentro do SSPSR é perdido;
0 - Dados série correctamente recebidos.
SSPEN - Bit que habilita a porta série síncrona, e inicializa o módulo MSSP:
No modo SPI:
1 - Liga módulo MSSP e confi gura os pinos SCK, SDO, SDI e SS, para a porta série;
0 - Desliga módulo MSSP e confi gura estes pinos como portas I/O.
No modo I2C:
1 - Liga módulo MSSP e confi gura os pinos SDA e SCL, para a porta série;
0 - Desliga módulo MSSP e confi gura estes pinos como portas I/O.
CKP - Bit de selecção da polaridade do Relógio, não usado em I2C Mestre No modo SPI:
1 - Modo de descanso para o relógio, é nível lógico alto;
0 - Modo de descanso para o relógio, é nível lógico baixo.
No modo I2C Escravo:
1 - Habilita o relógio;
0 - Mantém o relógio a estado lógico 0, para dar mais tempo à estabilização dos dados.
SSPM3-SSPM0 - Bits de selecção da porta série Síncrona. O modo é defi nido por estes três bits:
SSPM3 SSPM2 SSPM1 SSPM0 Mode
0 0 0 0 SPI Mestre, clock = Fosc/4
0 0 0 1 SPI Mestre, clock = Fosc/16
0 0 1 0 SPI Mestre, clock = Fosc/64
0 0 1 1 SPI Mestre, clock = (saída TMR)/2
0 1 0 0 SPI Escravo, pino SS de controlo ligado
0 1 0 1 SPI Escravo, pino SS de controlo desligado, SS pode ser
usado como pino I/O
0 1 1 0 I²C Escravo, endereço de 7-bit usado
0 1 1 1 I²C Escravo, endereço de 10-bit usado
1 0 0 0 I²C Mestre, clock = Fosc / [4(SSPAD+1)]
1 0 0 1 Máscara usada no modo I²C Escravo
1 0 1 0 Não usado
1 0 1 1 Modo controlado I²C Mestre
1 1 0 0 Não usado
1 1 0 1 Não usado
1 1 1 0 I²C Escravo, endereço de 7-bit usado, bits START e STOP activam a interrupção
1 1 1 1 I²C Escravo, endereço de 10-bit usado, bits START e STOP activam a interrupção
Registo SSPCON2
GCEN - Bit de habilitação de Chamada Geral No modo I2C Escravo apenas:
1 - Habilita uma interrupção, quando uma chamada geral de endereço 0x000 é recebida no SSPSR;
0 - Chamada geral de endereço desligado.
ACKSTAT - Bit de estado de ACKnowledge - confi rmação No modo I2C Mestre transmissão apenas:
1 - ACK não foi recebido do Escravo;
0 - ACK foi recebido do Escravo.
ACKDT - Bit de ACKnowledge No modo I2C Mestre recepção apenas:
1 - Não houve ACK;
0 - Houve ACK.
ACKEN - Bit de habilitação de ACKnowledge No modo I2C Mestre recepção apenas:
1 - Inicia condição ACK nos pinos SDA e SCL, e transmite bit ACKDT. É automaticamente limpo por hardware;
0 - Condição ACK não iniciada.
RCEN - Bit habilitação da Recepção No modo I2C Mestre apenas:
1 - Possibilita a recepção no modo I2C;
0 - Recepção desligada.
PEN - Bit de habilitação da condição de STOP No modo I2C Mestre apenas:
1 - Inicia uma condição de STOP nos pinos SDA e SCL. Seguidamente, este bit é automaticamente limpo por hardware;
0 - Condição de STOP não iniciada.
RSEN - Bit de habilitação da condição de Repetição de START No modo I2C Mestre apenas:
1 - Inicia uma condição de START nos pinos SDA e SCL. Seguidamente, este bit é automaticamente limpo por hardware;
0 - A repetição de START não é iniciada.
SEN - Bit de habilitação de condição de START ligada/prolongada (Enabled/Stretch) No modo I2C Mestre apenas:
1 - Inicia uma condição de START nos pinos SDA e SCL. Seguidamente, este bit é automaticamente limpo por hardware;
0 - A condição de START não é iniciada.
I2C em modo Mestre
O caso mais comum é quando o microcontrolador funciona como Mestre, e os periféricos como Escravos. Esta é a razão de apenas se falar aqui deste modo. Também se vai considerar que o endereço é de 7 bits, e o sistema electrónico só tem um microcontrolador, ou um só mestre.
De maneira a ligar o módulo MSSP neste modo, é necessário fazer o seguinte:
Confi gurar o Baud Rate, registo SSPADD;
Confi gurar o Slew Rate - Controlo de interferências, bit SMP no registo SSPSTAT;
Seleccionar o modo, registo SSPCON.
Depois destes passo feitos, e do módulo ter sido ligado pelo bit SSPEN do SSPCON, deverá esperar-se pela electrónica interna indicar que está pronta para transmissão: bit SSPIF do registo PIR1 activado.
Este bit deverá ser limpo por software, e seguidamente o microcontrolador está pronto a iniciar uma comuni- cação com os periféricos.
•
•
•
I2C em modo Mestre
Transmissão de dados no modo I2C Mestre
Cada condição de relógio no pino SDA, é iniciado com estado lógico 0, que aparece após ligar o bit SEN do SSPCON2. Mesmo depois de ligar, o microcontrolador aguarda um momento antes de iniciar a comunicação.
É a chamada Condição de Start, durante a qual há estabilização interna da electrónica. Se todas as condições satisfazerem, o bit SSPIF do PIR1 é activado, e a transferência de dados é iniciada, assim que o registo SSP- BUF for carregado com um byte.
Como só um máximo de 112 dispositivos podem partilhar a mesma linha de transmissão, o primeiro byte enviado contém o endereço de apenas um Escravo. Cada compo- nente tem o seu endereço escrito no próprio datasheet. O oitavo bit deste primeiro byte, especifi ca se o Mestre vai enviar ou receber dados. Neste caso vai-se receber infor- mação, e o oitavo bit deverá ser lógico 0.
Quando o endereço coincide, o microcontrolador tem de esperar pelo bit de ACK. O Escravo con- fi rma o endereço, limpando o bit ACKSTAT do SSPCON2. Se houver coincidência de endereço, todos os bytes serão enviados da mesma forma.
A transmissão de dados termina activando o bit SEN do SSPCON2. A condição de STOP ocorre, o que possibilita o pino SDA a receber a condição: Start - Endereço - ACK - Dados - ACK ... Dados - ACK - Stop.
Recepção de dados no modo I2C Mestre
A preparação para a recepção de dados, é similar à de transmissão de dados, com a excepção de que, o último bit do byte de endereço, é lógico 1. Especifi ca que o Mestre espera receber informação do Escravo endereçado.
O seguinte vai ocorrer:
Depois da preparação interna terminar e do bit START ser activado, o Escravo dá início ao envio de um byte de cada vez. Estes bytes são armazenados no registo SSPSR. Cada byte é carregado para o SSPBUF, de onde pode ser lido. Ao ler este registo, o bit ACK é automaticamente enviado, signifi cando que o Mestre está pronto para receber novo byte.
No fi nal, a recepção de dados termina activando o bit STOP:
Recepção de dados no modo I2C Mestre
Start - Endereço - ACK - Dados - ACK .... Dados - ACK - Stop.
É desta maneira que o ACK é enviado ao Escravo.
Gerador de Baud Rate
De maneira a sincronizar as comunicações, todos os eventos no pino SDA devem ser síncronizados com o relógio gerado no Mestre. Este relógio é gerado por um simples oscilador, em que a frequência depende do oscilador principal do microcontrolador, do valor escrito no registo SSPADD e do modo corrente de SPI e I2C.
A frequência de relógio dos modos descritos neste manual, dependem do cristal de quartzo e do registo SSPADD. A fórmula usada para a calcular está na fi gura abaixo:
Gerador de Baud Rate
Quando o microcontrolador comunica com os periféricos, pode acontecer que a transferência de dados falha por alguma razão. Neste caso, é recomendada a verifi cação do estado de alguns bit, que podem ajudar a clari- fi car o problema. Na prática, o estado destes bits é verifi cado através da execução de uma subrotina, depois da transmissão/recepção de um byte.
WCOL - SPCON,7 - Se se tentar escrever um novo byte para o SSPBUF, enquanto estiver em progresso uma transmissão/recepção, o bit WCOL vai ser activado e o conteúdo do SSPBUF mantém-se inalterado. A escrita não ocorre e, depois disto, o WCOL deverá ser limpo por software.
BF - SSPSTAT,0 - No modo de transmissão, este bit é activado quando o CPU escreve para o SSPBUF, e mantém-se activo enquanto o byte é deslocado para fora do registo SSPSR. No modo de recepção, este bit é activado quando um byte é carregado para o SSPBUF. É limpo quando o SSPBUF é lido.
SSPOC - SSPCON,6 - No modo de recepção, este bit é activado quando um novo byte é recebido pelo SSPSR, quando o byte anterior ainda não foi lido do SSPBUF.
Pinos SDA e SCL - Quando o módulo SSP está activo, estes pinos transformam-se em saídas Open Drain (Dreno Comum). Signifi ca que, estes pinos, devem ser ligados a resistências de Pull-Up (entre o pino e o terminal positivo da alimentação).
Resistências de saída para os Drenos Abertos dos Transistores internos
Resumidamente:
De maneira a estabelecer uma comunicação série no modo I2C, o seguinte tem que ser tomado em conta:
Ajustar o modo e enviar o endereço:
O valor que determina o Baud Rate, deve ser escrito para o registo SSPADD
Slew Rate - Controlo de interferências, deve ser desligado, limpando o bit SMP do registo SSPSTAT De modo a escolher modo Mestre, o valor binário 1000 deverá ser escrito nos bits SSPM3-SSPM0 do registo SSPCON
O bit SEN do registo SSPCON2 deverá ser activado - Condição START
O bit SSPIF é automaticamente activado no fi m do START, quando o módulo está pronto a funcionar.
Deverá ser limpo por software
O endereço do Escravo deverá ser escrito para o SSPBUF
Quando o byte é enviado, o bit SSPIF é automaticamente activado quando o ACK é recebido do Escravo.
Transmissão de dados:
Os dados a enviar, deverão ser carregados no SSPBUF
Quando o byte é enviado, o bit SSPIF é automaticamente activado quando o ACK é recebido do Escravo De maneira a informar o Escravo que a transmissão está completa, uma condição de STOP deverá ser iniciada, activando o bit PEN no SSCON.
Recepção de dados:
De maneira a ligar a recepção de dados, o bit RSEN do SSPCON2 deverá ser activado
O bit SSPIF assinala a recepção de um byte. Quando o byte é lido do SSPBUF, o bit ACKEN do SSP- CON2 deverá ser activado, de maneira a enviar o bit de ACK
De maneira a informar o Escravo que a transmissão está completa, uma condição de STOP deverá ser iniciada, activando o bit PEN no SSCON.
•
•
•
•
•
•
•
•
•
•
•
•
•