Escolar Documentos
Profissional Documentos
Cultura Documentos
MICROPROCESSADORES
Tutorial - Mdulo MSSP
Introduo
O mdulo MSSP (Master Synchronous Serial Port) outro mdulo de comunicao srie presente no microcontrolador PIC18F4520 e que permite a implementao de protocolos de comunicao srie sncronas entre dispositivos. Neste tutorial sero abordadas as comunicaes sncronas entre um microcontrolador PIC18F4520 e um dispositivo externo, utilizando para tal o mdulo MSSP. Existem vrios protocolos de comunicao sncrona de baixo nvel, dos quais os mais conhecidos e utilizados em sistemas com microcontroladores so: I2C (Philips Semiconductors); SPI (Motorola); Microwire (National Semiconductor); 1-Wire Bus (Dallas Semiconductor)
O mdulo MSSP do microcontrolador PIC permite o funcionamento tanto no modo de comunicao I2C como no modo SPI, sendo que estes dois modos de comunicao srie sncronas so os mais comummente utilizados.
Pgina 1 de 33
O protocolo de comunicao I2C (Inter-Integrated Circuit), desenvolvido originalmente como meio de comunicao entre dispositivos de reduzido dbito e velocidade de comunicao, utilizado quando a distncia entre microcontroladores e os diversos dispositivos ligados no barramento curta, ou seja, quando o transmissor e receptor esto normalmente na mesma placa de circuito impresso. A ligao estabelecida atravs de dois condutores: Um condutor para transferncia de dados, denominado por SDA; Um condutor para sincronizao da comunicao (sinal de relgio), denominado de SCL; Como pode ser observado na Figura 1, que representa uma ligao tpica de dispositivos num barramento I2C, existe sempre um dispositivo mestre (master) que responsvel por iniciar as operaes de transferncia de dados no barramento.
Cada dispositivo escravo (slave) no barramento identificado atravs de um endereo nico, que deve ser referenciado pelo mestre para identificar o dispositivo de destino da comunicao. Assim sendo, o dispositivo mestre dever iniciar a transferncia de dados enviando o endereo de um dos dispositivos escravos com o qual quer comunicar, e s depois a comunicao pode comear. O protocolo de comunicao I2C especifica 7 bits para endereamento de dispositivos escravos, sendo que 16 desses endereos so reservados. Desta forma, podero existir no mesmo barramento I2C at 112 dispositivos diferentes, sendo um dispositivo mestre (microcontrolador, processador, etc.) e 111 dispositivos escravos.
Pgina 2 de 33
Desde a criao do protocolo I2C pela Philips Semiconductors em 1982, foram adicionadas algumas revises s especificaes originais, incluindo alteraes nas velocidades de comunicao permitidas. Assim, o I2C pode funcionar em compatibilidade com um dos seguintes modos: Modo low-speed, que permite ligaes at 10 kbps; Modo Standard, que permite ligaes at 100 kbps; Modo Fast, introduzido pela reviso 1.0 (primeira reviso como um protocolo de facto) em 1992, que permite ligaes at 400 kbps. Esta reviso introduziu igualmente a possibilidade de utilizao de 10 bits para endereamento de dispositivos, permitindo assim um total de 1008 dispositivos interligados atravs do bus I2C; Modo High-Speed, introduzido em 1998 com a reviso 2.0 da especificao do protocolo, que permite velocidades de comunicao at 3.4Mbps. Dada a existncia de apenas uma linha para a transferncia de dados (a outra linha contm o sinal de relgio da comunicao), a comunicao num barramento I2C half-duplex, ou seja, os dados no podem ser enviados e recebidos simultaneamente. A distncia entre os dispositivos que comunicam atravs de I2C est limitada a poucos metros pois a capacidade total do bus est limitada a 400pF.
O protocolo de comunicao SPI (Serial Peripheral Interface) um protocolo de comunicao srie sncrona desenvolvido pela Motorola destinado a interligar diversos dispositivos com elevado dbito de dados, ou seja, que requeiram elevadas velocidades de comunicao. A Figura 2 apresenta um exemplo da implementao de um barramento SPI para comunicao entre diversos dispositivos.
Pgina 3 de 33
De uma forma semelhante ao protocolo I2C, o protocolo SPI tambm se caracteriza por ter uma implementao do tipo master-slave, ou seja, no barramento dever existir sempre um dispositivo que coordene e inicie as transferncias de dados com os dispositivos escravos. A comunicao entre dispositivos num bus SPI utiliza at quatro condutores diferentes, nomeadamente: Um condutor para a linha de recepo de dados (SDI ou MISO); Um condutor para a transmisso de dados (SDO ou MOSI); Um condutor para sincronizao (sinal de relgio) (SCK); Uma linha dedicada para seleccionar o dispositivo escravo com o qual se quer comunicar (CS ou SS). Assim sendo, a seleco do dispositivo escravo envolvido na comunicao no feita por endereo, tal como no protocolo I2C, mas sim atravs de uma linha dedicada de chip select para cada dispositivo. O protocolo de comunicao SPI tem a caracterstica de permitir comunicaes em full-duplex, dado que existem linhas dedicadas para a transmisso e para a recepo, permitindo assim a transmisso e recepo de dados em simultneo. As velocidades de comunicao num barramento SPI so, por definio, velocidades elevadas, podendo ser utilizadas frequncias de relgio at 70 MHz (taxa de transferncia de 70 Mbps). Contrariamente ao protocolo I2C, o protocolo SPI no define modos standard de comunicao e/ou velocidades; assim sendo, o factor limitativo para a velocidade de comunicao a velocidade mxima suportada pelo dispositivo escravo utilizado.
2
Pgina 4 de 33
Uma das caractersticas mais interessantes do protocolo SPI reside na possibilidade de configurao da polaridade e fase do sinal de relgio, que define a forma como os dados so interpretados e amostrados no barramento, flexibilizando assim a especificao da comunicao entre o mestre e os dispositivos escravos. Estas configuraes, denominadas por CPOL (Clock Polarity) e CPHA (Clock Phase), definem respectivamente o valor lgico de base para a linha de relgio e a ordem de amostragem e transmisso dos dados em funo das transies na linha de relgio. Se CPOL = 0, a base da polaridade da linha de relgio o valor lgico 0, e: o Se CPHA = 0, a amostragem dos dados para leitura feita no flanco ascendente do relgio, e a transmisso no flanco descendente; o Se CPHA = 1, ento a amostragem dos dados para leitura feita no flanco descendente e a transmisso no flanco ascendente; Se CPOL = 1, a base da polaridade da linha de relgio o valor lgico 1, e: o Se CPHA = 0, a leitura feita no flanco descendente e a transmisso no flanco ascendente; o Se CPHA = 1, ento a leitura feita no flanco ascendente e a transmisso no flanco descendente; Estas variantes de configurao definem o que normalmente denominado por modo SPI e que correspondem s seguintes configuraes: Modo SPI Modo 0 Modo 1 Modo 2 Modo 3 CPOL 0 0 1 1 CPHA 0 1 0 1
O mdulo MSSP (Master Synchronous Serial Port) um dos mdulos de funcionamento mais complexos presentes no microcontrolador PIC18F4520. Este mdulo permite a implementao Tutorial - Mdulo MSSP Pgina 5 de 33
de protocolos de comunicao sncrona entre microcontroladores ou com dispositivos perifricos a velocidades elevadas, utilizando poucas linhas de I/O (no mximo duas ou trs, dependendo do protocolo utilizado). Logo, este mdulo vulgarmente utilizado para ligar o microcontrolador a displays LCD, conversores A/D ou D/A, memrias EEPROM srie, entre outros. A principal caracterstica deste tipo de comunicao reside no facto de esta ser sncrona, e como tal, adequada para utilizao em sistemas com um nico mestre e um ou mais escravos. O dispositivo mestre contm a electrnica necessria para gerar o relgio da comunicao a uma taxa (baud rate) definida, que assim ser utilizada na transferncia de dados com os dispositivos escravos, que por consequncia no necessitam de gerar o sinal de relgio para sincronizao na comunicao. O mdulo MSSP tem dois modos de operao, que correspondem simultaneamente implementao de dois protocolos de comunicao distintos: Modo SPI (Serial Peripheral Interface); Modo I2C (Inter-Integrated Circuit);
No caso do microcontrolador PIC18F4520 existe um mdulo MSSP, que para a sua operao faz uso das seguintes linhas de I/O: Pino RC3 RC4 RC5 Funo (SPI) SCK (linha de relgio) SDI (linha de entrada) SDO (linha de sada) Funo (I2C) SCL (linha de relgio) SDA (linha de dados) No utilizado
Na Figura 3 est representado o mdulo MSSP do microcontrolador PIC18F4520 e a sua utilizao nos dois modos de comunicao. Mesmo que os dispositivos Processor 1 e Processor 2 sejam iguais, a sua configurao diferente, sendo que um mestre e o outro escravo na comunicao.
Pgina 6 de 33
Figura 3 Funcionamento do mdulo MSSP nos modos de comunicao SPI e I2C, respectivamente3
Se o microcontrolador controlar outro microcontrolador, dispositivo ou circuito perifrico, ento dever ser configurado como mestre. O microcontrolador mestre ir gerar o sinal de relgio quando necessrio, ou seja, quando estiver a receber ou a transmitir dados. O mestre tambm controla o estabelecimento da ligao entre os dispositivos. Caso o microcontrolador assuma um papel de perifrico de algum outro dispositivo, como por exemplo um PC ou um processador mestre, ento este dever ser configurado como escravo. Na configurao de escravo o microcontrolador tem de esperar pela solicitao de transferncia de dados para efectuar qualquer comunicao, solicitao esta que deve sempre partir do mestre.
As operaes de configurao e controlo do mdulo MSSP so realizadas atravs de 3 registos de configurao distintos, que so: SSPCON1 (MSSP Control Register 1):
O registo SSPI1CON o principal registo de controlo do mdulo MSSP, permitindo, entre outros:
Pgina 7 de 33
Definir o modo de funcionamento para o mdulo MSSP, atravs dos bits SSPM3:SSPM0;
O registo SSPCON2 exclusivo para o modo de funcionamento em I2C, e permite: Iniciar as ordens de Start, Repeated Start, Stop, e Acknowledge; Habilitar a recepo de dados;
Registo SSPCON2 CGEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN
O registo SSPSTAT possui algumas flags de estado para monitorizao do estado da comunicao no mdulo MSSP, tais como: Estado do buffer de transmisso/recepo interno; Estado da comunicao (transmisso em progresso); Bits de controlo do slew rate e ajuste do funcionamento para SMBus;
Registo SSPSTAT SMP CKE D/*A P S R/*W UA BF
Para uma melhor informao sobre a funo dos registos e das flags associadas, consulte o datasheet do microcontrolador PIC18F4520, nomeadamente a seco 17 Master Synchronous Serial Port (MSSP) Module. Adicionalmente, e para a correcta operao do mdulo MSSP, so utilizados dois registos auxiliares operao, que so:
Pgina 8 de 33
Registo SSPADD, que utilizado apenas no modo de funcionamento I2C e que toma as seguintes funes: o Se o microcontrolador est configurado como dispositivo mestre, o registo SSPADD implementa o gerador de relgio que define a velocidade de comunicao; o Se o microcontrolador est configurado como dispositivo escravo, o registo SSPADD definir o endereo escravo do microcontrolador no bus I2C;
O modo de funcionamento SPI, tal como o nome indica, implementa o protocolo de comunicao srie SPI, permitindo assim a transmisso e recepo simultnea de 8 bits de dados utilizando 3 linhas de I/O do microcontrolador: SDO - Serial Data Out linha de transmisso; SDI - Serial Data In- linha de recepo; SCK - Serial Clock linha de sincronismo (linha de relgio);
Se o microcontrolador comunicar com diversos dispositivos perifricos (escravos), ento dever ser utilizada uma linha adicional (linha SS - Slave Select) por cada dispositivo escravo: SS - Slave Select linha adicional utilizada para seleco do dispositivo escravo com o qual se vai estabelecer a comunicao. Esta linha (uma por dispositivo escravo) apenas est activa (tipicamente, asserida a 0) quando o microcontrolador mestre deseja comunicar com o respectivo dispositivo escravo.
Pgina 9 de 33
Quando a operar em modo SPI, o funcionamento do mdulo MSSP regido por 4 registos: SSPSTAT - Status Register - registo de estado; SSPCON1 - Control Register - registo de controlo; SSPBUF Buffer Register registo de armazenamento; SSPSR - Shift Register (no est directamente acessvel).
Os trs primeiros registos enunciados so registos onde permitida a escrita e a leitura, sendo que estes registos podem ser alterados a qualquer momento. O quarto registo, o registo SSPSR, implementa o deslocador paralelo-srie (ou srie-paralelo na recepo), e usado para converter dados paralelos no formato srie, e vice-versa. Tal como pode ser observado na Figura 5, a transferncia de dados no mdulo SPI implementada essencialmente por dois registos, que esto directamente relacionados com os pinos para envio, recepo e sincronizao da comunicao.
Pgina 10 de 33
O deslocador de registo (shift register) SSPSR est directamente ligado aos pinos de entrada e sada do microcontrolador e utilizado na transmisso, para serializar os dados para o pino de transmisso (SDO), e na recepo para converter num resultado paralelo os dados srie provenientes do pino de recepo (SDI). O registo SSPSR tem uma entrada e uma sada, sendo que o hardware desloca um bit para a sada e adquire um bit na entrada em simultneo, por outras palavras, de cada vez que aparece um bit na entrada do deslocador, um bit deslocado para a sada. O registo SSPBUF implementa um buffer de memria temporrio utilizado nas operaes de transmisso e recepo de dados. Na transmisso, o registo SSPBUF funciona como buffer de transmisso, que recebe os dados a transmitir, colocando-os no deslocador SSPSR para subsequente transmisso. Na recepo, o registo SSPBUF funciona como buffer auxiliar que armazena, no formato paralelo, os dados recebidos no deslocador SSPSR, aps a recepo integral dos 8 bits de dados. Assim, aps a recepo de 8 bits de dados, este byte movido para o registo SSPBUF para leitura pela aplicao. Este formato de buffer de dados duplo na recepo, implementado por SSPBUF e SSPSR, permite iniciar a leitura do prximo byte antes do processamento dos dados que j foram recebidos. Qualquer escrita para o registo SSPBUF durante a transmisso/recepo de dados ser ignorada. Excluindo as configuraes necessrias para o correcto funcionamento da comunicao, a transferncia de dados via SPI pode-se resumir escrita e leitura de dados no registo SSPBUF, dado que todos os mecanismos de deslocamento de bits e sincronizao de relgio so feitos automaticamente pelo hardware. Antes de iniciar a comunicao SPI, no entanto necessrio efectuar algumas configuraes de inicializao ao mdulo MSSP, nomeadamente:
5
Pgina 11 de 33
No funcionamento em modo mestre, a linha SCK, que a linha onde o relgio gerado, deve ser configurada como sada;
No funcionamento em modo escravo, a linha SCK, que a linha onde o relgio recebido, deve ser configurada como entrada;
Seleco do instante em que feita a amostragem na recepo, ou a meio ou no fim do tempo de bit estvel (bit SMP);
Seleco da polaridade para o sinal de relgio (CPOL), atravs da flag CKP; Seleco do bordo do sinal relgio (CPHA), atravs da flag CKE; No funcionamento em modo mestre, deve-se efectuar a definio e configurao da taxa de transmisso, que pode ser no mximo 10 Mbps, assumindo uma frequncia de relgio a 40 MHz, sendo que esta velocidade definida por uma das seguintes configuraes: o o o o = = =
4 16 64
Para o funcionamento em modo escravo, este deve ser adequadamente configurado atravs do registo SSPCON1;
Seguidamente, aps a configurao do mdulo, a operao com o mdulo MSSP no modo de funcionamento SPI pode-se resumir seguinte sequncia de passos:
Pgina 12 de 33
Departamento de Engenharia Electrotcnica Microprocessadores Passo 1: Os dados a transmitir devem ser escritos no registo de buffer SSPBUF. Se o mdulo estiver a operar em modo mestre, ento o microcontrolador ir 2009/2010
automaticamente executar os passos 2, 3 e 4. Se o mdulo SPI estiver em modo Escravo, ento o microcontrolador aguarda a deteco do sinal do relgio no pino SCK, e s ento executar os referidos passos.
transferidos para o deslocador de registo interno SSPSR, registo no acessvel ao programador. Neste processo o contedo do registo SSPBUF no apagado.
Passo 3: Sincronizado com o sinal do relgio, os dados do registo SSPSR so deslocados para o pino de sada (o primeiro bit o MSb). Simultaneamente, o registo SSPSR est a ser preenchido com os bits recebidos atravs do pino de entrada. No funcionamento em modo mestre, o microcontrolador gera o relgio de sincronizao, enquanto que no modo escravo utiliza o relgio externo presente na linha SCK.
Passo 4:
Pgina 13 de 33
Departamento de Engenharia Electrotcnica Microprocessadores O buffer SSPSR fica cheio assim que forem recebidos 8 bits de dados, evento que assinalado pelos bits BF e SSPIF, que ficam asseridos. Os dados recebidos so automaticamente transferidos do registo SSPSR para o registo SSPBUF. Uma vez que a transferncia de dados atravs de comunicao srie realizada automaticamente por hardware, o programa em execuo no microcontrolador corre normalmente enquanto a transferncia de dados est a ser executada em paralelo, sem interveno da aplicao. A funo da flag SSPIF gerar uma interrupo quando a recepo de um byte estiver concluda. 2009/2010
Passo 5: Finalmente, os dados armazenados no registo SSPBUF esto prontos para serem copiados para um outro registo de utilizador, onde podero ser utilizados pela aplicao.
Existe um mtodo alternativo para configurao e utilizao do mdulo MSSP para implementao da comunicao SPI, que passa pela utilizao da API fornecida pelas bibliotecas do compilador C18.
Pgina 14 de 33
Assim, para configurar o mdulo MSSP no modo SPI, e para efectuar as operaes de transferncia de dados (transmisso e recepo) SPI, modo mestre ou escravo, podem ser utilizadas as seguintes funes: Funo CloseSPI DataRdySPI getcSPI getsSPI OpenSPI putcSPI putsSPI ReadSPI WriteSPI Descrio Desabilita o mdulo MSSP utilizado na comunicao SPI . Determina se existem dados disponveis para leitura no buffer SPI. L um byte do bus SPI. L um array de dados do bus SPI. Inicializa o mdulo MSSP utilizado na comunicao SPI. Escreve um byte para o bus SPI. Escreve um array de dados para o bus SPI. L um byte de dados do bus SPI. Escreve um byte de dados do bus SPI.
Para utilizar esta biblioteca, o header file spi.h deve ser includo no cdigo fonte. Consulte a documentao das bibliotecas do compilador C18 para mais informaes sobre como utilizar estas funes.
A comunicao srie no modo I2C semelhante comunicao de dados em modo SPI, na medida em que igualmente sncrona e bidireccional. No modo I2C apenas so utilizadas duas linhas para a transferncia de dados: a linha SDA (Serial Data) e SCL (Serial Clock). O programador deve configurar estes pinos como entradas atravs dos respectivos bits no registo TRISC. O relgio da comunicao, necessrio para sincronizar a transferncia de dados entre cada dispositivo no barramento, gerado pelo dispositivo mestre, que poder ser o microcontrolador PIC caso este esteja a operar em modo mestre. A frequncia de relgio determina a velocidade de transmisso. Tal como anteriormente referido, existem especificaes no protocolo I2C que permitem frequncias de relgio no mximo de 3.4MHz (modo High-Speed I2C); contudo as frequncias Tutorial - Mdulo MSSP Pgina 15 de 33
de relgio mais frequentemente utilizadas so 100 kHz (modo Standard I2C) ou 400 kHz (modo Fast-Speed I2C), sendo que no h limite para a frequncia mnima. Quando o mestre e escravo esto sincronizados pelo sinal de relgio, a transferncia de dados sempre iniciada pelo mestre. Para efectuar uma comunicao bem sucedida, a seguinte sequncia de procedimentos tem de ser efectuada: 1. O dispositivo mestre envia para o barramento uma condio de START, por meio do pino SDA; 2. Depois, envia o endereo de 7 bits do dispositivo escravo com o qual quer comunicar, enviando seguidamente um bit (R/*W) que define se se trata de uma operao de escrita (0) ou leitura (1) de dados. Desta forma, aps o envio condio de incio, os oito bits de endereo so deslocados para o registo SSPSR, que por sua vez far a sua transmisso srie atravs da linha SDA. 3. Todos os dispositivos escravo partilham a mesma linha de dados, logo todos iro receber o primeiro byte de endereo, contudo apenas um deles, o dispositivo que tem o endereo que foi requisitado pelo dispositivo mestre, ir participar na transferncia.
4. Depois da transmisso do primeiro byte ser concluda, o dispositivo mestre entra em modo de espera de forma a receber o aviso (acknowledge), notificando a associao correcta de um endereo por parte do dispositivo que recebeu o seu prprio endereo. Se o dispositivo escravo enviar o bit de acknowledge (0), a transferncia de dados teis ser iniciada at
Pgina 16 de 33
que o dispositivo mestre (microcontrolador) envie uma condio de STOP para o barramento.
No microcontrolador PIC18F4520, pode-se definir o funcionamento em I2C em trs modos distintos: Modo Master, no qual o microcontrolador PIC18F4520 actua como o mestre da comunicao, sendo sempre o microcontrolador quem inicia as transferncias de informao; Modo Slave, no qual o microcontrolador PIC18F4520 um dispositivo escravo no barramento de dados, respondendo apenas aos pedidos do mestre do barramento; Modo Multi-Master, no qual o barramento I2C pode possuir mais que um mestre, pelo que o microcontrolador pode assumir tanto as funes de mestre, como de escravo. O diagrama de blocos do mdulo MSSP para o funcionamento no modo I2C apresentado na Figura 8.
Pgina 17 de 33
Para alm dos registos de controlo e estado SSPCON1, SSPCON2 e SSPSTAT anteriormente referidos, o modo I2C utiliza para o seu normal funcionamento alguns registos auxiliares, nomeadamente: Registo SSPBUF (Serial Transmit/Receive Buffer), que o registo onde os dados so lidos ou escritos; Registo SSPADD (MSSP Address Register), que o registo que contm ou o endereo do microcontrolador, quando este est a operar em modo Slave, ou o valor determinado para a gerao do baud rate da comunicao; Registo SSPSR, que um registo auxiliar que implementa o deslocador srie-paralelo e paralelo-srie, para as operaes de recepo e transmisso, respectivamente. Este registo no manipulvel directamente pelo programador; No caso de um modo de funcionamento do microcontrolador como dispositivo mestre, ento deve ser definida a frequncia do relgio da comunicao a utilizar, que configurada de acordo com a seguinte expresso: 2 = 4 ( < 6: 0 > + 1)
Pgina 18 de 33
A configurao do mdulo MSSP pode ser feita atravs do seguinte procedimento: 1. Configurar os pinos SCL e SDA como entradas digitais, por meio dos tri-state buffers associados; 2. Seleccionar o modo de funcionamento I2C pretendido para o microcontrolador, atravs dos bits SSPMx do registo SSPCON1; 3. Definir o slew-rate pretendido para o sinal de relgio, em funo da frequncia de comunicao utilizada (necessrio activar para operar no modo Fast-Speed I2C, a 400 kHz), atravs do bit SMP do registo SSPSTAT; 4. Configurar o relgio da comunicao, atravs dos 7 bits menos significativos do registo SSPADD; 5. Habilitar o mdulo MSSP, atravs do bit SSPEN do registo SSPCON1;
A escrita de um byte de dados num dispositivo perifrico ligado ao barramento I2C efectuada atravs do seguinte procedimento: 1. enviado para o barramento uma condio de Start, atravs da assero do bit SEN do registo SSPCON2; 2. Deve-se aguardar at ao fim da emisso da condio de Start, que pode ser feito atravs da consulta ao bit SEN, que automaticamente limpo por hardware; 3. carregado o endereo I2C (de escrita, no caso) do dispositivo perifrico para o registo SSPBUF; 4. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; Tutorial - Mdulo MSSP Pgina 19 de 33
5. Verificar a recepo de uma condio de Acknowledge do dispositivo perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 6. Se o acknowledge foi recebido com sucesso, ento deve ser enviado para o barramento o endereo interno no dispositivo que se pretende escrever, carregando-o no registo SSPBUF; 7. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; 8. Deve-se verificar a recepo de uma nova condio de acknowledge do perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 9. Se o acknowledge for recebido com sucesso, ento devem ser transmitidos os dados para o barramento, carregando o registo SSPBUF; 10. Deve-se aguardar at ao fim da transmisso; 11. Quando todos os dados tiverem sido enviados, ento deve-se emitir para o barramento uma condio de Stop, atravs da assero do bit PEN do registo SSPCON2; 12. Deve-se aguardar o fim da emisso da condio de Stop, atravs da leitura do bit PEN, que limpo automaticamente por hardware;
De forma semelhante ao procedimento de escrita anteriormente descrito, e tendo em conta as caractersticas do barramento I2C, a leitura de um byte de dados de um dispositivo perifrico no barramento I2C pode ser feita da seguinte forma: 1. enviado para o barramento uma condio de Start, atravs da assero do bit SEN do registo SSPCON2; 2. Deve-se aguardar at ao fim da emisso da condio de Start, que pode ser feito atravs da consulta ao bit SEN, que automaticamente limpo por hardware; 3. carregado o endereo I2C (de escrita, no caso) do dispositivo perifrico para o registo SSPBUF; Tutorial - Mdulo MSSP Pgina 20 de 33
4. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; 5. Verifica a recepo de uma condio de Acknowledge do dispositivo perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 6. Se o acknowledge foi recebido com sucesso, ento deve ser enviado para o barramento o endereo interno no dispositivo que se pretende ler, carregando-o no registo SSPBUF; 7. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; 8. Deve-se verificar a recepo de uma nova condio de acknowledge do perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 9. Se o acknowledge for recebido com sucesso, ento deve ser emitida uma condio de Restart, atravs da assero do bit RSEN do registo SSPCON2. A condio de restart necessria uma vez que se vai iniciar uma transferncia para um novo endereo. 10. Deve-se aguardar at que a condio de Restart seja completa, atravs da leitura da flag RSEN, que limpa automaticamente por hardware; 11. Deve-se escrever no barramento o novo endereo do dispositivo perifrico, que no caso deve ser o endereo de leitura, para assinalar a leitura de dados, carregando o registo SSPBUF; 12. Deve-se aguardar at ao fim da transmisso; 13. Deve-se esperar pela recepo de uma condio de acknowledge do dispositivo perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 14. Se o acknowledge foi recebido com sucesso, ento deve-se habilitar o modo de recepo de dados no microcontrolador, atravs da assero do bit RCEN do registo SSPCON2; 15. Deve-se aguardar o fim da recepo dos dados, lendo a flag RCEN, que limpa por hardware no fim da recepo; 16. O byte de dados lido deve ser recolhido do registo SSPBUF; 17. Quando todos os dados tiverem sido lidos, ento deve-se emitir para o barramento uma condio de Stop, atravs da assero do bit PEN do registo SSPCON2; Tutorial - Mdulo MSSP Pgina 21 de 33
18. Deve-se aguardar o fim da emisso da condio de Stop, atravs da leitura do bit PEN, que limpo automaticamente por hardware;
Tal como acontece no modo de funcionamento SPI, existe um mtodo alternativo para configurao e utilizao do mdulo MSSP no modo de funcionamento I2C, que passa pela utilizao da API fornecida pelas bibliotecas do compilador C18, que fornece o seguinte conjunto de procedimentos: Funo AckI2C CloseI2C DataRdyI2C getcI2C getsI2C IdleI2C NotAckI2C OpenI2C putcI2C putsI2C ReadI2C RestartI2C StartI2C StopI2C WriteI2C Descrio Emite uma condio de Acknowledge no barramento. Desabilita o mdulo MSSP em uso pelo I2C. Verifica se existem dados disponveis no buffer de recepo I2C. L um byte de dados do barramento I2C. L um array de dados do barramento I2C. Aguarda at terminarem as transferncias no barramento I2C. Emite uma condio de Not Acknowledge no barramento I2C. Configura e habilita o mdulo MSSP para a comunicao I2C. Escreve um byte de dados no barramento I2C. Escreve um array de dados no barramento I2C. L um byte de dados do barramento I2C. Emite uma condio de Restart no barramento I2C. Emite uma condio de Start no barramento I2C. Emite uma condio de Stop no barramento I2C. Escreve um byte de dados no barramento I2C.
Para utilizar esta biblioteca, o header file i2c.h deve ser includo no cdigo fonte. Consulte a documentao das bibliotecas do compilador C18 para mais informaes sobre como utilizar estas funes.
Pgina 22 de 33
VCC
RB3
LCD1
LM032L
VCC
R15
470
R21
470
R22
470
R23
470
R24
470
VSS VDD VEE RS RW E D0 D1 D2 D3 D4 D5 D6 D7
LS1
SOUNDER
R4
470
D1
LED-GREEN
D2
LED-RED
D3
LED-RED
D4
LED-RED
D5
LED-RED
GND
VEE
J6
R8
2k2
Q2
PN2222A
7 8 9 10 11 12 13 14
VDD
1 2 3
4 5 6
R5
2k2
Q1
2N2222
RD7 JUMPER
J9
JUMPER
R9
VCC VCC 470 RA1 RA2 RA3
U1
2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RA0/AN0/C1INRC0/T1OSO/T13CKI RA1/AN1/C2INRC1/T1OSI/CCP2B RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL RA4/T0CKI/C1OUT RC4/SDI/SDA RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO RA6/OSC2/CLKO RC6/TX/CK RA7/OSC1/CLKI RC7/RX/DT RB0/AN12/FLT0/INT0 RB1/AN10/INT1 RB2/AN8/INT2 RB3/AN9/CCP2A RB4/KBI0/AN11 RB5/KBI1/PGM RB6/KBI2/PGC RB7/KBI3/PGD RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5/P1B RD6/PSP6/P1C RD7/PSP7/P1D RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 RE3/MCLR/VPP PIC18F4520 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 1 OSI
FREQUENCY METER
CLK CE RST
RV1
50%
R1
10k
R2
4k7
R3
4k7 RB0 RB1 RB2 RB3
R6
4k7 RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7
R7
4k7
I2C
U4
6 5 7 SCK SDA WP 24LC256 A0 A1 A2 1 2 3
RESET
5k
+88.8
Volts
RA4
SENS
RXD TXD RTS CTS TC74 4 5 SCLK SDA 1.0
RB0
I2C
O primeiro exemplo de cdigo apresentado neste documento permite fazer a leitura da temperatura medida atravs de um sensor de temperatura TC74, que um sensor de temperatura que possui uma interface de comunicao I2C. Para fazer a interface com este sensor de temperatura, recorre-se ao modo de funcionamento I2C oferecido pelo mdulo MSSP do microcontrolador PIC18F4520. A temperatura medida e lida do sensor apresentada no display LCD. O diagrama temporal dos comandos necessrios para a configurao e leitura do sensor TC74 so apresentados na Figura 10.
Pgina 23 de 33
Figura 10 Diagrama temporal dos comandos para escrita/leitura de dados no sensor de temperatura TC74
Para melhor entender o cdigo exemplo apresentado, consulte com maior detalhe o datasheet do sensor de temperatura TC74 da Microchip. Este cdigo foi desenvolvido recorrendo biblioteca I2C do compilador Microchip C18 C Compiler (i2c.h).
/** * Departamento de Engenharia Electrotcnica - ESTG * Microprocessadores * * Tutorial Mdulo MSSP - Exemplo 1 * - Exemplo de comunicao I2C com um sensor * de temperatura TC74 */
/* definies do microcontrolador PIC18F4520 */ #include <p18f4520.h> /* header da biblioteca I2C */ #include <i2c.h> /* header da biblioteca 'delays' */
Pgina 24 de 33
2009/2010
/** * Definio do endereo base do sensor TC74: * - package A5: 1001101* * - escrita: 10011010 * - leitura: 10011011 */ #define BASE_ADDR 0b10011010 /** Comando para trocar para a linha 1 */ #define LINE1 0x80 /** Comando para trocar para a linha 2 */ #define LINE2 0xC0 /** Comando para limpar o LCD */ #define CLEAR 0x01
/** * Procedimento de inicializao do sensor TC74. * Escrita do registo CONFIG (01 hex) para habilitar * sensor. Consultar datasheet do sensor * * @param base_addr Endereo base (escrita) do sensor TC74. */ static void init_tc74(unsigned char base_addr) { /* garante inactividade no barramento */ IdleI2C(); /* emite uma condio de START no barramento I2C */ StartI2C(); /* aguarda terminao da condio de START */ while (SSPCON2bits.SEN); /* enderea o dispositivo no barramento I2C, para escrita */ WriteI2C(base_addr); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* selecciona o registo CONFIG do sensor */ WriteI2C(0x01); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* habilita o sensor de temperatura TC74 */ WriteI2C(0b00000000); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT);
Pgina 25 de 33
2009/2010
/** * Procedimento de leitura da temperatura do sensor TC74. * Leitura do registo RTR (00 hex) para ler temperatura medida. * * @param base_addr Endereo base (escrita) do sensor TC74. * @param temp Ponteiro de retorno para a temperatura lida. */ static void read_tc74(unsigned char base_addr, int *temp) { unsigned char read; /* garante inactividade no barramento */ IdleI2C(); /* emite uma condio de START no barramento I2C */ StartI2C(); /* aguarda terminao da condio de START */ while (SSPCON2bits.SEN); /* enderea o dispositivo no barramento I2C, para escrita */ WriteI2C(base_addr); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* selecciona o registo CONFIG do sensor */ WriteI2C(0x00); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* emite uma condio de REPEATED START no barramento I2C */ RestartI2C(); /* aguarda terminao da condio de REPEATED START */ while (SSPCON2bits.RSEN); /* enderea o dispositivo no barramento I2C, para leitura */ WriteI2C(base_addr + 1); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* comuta para modo de recepo */ SSPCON2bits.RCEN = 1; /* aguarda recepo dos dados */ while (!DataRdyI2C()); /* leitura dos dados recebidos do sensor */ read = ReadI2C(); /* verifica terminao da sequncia de recepo */ while (SSPCON2bits.RCEN); /* envia condio de NOT ACKNOWLEDGE para o barramento I2C */ NotAckI2C(); /* aguarda terminao da condio de NOT ACKNOWLEDGE */ while ( SSPCON2bits.ACKEN ); /* emite uma condio de STOP no barramento I2C */ StopI2C();
Pgina 26 de 33
2009/2010
/** * Ponto de entrada da aplicao. */ void main(void) { int temp; char temp_str[5]; /* * desactivar uso de entradas analgicas no registo ADCON1 */ ADCON1 = 0x0F; /* * Definio da direco das linhas */ /* LCD ligado no porto D, linhas configuradas como sadas */ TRISD = 0; /* * restantes portos no usados, * linhas configuradas como entradas */ TRISA = 0xFF; TRISB = 0xFF; TRISC = 0xFF; TRISE = 0x07; /* * inicializao da comunicao I2C: * - seleco do modo Mestre * - desabilita controlo de Slew rate */ OpenI2C(MASTER, SLEW_OFF); /* * configurao da velocidade de comunicao * SSPADD a 9 -> F(i2c) = 100kHz (velocidade * mxima do sensor TC74) */ SSPADD = 9; /* * inicializao do sensor de temperatura TC74 */ init_tc74(BASE_ADDR);
Pgina 27 de 33
/* * inicializao do LCD */ OpenXLCD(FOUR_BIT & LINES_5X7); while(BusyXLCD()); WriteCmdXLCD(DON & CURSOR_OFF & BLINK_OFF); while(BusyXLCD()); WriteCmdXLCD(SHIFT_CUR_RIGHT); while(BusyXLCD()); /* limpa LCD */ WriteCmdXLCD(CLEAR); while (BusyXLCD()); /* escreve linha 1, coluna 5 */ WriteCmdXLCD(LINE1 + 5); while (BusyXLCD()); putrsXLCD("SENSOR TC74"); while (BusyXLCD()); /* escreve linha 2, coluna 1 */ WriteCmdXLCD(LINE2); while (BusyXLCD()); putrsXLCD("TEMPERATURA:"); while (BusyXLCD()); /* * ciclo infinito */ while (1) { /* aguarda 500 ms */ Delay10KTCYx(50); /* l temperatura */ read_tc74(BASE_ADDR, &temp); /* actualiza display LCD */ sprintf(temp_str, "%4d", temp); /* escreve linha 2, coluna 14 */ WriteCmdXLCD(LINE2 + 13); while (BusyXLCD()); putsXLCD(temp_str); while(BusyXLCD()); } }
Pgina 28 de 33
Este exemplo de cdigo permite fazer a leitura da temperatura medida atravs de um sensor de temperatura TC72, que possui uma interface de comunicao SPI, apresentando seguidamente a temperatura no display LCD. Assim sendo, a configurao e aquisio da temperatura do sensor conseguida implementando o modo de funcionamento SPI oferecido pelo mdulo MSSP do microcontrolador PIC18F4520. Para a simulao do funcionamento deste exemplo de cdigo, foi utilizado o circuito esquemtico do Proteus apresentado na Figura 11.
RB0 RB1 RB2
VCC
RB3
LCD1
LM032L
VCC
R15
470
R21
470
R22
470
R23
470
R24
470
VSS VDD VEE RS RW E D0 D1 D2 D3 D4 D5 D6 D7
LS1
SOUNDER
R4
470
D1
LED-GREEN
D2
LED-RED
D3
LED-RED
D4
LED-RED
D5
LED-RED
GND
VEE
J6
R8
2k2
Q2
PN2222A
7 8 9 10 11 12 13 14
VDD
1 2 3
4 5 6
R5
2k2
Q1
2N2222
RD7 JUMPER
J9
JUMPER
R9
VCC VCC 470 RA1 RA2 RA3
U1
2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RA0/AN0/C1INRC0/T1OSO/T13CKI RA1/AN1/C2INRC1/T1OSI/CCP2B RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL RA4/T0CKI/C1OUT RC4/SDI/SDA RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO RA6/OSC2/CLKO RC6/TX/CK RA7/OSC1/CLKI RC7/RX/DT RB0/AN12/FLT0/INT0 RB1/AN10/INT1 RB2/AN8/INT2 RB3/AN9/CCP2A RB4/KBI0/AN11 RB5/KBI1/PGM RB6/KBI2/PGC RB7/KBI3/PGD RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5/P1B RD6/PSP6/P1C RD7/PSP7/P1D RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 RE3/MCLR/VPP PIC18F4520 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 1 RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 3 2 6 5
FREQUENCY METER
CLK CE RST
RV1
50%
R1
10k
R2
4k7
R3
4k7 RB0 RB1 RB2 RB3
RESET
SPI
SENS
SCK CE SDI SDO TC72 DIN DOUT SCK SS TRIG 4.0
5k
+88.8
Volts
RA4
RB0
SPI
O diagrama temporal para os comandos necessrios para efectuar a configurao e/ou a leitura do sensor TC72 encontra-se representado na Figura 12.
Pgina 29 de 33
Figura 12 Diagrama temporal dos comandos para escrita/leitura de dados no sensor de temperatura TC72
Para melhor entender o exemplo de programao apresentado, consulte com maior detalhe o datasheet do sensor de temperatura TC72 da Microchip. Este cdigo foi desenvolvido atravs do uso de funes da biblioteca SPI do compilador Microchip C18 C Compiler (spi.h).
/** * Departamento de Engenharia Electrotcnica - ESTG * Microprocessadores * * Tutorial Mdulo MSSP - Exemplo 2 * - Exemplo de comunicao SPI com um sensor * de temperatura TC72 */
/* definies do microcontrolador PIC18F4520 */ #include <p18f4520.h> /* header da biblioteca SPI */ #include <spi.h> /* header da biblioteca 'delays' */ #include <delays.h> #include <stdio.h> /* header da biblioteca xlcd */ #include "xlcd.h" /* configurao do #pragma config OSC /* desactivao do #pragma config LVP /* desactivao do #pragma config WDT oscilador externo */ = EC modo de programao em baixa tenso */ = OFF temporizador Watch Dog Timer */ = OFF
Pgina 30 de 33
2009/2010
/** * Procedimento de inicializao do sensor de temperatura * TC72. Configurao do registo de controlo para habilitar * modo de converso contnua. * Consultar datasheet. */ static void init_tc72(void) { /* activao do Chip Select */ PORTCbits.RC0 =1; /* selecciona registo CONTROL, modo de escrita (80 hex) */ WriteSPI(0x80); /* habilita modo de converso contnua */ WriteSPI(0x04); /* desactivao do Chip Select */ PORTCbits.RC0 = 0; Delay1TCY(); } /** * Procedimento de leitura da temperatura do sensor TC74. * Leitura do registo MSB (02 hex) para ler temperatura medida. * * @param temp Ponteiro de retorno para a temperatura lida */ static void read_tc72(int * temp) { unsigned char msb; unsigned char lsb; unsigned char control; /* activao do Chip Select */ PORTCbits.RC0 = 1; /* seleccinoa registo MSB, modo de leitura (02 hex) */ WriteSPI(0x02); /* aguarda recepo dos dados */ while (!DataRdySPI()); /* leitura do MSB da temperatura */ msb = ReadSPI(); /* leitura do LSB da temperatura */ lsb = ReadSPI(); /* leitura do registo CONTROL */ control = ReadSPI(); /* desactivao do Chip Select */ PORTCbits.RC0 = 0; *temp = (char) msb; } /**
Pgina 31 de 33
2009/2010
Pgina 32 de 33
2009/2010
Pgina 33 de 33