You are on page 1of 5

Capı́tulo 1

Práctica: Comunicación SPI

La mayorı́a de la gente gasta más tiempo en hablar de los problemas


que en afrontarlos
∼ Henry Ford ∼

1.1. Enunciado
En1 esta práctica vamos a conectar algún dispositivo SPI al microcontrolador, para aprender a
utilizar este protocolo de comunicación sı́ncrona y al mismo tiempo ampliar la capacidad de nuestro
montaje.
Se pretende, por tanto, el estudio y comprensión del protocolo de bus SPI, con un ejemplo
práctico en el que se implementan por software en el microcontrolador las rutinas necesarias para
dicha comunicación.

1.1.1. Especificaciones
Diseñar el hardware y el software necesario para implementar un bus SPI en el que conectaremos
alguna memoria serie SPI como pueden ser la 25LC16 (16 kbit) de Microchip . Recuerda que deben
tener direcciones diferentes para que no halla conflictos en el bus.
El juego de comandos se indica a continuación:
TABLE 3-1: INSTRUCTION SET
Instruction Name Instruction Format Description
READ 0000 0011 Read data from memory array beginning at selected address
WRITE 0000 0010 Write data to memory array beginning at selected address
WRDI 0000 0100 Reset the write enable latch (disable write operations)
WREN 0000 0110 Set the write enable latch (enable write operations)
RDSR 0000 0101 Read Status register
WRSR 0000 0001 Write Status register

El protocolo es el siguiente:

1
Versión de 27 de abril de 2008

1
2 Enunciado

FIGURE 3-1: READ SEQUENCE


CS

0 1 2 3 4 5 6 7 8 9 10 11 21 22 23 24 25 26 27 28 29 30 31
SCK

instruction 16-bit address


SI 0 0 0 0 0 0 1 1 15 14 13 12 2 1 0

data out
High-impedance
SO 7 6 5 4 3 2 1 0

FIGURE 3-2: BYTE WRITE SEQUENCE

CS
Twc
0 1 2 3 4 5 6 7 8 9 10 11 21 22 23 24 25 26 27 28 29 30 31
SCK
instruction 16-bit address data byte
SI 0 0 0 0 0 0 1 0 15 14 13 12 2 1 0 7 6 5 4 3 2 1 0

High-impedance
SO

FIGURE 3-3: PAGE WRITE SEQUENCE


CS

0 1 2 3 4 5 6 7 8 9 10 11 21 22 23 24 25 26 27 28 29 30 31
SCK
instruction 16-bit address data byte 1
SI 0 0 0 0 0 0 1 0 15 14 13 12 2 1 0 7 6 5 4 3 2 1 0

CS

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
SCK
data byte 2 data byte 3 data byte n (16 max)
SI 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1.1.2. Para sacar nota


Lee los datos de una memoria serie y escrı́belos en la otra, mostrando en el display alfanumérico
los datos que se están escribiendo en la segunda memoria y los datos que se leen de la misma memoria
para verificar su contenido. El profesor proporcionará las memorias con un determinado contenido
que deberá ser averiguado.
Capı́tulo 1. Práctica: Comunicación SPI 3

1.2. Solución
1.2.1. Esquema hardware

A B C D E F G H J K

0 0

SPI MONITOR
1 1
DIN
DOUT
SCK
SS
TRIG

2 U1 2
16 17
RA7/OSC1/CLKIN RA0/AN0
15 18
RA6/OSC2/CLKOUT RA1/AN1
1
RA2/AN2/CVREF/VREF-
4 2
RA5/MCLR RA3/AN3/C1OUT/VREF+
3
RA4/AN4/T0CKI/C2OUT
3 3
6 U2
RB0/INT/CCP1
7 6
RB1/SDI/SDA SCK
8 5
RB2/SDO/RX/DT SI
9 2 3
RB3/CCP1 SO WP
10 1 7
RB4/SCK/SCL CS HOLD
11
RB5/SS/TX/CK
4 RB6/AN5/T1OSO/T1CKI
12 25LC160 4
13
RB7/AN6/T1OSI
PIC16F88

5 5

6 6

U3 SPI MONITOR 2
7 16 17
7
RA7/OSC1/CLKIN RA0/AN0
15 18 DIN
RA6/OSC2/CLKOUT RA1/AN1
1 DOUT
RA2/AN2/CVREF/VREF-
4 2 SCK
RA5/MCLR RA3/AN3/C1OUT/VREF+
3 SS
RA4/AN4/T0CKI/C2OUT
TRIG
8 6 8
RB0/INT/CCP1
7
RB1/SDI/SDA
8
RB2/SDO/RX/DT
RB3/CCP1
9
10
FILE NAME: P_spi.dsn DATE:
RB4/SCK/SCL
RB5/SS/TX/CK
11
12
DESIGN TITLE: Práctica "Comunicacion SPI" 27/04/2008
RB6/AN5/T1OSO/T1CKI PAGE:
9 RB7/AN6/T1OSI
13 Hoja principal 1 of 1
9
PIC16F88
BY: Jesús M. Hernández Mangas REV: A TIME: 12:07:53
A B C D E F G H J K

1.2.2. Programas
Programa del PIC maestro

1 # include < pic .h >


2 # include " binario . h "
3
4 // Para el PIC16F88
5 __CONFIG ( WDTDIS & INTIO & UNPROTECT & PWRTDIS & CCPRB0 & DEBUGDIS & LVPDIS
6 & BORDIS & MCLRDIS ); // Palabra de configuración 0 x2007
7 __CONFIG ( FCMDIS & IESODIS ); // Palabra de configuración 0 x2008
8
9
10 unsigned char SPI_EnviaRecibe ( unsigned char c )
11 {
12 SSPBUF = c ; // Envı́a
13 while (! BF ); // Espera a que se transmita
14 return SSPBUF ;
15 }
16
17 unsigned char Lee_25LC16 ( unsigned int dir )
18 {
19 unsigned char c ;
20
21 do
4 Solución

22 {
23 RB0 = 0; // Selecciono la memoria
24 SPI_EnviaRecibe ( B00000101 ); // Comando READ STATUS
25 c = SPI_EnviaRecibe (0); // Lee el dato
26 RB0 = 1; // Deselecciono la memoria
27 } while ( c &0 x01 ); // Mientras valga 1 el bit WIP ( WriteInProgress )
28
29 RB0 = 0; // Selecciono la memoria
30 SPI_EnviaRecibe ( B00000011 ); // Comando READ
31 SPI_EnviaRecibe ( dir > >8 ); // Parte alta de la dirección
32 SPI_EnviaRecibe ( dir &0 xFF ); // Parte baja
33 c = SPI_EnviaRecibe (0); // Lee el dato
34 RB0 = 1; // Deselecciono la memoria
35 return c ;
36 }
37
38 void Escribe_25LC16 ( unsigned int dir , unsigned char d )
39 {
40 RB0 = 0; // Selecciono la memoria
41 SPI_EnviaRecibe ( B00000110 ); // Comando WRITE ENABLE
42 RB0 = 1; // Para que lo ejecute
43
44 RB0 = 0; // Selecciono la memoria
45 SPI_EnviaRecibe ( B00000010 ); // Comando WRITE
46 SPI_EnviaRecibe ( dir > >8 ); // Parte alta de la dirección
47 SPI_EnviaRecibe ( dir &0 xFF ); // Parte baja
48 SPI_EnviaRecibe ( d ); // Escribe el dato
49 // SPI_EnviaRecibe ( B00001000 ); // Comando WRITE DISABLE
50 RB0 = 1; // Deselecciono la memoria
51 }
52
53 void Escribe_uC_Slave ( unsigned char c )
54 {
55 RB3 = 0; // Selecciona uC_Slave
56 SPI_EnviaRecibe ( c ); // Envı́a dato , descarta lo recibido
57 RB3 = 1; // Deselecciona uC_Slave
58 }
59
60 void main ()
61 {
62 unsigned char t ;
63
64 ANSEL = 0; // Configuro el PORTA como digital
65 TRISB0 = 0; // RB0 control memoria salida
66 TRISB1 = 1; // RB1 / SDI input
67 TRISB2 = 0; // RB2 / SDO output
68 TRISB4 = 0; // RB4 / SCK output
69 TRISB3 = 0; // RB3 control uC slave salida
70 TRISA = 0; // Todo el puerto A es de salida
71 RB4 = 0; // CKP = 0
72 RB0 = 1; // Deselecciona la memoria
73 RB3 = 1; // Deselecciona el uC slave
74
75 SSPCON = B00100010 ; // Control del modulo SSP
76 // WCOL 0 No collision
77 // SSPOV 0 No overflow
78 // SSPEN 1 Enables SSP
79 // CKP 0 Transmit on rising edge of SCK
80 // SSPM <3:0 > 0010 SPI Master , clk = OSC /64
81 // = > (4 MHz )/64 =
82 SSPSTAT = B01000000 ; // Estado del módulo SSP
83 // SMP 0 Input data sampled at middle
84 // CKE 1 Data on rising edge of SCK ( CKP =0)
85 // D/A 0 - i2c only -
86 // P 0 - i2c only -
87 // S 0 - i2c only -
88 // R/W 0 - i2c only -
Capı́tulo 1. Práctica: Comunicación SPI 5

89 // UA 0 - i2c only -
90 // BF 0 Ocupado - read only -
91
92 Escribe_25LC16 ( 0 , 0 x33 );
93 t = Lee_25LC16 ( 0 );
94 PORTA = t ;
95
96 Escribe_uC_Slave ( 0 x44 );
97
98 while (1);
99 }

Programa del PIC esclavo

1 # include < pic .h >


2 # include " binario . h "
3
4 // Para el PIC16F88
5 __CONFIG ( WDTDIS & INTIO & UNPROTECT & PWRTDIS & CCPRB0 & DEBUGDIS & LVPDIS
6 & BORDIS & MCLRDIS ); // Palabra de configuración 0 x2007
7 __CONFIG ( FCMDIS & IESODIS ); // Palabra de configuración 0 x2008
8
9 void main ()
10 {
11 ANSEL = 0; // Configuro el PORTA como digital
12 // 76543210
13 TRISB = B00111011 ;
14 // TRISB1 = 1; // RB1 / SDI
input
15 // TRISB2 = 0; // RB2 / SDO
output
16 // TRISB4 = 1; // RB4 / SCK
input
17 // TRISB5 = 1; // RB5 // SS
input ( slave mode )
18 RBPU = 1; // Pull - ups desactivados
19 TRISA = 0; // Puerto A son salidas
20
21 SSPBUF = 0;
22 SSPCON = B00100101 ; // Control del modulo SSP
23 // WCOL 0 No collision
24 // SSPOV 0 No overflow
25 // SSPEN 1 Disables SSP
26 // CKP 0 Transmit on rising edge of SCK
27 // SSPM <3:0 > 0100 SPI Slave , SCK & / SS actives
28 //
29 SSPSTAT = B01000000 ; // Estado del módulo SSP
30 // SMP 0 Input data sampled at middle
31 // CKE 1 Data on rising edge of SCK ( CKP =0)
32 // D/A 0 - i2c only -
33 // P 0 - i2c only -
34 // S 0 - i2c only -
35 // R/W 0 - i2c only -
36 // UA 0 - i2c only -
37 // BF 0 Ocupado - read only -
38 while (1)
39 {
40 if ( BF ) // Dato recibido
41 {
42 PORTA = SSPBUF ; // Lo saco fuera
43 }
44 }
45 }

You might also like