Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Microcontrolador AT89S8253 +
EEPROM 25LC256
Início/Conteúdo/Hardware/Comunicação SPI - Parte 3 - Microcontrolador AT89S8253 + EEPROM
25LC256
Prototipagem
Vamos adotar alguns protótipos de função como base para nossas funções.
Essas funções serão implementadas de acordo com o núcleo, mas terá o
mesmo SPI.H que descreveremos abaixo.
1 #ifndef _SPI_H_
2 #define _SPI_H_
3
4 #include <stdint.h>
5
6 #define MODE_0 0
7 #define MODE_1 1
8 #define MODE_2 2
9 #define MODE_3 3
10
11 #define MASTER 0
12 #define SLAVE 1
13
14 #define ORDER_MSB 0
15 #define ORDER_LSB 1
16
17 #include SPEED_DIV_4 0
18 #include SPEED_DIV_16 1
19 #include SPEED_DIV_64 2
20 #include SPEED_DIV_128 3
21 void spi_init( uint8_t modo , uint8_t masterSlave , uint8_t velocidade , uint8_t order ) ;
22 uint8_t spi_transfere( uint8_t dado ) ;
23
24 #endif // _SPI_H_
SPI no AT89S8253
Para quem não conhece esse microcontrolador, trata-se de um conhecido
núcleo de 8 bits fabricado pelaAtmel. Possui um core 8051 (MCS51) rodando
a 24MHz, com 12KBytes de Flash e 256Bytes de memória RAM. Permite o
uso de memória RAM externa, podendo acessar até 64K. Também possui uma
porta de comunicação USART, 32 IOs, 3 Timers de 16 bits, além do nosso
desejado SPI.
SPI do AT89S8253.
1 = SPI Enable
0 = SPI Disable
0 = Device is Slave
1 = Device is Master
CPOL - Clock Polarity (Bit 3) e CPHA - Clock Phase (Bit 2)
Este registrador indica o status do dispositivo SPI. É nele que vamos verificar
o final de uma transmissão (quando em Master) ou a troca de um dado
(quando em Slave).
Este bit indica uma colisão de dados. Isso ocorre quando um byte está sendo
transferido e a CPU escreve um novo dado. Em uma condição dessa, esse bit
será setado, indicando o erro.
1 = Write Collision
0 = Data Ok
Quando ENH (visto mais abaixo) está setado, é seguro carregar o TX Buffer
quando LDEN=1 e WCOL=0. LDEN permanecerá alto durante a transmissão
dos bits 0 a 3, e baixo durante os bits de 4 a 7 do tempo de transmissão do
frame da SPI.
Quando este bit está ativo, MISO entrará em Tri-State. Dessa forma, mais de
um Slave pode compartilhar a mesma interface com o mesmo Master. Pode-se
utilizar o primeiro byte da comunicação como o endereço do dispositivo
Slave, assim, somente o Slave selecionado poderá limpar o bit DISSO.
Implementação do Código
Uma vez que definimos a prototipagem e agora que conhecemos os
registradores, podemos implementar o código das duas funções de nossa SPI.
Primeiramente, vamos definir o cabeçalho do arquivo, que precisa definir a
CPU utilizada. Para nosso compilador SDCC, o cabeçalho para
o AT89S8253 é oat89s8253.h. Nele, encontramos a definição dos registradores
que vamos utilizar.
1 void spi_init( uint8_t modo , uint8_t masterSlave , uint8_t velocidade , uint8_t order )
2 {
3 // Desabilita o SPI para as configurações.
4 SPCR = 0x00 ;
5
6 // Configuração do modo (Fase e Polaridade).
7 switch( modo )
8 {
9 case MODE_1 :
10 SPCR &= ~( SPCR_CPHA ) ; // CPHA = 0
11 SPCR |= ( SPCR_CPOL ) ; // CPOL = 1 ;
12 break ;
13 case MODE_2 :
14 SPCR |= ( SPCR_CPHA ) ; // CPHA = 1
15 SPCR &= ~( SPCR_CPOL ) ; // CPOL = 0 ;
16 break ;
17 case MODE_3 :
18 SPCR |= ( SPCR_CPHA ) ; // CPHA = 1
19 SPCR |= ( SPCR_CPOL ) ; // CPOL = 1 ;
20 break ;
21 case MODE_0 :
22 default :
23 SPCR &= ~( SPCR_CPHA ) ; // CPHA = 0
24 SPCR &= ~( SPCR_CPOL ) ; // CPOL = 0 ;
25 break ;
26 }
27
28 // Configura qual será o primeiro bit.
29 if( order == ORDER_MSB )
30 {
31 SPCR |= SPCR_DORD ; // MSB Primeiro.
32 }
33 else
34 {
35 SPCR &= ~SPCR_DORD ; // LSB Primeiro.
36 }
37
38 // Configuração de Master ou Slave.
39 if( masterSlave == MASTER )
40 {
41 // Dispositivo configurado como Master.
42 SPCR |= SPCR_MSTR ;
43 }
44 else
45 {
46 // Dispositivo configurado como Slave.
47 SPCR &= ~SPCR_MSTR ;
48 }
49
50 // COnfigura o dividor para o gerador de clock.
51 switch( velocidade )
52 {
53 case SPEED_DIV_16 :
54 // SPR <- 01
55 SPCR |= SPCR_SPR0 ;
56 SPCR &= ~SPCR_SPR1 ;
57 break ;
58 case SPEED_DIV_64 :
59 // SPR <- 10
60 SPCR &= ~SPCR_SPR0 ;
61 SPCR |= SPCR_SPR1 ;
62 break ;
63 case SPEED_DIV_128 :
64 // SPR <- 11
65 SPCR |= SPCR_SPR0 ;
66 SPCR |= SPCR_SPR1 ;
67 break ;
68 case SPEED_DIV_4 :
69 default :
70 // SPR <- 00
71 SPCR &= ~SPCR_SPR0 ;
72 SPCR &= ~SPCR_SPR1 ;
73 break ;
74 }
75
76 // Força SPI no modo padrão de funiconamento.
77 SPSR = 0x00 ;
78
79 // Habilita a SPI.
80 SPCR |= SPCR_SPE ;
81 }
Esquemático da ligação.
READ (03h)
Instrução de leitura de dados.
WRITE (02h)
Uma vez enviado os dois bytes de endereço, o byte seguinte é o dado a ser
gravado. Caso mais bytes sejam enviados, o endereço é automaticamente
incrementado e os dados serão gravados em sequência. No entanto, há um
limite de até 64 bytes por ciclo de gravação.
WREN (06h)
1 #infdef _25LC256_H_
2 #define _25LC256_H_
3
4 #include <stdint.h>
5
6 void eeprom_init( void ) ;
7 uint8_t eeprom_readByte( uint16_t addr ) ;
8 void eeprom_writeByte( uint16_t addr , uint8_t data ) ;
9
10 #endif // _25LC256_H_
1 #include "eeprom.h"
2 #include "spi.h"
3
4 #define CS P1_4
5
6 #define CMD_WREN 0x06
7 #define CMD_READ 0x03
8 #define CMD_WRITE 0x02
Essas definições apenas indicam os comandos e arquivos a serem incluídos no
projeto. Após essas definições, temos a implementação da função de
inicialização eeprom_init() conforme definimos no cabeçalho. Ela chama a
inicialização da SPI e, em seguda, envia o comando de WREN.
Referências
25LC256 http://ww1.microchip.com/downloads/en/DeviceDoc/21822E.pdf
AT89S8253 http://www.atmel.com/Images/doc3286.pdf
Arquiteture and
http://www.mikroe.com/chapters/view/67/chapter-4-at89s8253-
Programming
microcontroller/
8051 MCU's
Coding SPI
http://www.vikingexplorer.org/vikingftp/EDN071203-spi.pdf
Software