HOME PROJETOS PROGRAMAÇÃO |
Alguns microcontroladores PIC, como 16F73, 16F877A, 18F4520, 18F4550, 18F4620 e outros, possuem o módulo MSSP ou SSP, sigla que significa "Master Synchronous Serial Port", uma interface serial sincrona de 8 bits que serve para a comunicação com outros periféricos ou outros microcontroladores. Conforme o data sheet dos microcontroladores que possuem esse módulo, alguns dispositivos externos que usam essa interface de comunicação podem ser memórias EEPROM, shift registers, displays e conversores analógico/digitais.
O módulo MSSP pode se comunicar nos modos I2C (Inter-Integrated Circuit) ou SPI (Serial Peripheral Interface). Veremos aqui somente o modo SPI que é a mais simples de todas.
Basicamente, o modo SPI usa tres fios ou sinais para fazer a comunicação entre dois dispositivo que são:
|
FIGURA 1 - Conexões entre dispositivos SPI
Como se pode observar na figura 1, retirada do data sheet o microcontrolador PIC18F4520, os tres sinais são usados tanto no MASTER como no SLAVE, sendo que o sinal SDI do MASTER deve ser conectado ao SDO do SLAVE, o SDI do SLAVE ao SDO do MASTER e os sinais SCK, tanto do MASTER como do SLAVE, devem ser conectados entre si.
Além dos sinais descritos acima, o dispositivo SLAVE poderá usar um quarto sinal conhecido como SS ou Slave Select que permite ao MASTER selecionar qual dispositivo SLAVE esta sendo endereçado para a comunicação. Esse sinal é útil quando o MASTER necessita se comunicar com vários SLAVES. Normalmente, quando só existe um SLAVE no circuito, não é necessário usar esse sinal. O sinal SS, quando usado, deverá ter nível baixo para o dispositivo SLAVE selecionado e nível alto para dispositivos SLAVEs não selecionados.
A primeira regra para operar no modo SPI é que, apenas um dos dispositivos funcionará como MASTER enquanto o outro funcionará como SLAVE. É necessário citar que mais de um escravo pode participar do circuito mas, para selecionar qual deles deve se comunicar com o MASTER, o software deve manter controle sobre os sinais de seleção SS já citado acima.
Outra regra fundamental, que se aplica ao modo SPI, é que uma comunicação é sempre iniciada e mantida pelo MASTER. Um dispositivo SLAVE nunca inicia uma comunicação.
Tres registradores são usados para configurar e operar o modo SPI:
O registrador SSPSTAT que pode ser visto na figura 2.
O registrador SSPCON1 na figura 3.
O registrador SSPBUF onde o dado é colocado para ser transmitido ou onde o dado é recebido.
No registrador SSPSTAT temos apenas tres bits de interesse:
O bit SMP que, em modo SLAVE não é usado mas que em modo MASTER configura em que ponto do sinal de clock SCK o dado deve ser obtido; no meio do sinal (SMP=0) ou no fim do sinal (SMP=1).
O bit CKE indica, nos dois modos (MASTER e SLAVE), quando a transmissão/recepção deve ocorrer, isto é, na transição de clock Idle-->Act ou Act-->Idle (ver bit CKP do registrador SSPCON1).
O bit BF que indica que o buffer esta completo após uma transmissão/recepção.
FIGURA 2 - Registrador SSPSTAT
O registrador SSPCON1 configura outras características no modo SPI e os bits de interesse são:
O bit SSPEN que liga e desliga o módulo SSP.
O bit CKP que define a polaridade do clock. Se CKP=0 o Idle state será nível baixo e se CKP=1 o Idle state será nível alto.
Os bits SSPM3 a SSPM0 configuram o dispositivo em modo MASTER em suas diversas modalidades de clock e o modo SLAVE com ou sem o sinal de seleção SS (ver figura 3).
FIGURA 3 - Registrador SSPCON1
A tabela abaixo mostra como devem ser escolhidos os valores de configuração desses registradores dependendo do tipo de dispositivo que esta sendo programado (Master ou Slave).
REGISTRADOR | BIT | M A S T E R | S L A V E | D E S C R I Ç Ã O |
---|---|---|---|---|
SSPSTAT | SMP | 0,1 | sempre 0 | Amostragem no meio ou no fim do tempo |
CKE | 0,1 | 0,1 | Amostragem de Idle-->Act ou Act-->/Idle | |
SSPCON1 | WCOL | 0 | 0 | Sem colisão | SSPOV | 0 | 0 | Sem overflow | SSPEN | 0,1 | 0,1 | Habilita/Desabilita módulo SPI | CKP | 0,1 | 0,1 | Clock Idle Low/High | SSPM3 | 0000 - Fosc/4 | 0100 - com SS | Esses bits definem o modo Master ou Slave |
SSPM2 | 0001 - Fosc/16 | 0101 - sem SS | SSPM1 | 0010 - Fosc/64 | - | SSPM0 | 0011 - TMR2 | - |
Observar que os bits SSPSTAT<CKE> e SSPCON1<CKP> sempres devem ser configurados com as mesmas características tanto no MASTER como no SLAVE.
O mecanismo de comunicação é bem simples conforme mostra a figura 1. Toda vez que o MASTER coloca um byte no registrador SSPBUF, esse byte será automaticamente enviado pela porta SDO, através do shift register SSPSR, começando pelo MSB e recebido no SLAVE pela porta SDI. O sinal de clock SCK é controlado pelo MASTER.
Antes de iniciar uma transferência o MASTER deve, em primeiro lugar, deixar o sinal SCK no seu estado IDLE, isto é, se o bit SSPCON1<CKP> foi configurado com o valor 0, o sinal SCK deverá ser baixo, caso contrário deverá ser alto. O dispositivo MASTER inicia a transmissão colocando um byte no registrador SSPBUF e, em seguida verifica se o bit PIR1<SSPIF> foi ligado indicando uma resposta do SLAVE. Verifica, também, se o bit SSPSTAT<BF> foi ligado indicando que o registrador SSPBUF contem um dado completo. Se essas condições forem verificadas, então a operação terminou com sucesso.
Uma vez configurado e habilitado no modo SPI, o dispositivo SLAVE deve permanecer verificando o bit SSPSTAT<BF> para saber se um byte chegou. O SLAVE pode, também, usar a interrupção do módulo SSP para executar a mesma função. Cada bit recebido pelo SLAVE na porta SDI entrará no registrador SSPSR pelo LSB. O SLAVE, então, "empurrará" de volta ao MASTER, o bit MSB contido no seu próprio registrador SSPSR antes da comunicação ser iniciada. Quando os 8 bits forem recebidos, o conteúdo do registrador SSPSR será copiado para o registrador SSPBUF e os bits PIR1<SSPIF> e SSPSTAT<BF> serão ligados e o dispositivo poderá retirar o dado do registrador SSPBUF.
Em ambos os dispositivos, o bit SSPSTAT<BF> é desligado assim que o registrador SSPBUF é lido por uma instrução como movf SSPBUF,w mas o bit PIR1<SSPIF> deve ser desligado pelo software.
Abaixo vemos dois exemplos escritos em linguagem assembler para configurar e usar os dispositivos MASTER e SLAVE em dois microcontroladores PIC18F4620. Os microcontroladores podem ser substituidos à vontade por qualquer outro da família 18F em que os pinos de I/O do módulo SSP estejam no PORTC. Digo isso porque no chip PIC18F4550 esses pino estão em portas diferentes. Para compilar os programas para outros microcontroladores basta substituir seus nomes nas diretivas abaixo:
LIST P=18F4620 #include <P18F4620.INC> |
Para fazê-los funcionar, monte o circuito de teste do arquivo "schematic.png" e baixe os arquivos necessários seguindo as instruções fornecidas em cada exemplo. Apesar dos microcontroladores mostrados no esquema serem PIC18F4520 não há diferença de pinagem para o PIC18F4620 sendo que o circuito pode ser montado tranquilamente para esse microcontrolador. Os microcontroladores podem usar cristais de até 20MHz.
EXEMPLO 1 - PROGRAMA NO DISPOSITIVO MASTER |
---|
Baixe o código fonte que se encontra no arquivo "spi_master.asm" para poder alterá-lo se assim desejar. Se preferir, grave o arquivo "spimstrsimp.hex" diretamente no dispositivo MASTER. |
/* Esse codigo lista o arquivo "spi_master.asm" substituindo "<" por "<" e ">" por ">" */
$mypath = "spi_master.asm";
$DD1 = fopen($mypath,"r") or die("ERRO ABRINDO ARQUIVO ".$mypath);
echo " \n"; while (!feof($DD1)) { $ln = fgets($DD1); $ln = str_replace("<","<",$ln); $ln = str_replace(">",">",$ln); echo $ln; } fclose($DD1); echo " \n"; ?> |
EXEMPLO 2 - PROGRAMA NO DISPOSITIVO SLAVE |
---|
Baixe o código fonte que se encontra no arquivo "spi_slave.asm" para poder alterá-lo se assim desejar. Se preferir, grave o arquivo "spislvsimp.hex" diretamente no dispositivo SLAVE. |
/* Esse codigo lista o arquivo "spi_slave.asm" substituindo "<" por "<" e ">" por ">" */
$mypath = "spi_slave.asm";
$DD1 = fopen($mypath,"r") or die("ERRO ABRINDO ARQUIVO ".$mypath);
echo " \n"; while (!feof($DD1)) { $ln = fgets($DD1); $ln = str_replace("<","<",$ln); $ln = str_replace(">",">",$ln); echo $ln; } fclose($DD1); echo " \n"; ?> |
A interface SPI com certeza é muito simples de usar porém, para permitir segurança na troca de dados entre os dispositivos, o programador deve desenvolver um tipo de protocolo para saber se os dados realmente chegaram onde deviam. Quando se trabalha com dispositivos como, por exemplo, cartões de memória SD Card que possuem um protocolo próprio, deve-se ler o data sheet do dispositivo para saber como este responde aos comandos enviados pelo MASTER. Assim, cada dispositivo externo tem seu próprio protocolo que deve ser estudado antes de começar a programar. Além disso, aqui não foi estudado o assunto sobre interrupções do módulo MSSP. Isso deixaremos para uma próxima ocasião ou você pode tentar por si mesmo.
Bons estudos...
H P S P I N Desde 04 de Março de 2010 Atualização: 08 de Oct de 2024 |