Professional Documents
Culture Documents
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
0 1 2 3 4 5 6 7 8 9 10 11 21 22 23 24 25 26 27 28 29 30 31
SCK
data out
High-impedance
SO 7 6 5 4 3 2 1 0
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
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.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
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 }