O circuito no simulador proteus :
Configurando os fuses:
O código fonte do slave:
1: //************************************************************************
2: // usando SPI
3: // Version : 1.0
4: // microcontrolador : AVR ATMega8
5: // Autor : Aguivone
6: // descrição : modo slave - coloca dado recebido na saida do portd
7: // data : 14/06/2011.
8: //
9: ///////////////////////////////////////////////////////////////////////////////////////////////
10:
11: #define F_CPU 4000000UL // clock do microcontrolador
12: #include <avr/io.h>
13: #include <avr/interrupt.h>
14: /////////////////////////////////configura registradores//////////////////
15: #define MOSI PINB3//entrada
16: #define MISO PINB4//saida
17: #define SCK PINB5//entrada
18: #define DDR_SPI DDRB
19:
20: char enviar=0;
21:
22: //////////////////////////////////////////////////////////////
23: void SPI_Slave_inicializa(void)
24: {
25: DDR_SPI = (1<<MISO);
26: SPCR = (1<<SPE)/*|(1<<CPOL)*/|(1<<SPIE); // habilita SPI / polaridade do clock / habilita interrupção de SPI
27: }
28: ///////////////vetor de interrupção///////////////////////////////////
29: ISR (SPI_STC_vect)
30: {
31: SPDR = enviar;//envia dado anteriormente recebido
32: PORTD = SPDR;
33: enviar = SPDR;
34: }
35: /////////////////////////////////////função principal/////////////////////////////////
36: int main(void)
37: {
38: SPI_Slave_inicializa();
39: DDRD = 0xFF;
40: sei();
41:
42: for (;;)
43: {
44: //faz nada
45: }
46: }
47:
O código fonte do mestre:
1: //************************************************************************************************
2: // usando o protocolo SPI
3: // Version : 1.0
4: // microcontrolador : AVR ATMega8
5: // Autor : Aguivone
6: // descrição : envia dados e lê ao mesmo tempo
7: // data : 14/06/11.
8: //
9: //para simular este exemplo basta ligar a saida serial com a entrada assim fica facil percerber que ele envia
10: //e recebe ao mesmo tempo
11: //*************************************************************************************************
12:
13: #define F_CPU 4000000UL // clock do microcontrolador
14: #include <avr\io.h>
15: #include <util/delay.h>
16: #include <avr/interrupt.h>
17:
18: /////////////////////////////configuração dos pinos utilizados //////////////////////////////////////
19:
20: #define MOSI PB3
21: #define MISO PB4
22: #define SCK PB5
23: #define SS PB2
24:
25: /////////////////////////////////////////////////////////////////////////////////////////////////////////
26: void SPI_inicializa(void)
27: {
28: DDRD =0xFF;
29: DDRB |= ((1<<MOSI)|(1<<SCK)|(1<<SS)); //MOSI, SCK and SS são saidas(se for usar dois mestres então deve-se o SS como entrada)
30: DDRB &= (~(1<<MISO)); //MISO é entrada
31: PORTB |= (1<<SS); //inicia com SS em nivel alto
32: //SPE : habilita SPI
33: //MSTR: modo Master
34: //SPIE: habilita interrupção de SPI
35: //SPCR = ((1<<SPE)|(1<<MSTR)|(1<SPR1)|(1<SPR0)); //(1<SPR1)|(1<SPR0) : FOSC/128
36: SPCR = ((1<<SPE)|(1<<MSTR)|(1<SPR0)); //(1<SPR0) : FOSC/16
37: }
38:
39: void SPI_envia_byte(char dados)
40: {
41: PORTB &= (~(1<<SS)); //coloca SS em nivel baixo (0), para transferir dados
42: SPDR = dados; //inicializa transferencia
43: while(!(SPSR & (1<<SPIF))); //espera fim de transmissão
44: PORTD = SPDR;//escreve no port D o dado recebido
45: PORTB |= (1<<SS); //coloca SS em nivel alto (1), pois é o fim da transmissão.
46: _delay_ms(1);//tempo para slave colocar dados no registrador
47: }
48:
49: int main(void)
50: {
51:
52: SPI_inicializa();//inicializa SPI
53: sei();//habilita interrupções
54:
55: while(1)
56: {
57: SPI_envia_byte(0X01);//envia primeiro dado
58: SPI_envia_byte(0X05);//envia segundo dado
59: SPI_envia_byte(0X09);//envia terceiro dado
60: SPI_envia_byte(0X30);//envia quarto dado
61: SPI_envia_byte(0X60);//envia quinto dado
62: }
63:
64: return 0;
65: }
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!