You are on page 1of 5

Cap tulo 1 Pr actica: Comunicaci on SPI

La mayor a de la gente gasta m as tiempo en hablar de los problemas que en afrontarlos Henry Ford

1.1.

Enunciado

En1 esta pr actica vamos a conectar alg un dispositivo SPI al microcontrolador, para aprender a utilizar este protocolo de comunicaci on s ncrona y al mismo tiempo ampliar la capacidad de nuestro montaje. Se pretende, por tanto, el estudio y comprensi on del protocolo de bus SPI, con un ejemplo pr actico en el que se implementan por software en el microcontrolador las rutinas necesarias para dicha comunicaci on.

1.1.1.

Especicaciones

Dise nar 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 conictos en el bus. El juego de comandos se indica a continuaci on:
TABLE 3-1: INSTRUCTION SET
Instruction Format 0000 0011 0000 0010 0000 0100 0000 0110 0000 0101 0000 0001 Description Read data from memory array beginning at selected address Write data to memory array beginning at selected address Reset the write enable latch (disable write operations) Set the write enable latch (enable write operations) Read Status register Write Status register Instruction Name READ WRITE WRDI WREN RDSR WRSR

El protocolo es el siguiente:
1

Versi on de 27 de abril de 2008

2
FIGURE 3-1:
CS 0 SCK instruction SI 0 0 0 0 0 0 1 16-bit address 1 15 14 13 12 2 1 0 data out 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11

Enunciado
READ SEQUENCE

21 22 23 24 25 26 27 28 29 30 31

High-impedance SO

FIGURE 3-2:
CS

BYTE WRITE SEQUENCE

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

High-impedance SO

FIGURE 3-3:
CS 0 SCK 1 2

PAGE WRITE SEQUENCE

9 10 11

21 22 23 24 25 26 27 28 29 30 31

instruction SI 0 0 0 0 0 0 1

16-bit address 0 15 14 13 12 2 1 0 7 6

data byte 1 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 SI 7 6 5 4 3 2 1 0 7 6 data byte 3 5 4 3 2 1 0 7 data byte n (16 max) 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 erico los datos que se est an escribiendo en la segunda memoria y los datos que se leen de la misma memoria para vericar su contenido. El profesor proporcionar a las memorias con un determinado contenido que deber a ser averiguado.

Cap tulo 1. Pr actica: Comunicaci on SPI

1.2.
1.2.1.
A

Soluci on
Esquema hardware
B C D E F G H J K

SPI MONITOR
DIN DOUT SCK SS TRIG

2
16 15 4

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

U2
6 5 2 1 SCK SI SO WP CS HOLD 25LC160 3 7

U3
16 15 4 RA7/OSC1/CLKIN RA0/AN0 RA6/OSC2/CLKOUT RA1/AN1 RA2/AN2/CVREF/VREFRA5/MCLR RA3/AN3/C1OUT/VREF+ RA4/AN4/T0CKI/C2OUT RB0/INT/CCP1 RB1/SDI/SDA RB2/SDO/RX/DT RB3/CCP1 RB4/SCK/SCL RB5/SS/TX/CK RB6/AN5/T1OSO/T1CKI RB7/AN6/T1OSI PIC16F88 A B C D E 17 18 1 2 3 6 7 8 9 10 11 12 13

SPI MONITOR 2
DIN DOUT SCK SS TRIG

8
FILE NAME: DESIGN TITLE:

P_spi.dsn

DATE:

Prctica "Comunicacion SPI" 27/04/2008


PAGE:

Hoja principal
BY: Jess M. Hernndez Mangas REV:

1 A
J

of

1
12:07:53

TIME:

1.2.2.

Programas

Programa del PIC maestro


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

# include < pic .h > # include " binario . h "


// Para el PIC16F88 __CONFIG ( WDTDIS & INTIO & UNPROTECT & PWRTDIS & CCPRB0 & DEBUGDIS & LVPDIS & BORDIS & MCLRDIS ); // Palabra de configuraci o n 0 x2007 __CONFIG ( FCMDIS & IESODIS ); // Palabra de configuraci o n 0 x2008

unsigned char SPI_EnviaRecibe ( unsigned char c ) SSPBUF = c ; while (! BF ); return SSPBUF ;


// Env a // Espera a que se transmita

} {

unsigned char Lee_25LC16 ( unsigned int dir ) unsigned char c ; do

4
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

Soluci on
{

RB0 = 0; SPI_EnviaRecibe ( B00000101 ); c = SPI_EnviaRecibe (0); RB0 = 1; } while ( c &0 x01 ); RB0 = 0; SPI_EnviaRecibe ( B00000011 ); SPI_EnviaRecibe ( dir > >8 ); SPI_EnviaRecibe ( dir &0 xFF ); c = SPI_EnviaRecibe (0); RB0 = 1; return c ;

// Selecciono la memoria // Comando READ STATUS // Lee el dato // Deselecciono la memoria // Mientras valga 1 el bit WIP ( WriteInProgress ) // // // // // // Selecciono la memoria Comando READ Parte alta de la direcci on Parte baja Lee el dato Deselecciono la memoria

} {

void Escribe_25LC16 ( unsigned int dir , unsigned char d ) RB0 = 0; SPI_EnviaRecibe ( B00000110 ); RB0 = 1; RB0 = 0; SPI_EnviaRecibe ( B00000010 ); SPI_EnviaRecibe ( dir > >8 ); SPI_EnviaRecibe ( dir &0 xFF ); SPI_EnviaRecibe ( d ); // SPI_EnviaRecibe ( B00001000 ); RB0 = 1;
// Selecciono la memoria // Comando WRITE ENABLE // Para que lo ejecute // // // // // Selecciono la memoria Comando WRITE Parte alta de la direcci on Parte baja Escribe el dato // Comando WRITE DISABLE // Deselecciono la memoria

} {

void Escribe_uC_Slave ( unsigned char c ) RB3 = 0; SPI_EnviaRecibe ( c ); RB3 = 1;


// Selecciona uC_Slave // Env a dato , descarta lo recibido // Deselecciona uC_Slave

} {

void main () unsigned char t ; ANSEL = 0; TRISB0 = 0; TRISB1 = 1; TRISB2 = 0; TRISB4 = 0; TRISB3 = 0; TRISA = 0; RB4 = 0; RB0 = 1; RB3 = 1; SSPCON
= B00100010 ; // // // // // // // // // // // // // // // // // // // // // // // // Configuro el PORTA como digital RB0 control memoria salida RB1 / SDI input RB2 / SDO output RB4 / SCK output RB3 control uC slave salida Todo el puerto A es de salida CKP = 0 Deselecciona la memoria Deselecciona el uC slave Control del modulo SSP WCOL 0 No collision SSPOV 0 No overflow SSPEN 1 Enables SSP CKP 0 Transmit on rising edge of SCK SSPM <3:0 > 0010 SPI Master , clk = OSC /64 = > (4 MHz )/64 = Estado del m o dulo SSP SMP 0 Input data sampled at middle CKE 1 Data on rising edge of SCK ( CKP =0) D/A 0 - i2c only P 0 - i2c only S 0 - i2c only R/W 0 - i2c only -

SSPSTAT = B01000000 ;

Cap tulo 1. Pr actica: Comunicaci on SPI


89 90 91 92 93 94 95 96 97 98 99

5
0 0 - i2c only Ocupado - read only -

// UA // BF Escribe_25LC16 ( 0 , 0 x33 ); t = Lee_25LC16 ( 0 ); PORTA = t ; Escribe_uC_Slave ( 0 x44 ); }

while (1);

Programa del PIC esclavo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

# include < pic .h > # include " binario . h "


// Para el PIC16F88 __CONFIG ( WDTDIS & INTIO & UNPROTECT & PWRTDIS & CCPRB0 & DEBUGDIS & LVPDIS & BORDIS & MCLRDIS ); // Palabra de configuraci o n 0 x2007 __CONFIG ( FCMDIS & IESODIS ); // Palabra de configuraci o n 0 x2008 {

void main ()
= 0; 76543210 TRISB = B00111011 ; // TRISB1 = 1; // TRISB2 = 0; // TRISB4 = 1; // TRISB5 = 1; RBPU = 1; TRISA = 0; //

ANSEL

// Configuro el PORTA como digital input output input input ( slave mode ) // Pull - ups desactivados // Puerto A son salidas // // // // // // // // // // // // // // // // Control del modulo SSP WCOL 0 No collision SSPOV 0 No overflow SSPEN 1 Disables SSP CKP 0 Transmit on rising edge of SCK SSPM <3:0 > 0100 SPI Slave , SCK & / SS actives Estado del m o dulo SSP SMP 0 Input data sampled at middle CKE 1 Data on rising edge of SCK ( CKP =0) D/A 0 - i2c only P 0 - i2c only S 0 - i2c only R/W 0 - i2c only UA 0 - i2c only BF 0 Ocupado - read only // // // // RB1 / SDI RB2 / SDO RB4 / SCK RB5 // SS

SSPBUF = 0; SSPCON = B00100101 ;

SSPSTAT = B01000000 ;

while (1) { if ( BF ) // Dato recibido { PORTA = SSPBUF ; // Lo saco fuera } }


}

You might also like