Está en la página 1de 13

INTERCONEXIN SERIAL SPI

MDULO SPI DEL PIC16F887

SPI son las siglas de Serial Peripheral Interface. Se trata de un Bus desarrollado por
Motorola para implementar la comunicacin entre dispositivos de un mismo circuito
impreso, que rpidamente fue adoptado por muchos fabricantes llegando a ser, al igual que
el I2C, eso que ha dado llamarse estndar de facto, en razn de su sencillez y eficiencia.
La figura 1muestra el esquema de Bus SPI.

Master

SCLK

SCLK

MOSI

MOSI

MISO

MISO

SS1

Slave

SS

SS2
SSn

SCLK
MOSI

Slave

MISO
SS

SCLK
MOSI

Slave

MISO
SS

Fig. 1 Esquema general del Bus SPI

En la figura 1 se distinguen las siguientes seales:


-

SCLK (Serial Clock): Es el reloj o seal de sincronizacin generada por el Maestro.

MOSI (Master Output Slave Input): Es el canal por el cual el dispositivo Maestro
enva informacin a los Esclavos.

MISO (Master Input Slave Output): Es el canal utilizado por los perifricos
(Esclavos) para comunicarse con el Maestro.

SSx (Slave Select): Son las mltiples lneas utilizadas por el Maestro para
seleccionar al Esclavo con cual se entabla la comunicacin. Su nmero es variable y
depende de la cantidad de perifricos conectados al Bus.

A diferencia del BUS I2C en el SPI no se requiere un protocolo o trama de bits para llevar a
cabo los procesos de lectura y escritura, pues la existencia de mltiples lneas de seleccin
(complejidad del hardware) se compensa con una simplificacin del software.
En el PIC16F887 se implementa un mdulo para comunicacin mediante el Bus SPI, a
travs de los siguientes pines:
-

SDI (Serial Data Input): Es el canal de entrada de datos (MISO en caso de que el
PIC se configure como Maestro; o MOSI, si es configurado como Esclavo).

SDO (Serial Data Output): Es el canal de salida de datos.

SCK (Serial Clock): El reloj establecido por el Maestro.

SS (Slave Select): Seal de habilitacin para el PIC, cuando se le ha configurado


como Esclavo.

De todo lo anterior se desprende que el PIC debe ser configurado como Maestro o Esclavo
antes de iniciar su interaccin con otros dispositivos conectados al Bus. Esto se logra
mediante varios registros de propsito especfico y la escritura consciente de sus bits, mas
este procedimiento queda prcticamente velado cuando se realiza la programacin con un
lenguaje de alto nivel, donde el uso de ciertas rutinas simplifica todo el procedimiento,
como se ver ms adelante.

COMUNICACIN ENTRE DOS PIC16F887 MEDIANTE EL BUS SPI.

Objetivo: Disear un sistema donde dos PIC se comuniquen mediante el BUS SPI.

El objetivo planteado se cumplir en un circuito que har lo siguiente:

El PIC Maestro realiza continuamente la digitalizacin de una seal analgica

El PIC Maestro verifica continuamente el estado de una entrada digital. Cuando esta
ltima se active ha de establecerse la comunicacin va SPI con el PIC Esclavo.

El PIC Esclavo espera su seleccin por parte del Maestro.

Cuando ha sido seleccionado, el Esclavo recibe el dato y lo muestra en una LCD.

El diagrama de bloques del circuito a disear es el de la figura 2.

Vin
A/D

Inicio de la
transmisin

Mdulo SPI

SDO

Microcontrolador Master

SCk

SDI

Mdulo SPI

SS

LCD

Microcontrolador Slave

Fig. 2 Diagrama de bloques: Sistema de Comunicacin entre dos PIC va SPI.

SEAL INICIO DE LA TRANSMISIN

Se trata de una seal digital implementada mediante un pulsador. En la figura 3 se observa


a dicho pulsador con la etiqueta Enter, nombre correspondiente a la variable booleana
con la que se decidir el inicio de la transmisin.

R3
10k

Recibiendo

VSS

Fig. 3 Seal de Inicio de la transmisin

MICROCONTROLADORES MAESTRO Y ESCLAVO

En los ejemplos anteriores se ha obviado la descripcin del bloque correspondiente al


microcontrolador, ya que se ha dedicado un captulo previo a este dispositivo. No obstante
ahora se hace la excepcin ya que se utilizarn dos microcontroladores con diferentes
configuraciones. Sin extender innecesariamente este punto se muestran en las figuras 4 y
8.5 los detalles de los pines que implementarn al grupo de seales ya descritas en los
microcontroladores que fungirn de Maestro y Esclavo, respectivamente.

U1
2
3
4
5
6
7
14
13
33
34
35
36
37
38
39
40

Vdd

15
16
17
18
23
24
25
26

RE3/MCLR/VPP

RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RA0/AN0/ULPWU/C12IN0RC2/P1A/CCP1
RA1/AN1/C12IN1RC3/SCK/SCL
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
RA3/AN3/VREF+/C1IN+
RC5/SDO
RA4/T0CKI/C1OUT
RC6/TX/CK
RA5/AN4/SS/C2OUT
RC7/RX/DT
RA6/OSC2/CLKOUT
RA7/OSC1/CLKIN
RD0
RD1
RB0/AN12/INT
RD2
RB1/AN10/C12IN3RD3
RB2/AN8
RD4
RB3/AN9/PGM/C12IN2RD5/P1B
RB4/AN11
RD6/P1C
RB5/AN13/T1G
RD7/P1D
RB6/ICSPCLK
RB7/ICSPDAT
RE0/AN5
RE1/AN6
RE2/AN7

19
20
21
22
27
28
29
30

Enter

8
9
10

PIC16F887

R5
+88.8
51%

R4

330

Volts

330

D1

D2

Transmitiendo

Recibiendo

VSS

Fig. 4 Seales del Bus SPI en el PIC Maestro

Sobre las seales observables en la figura 4:


-

RA0 (AN0): Entrada analgica a digitalizar

RD0: Entrada digital para inicio de la transmisin (Enter).

RC0: Salida digital para habilitar al microcontrolador Esclavo.

RC3 (SCK): Reloj del Bus.

RC5 (SD0): Seal MOSI, salida de datos del microcontrolador Maestro.

SS (Slave Slect)

U2
15
16
17
18
23
24
25
26
19
20
21
22
27
28
29
30
8
9
10

RC0/T1OSO/T1CKI
RE3/MCLR/VPP
RC1/T1OSI/CCP2
RC2/P1A/CCP1
RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL
RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+
RC5/SDO
RA3/AN3/VREF+/C1IN+
RC6/TX/CK
RA4/T0CKI/C1OUT
RC7/RX/DT
RA5/AN4/SS/C2OUT
RA6/OSC2/CLKOUT
RD0
RA7/OSC1/CLKIN
RD1
RD2
RB0/AN12/INT
RD3
RB1/AN10/C12IN3RD4
RB2/AN8
RD5/P1B
RB3/AN9/PGM/C12IN2RD6/P1C
RB4/AN11
RD7/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RE0/AN5
RB7/ICSPDAT
RE1/AN6
RE2/AN7

1
2
3
4
5
6
7
14
13
33
34
35
36
37
38
39
40

PIC16F887

Fig. 5 Seales del Bus SPI en el PIC Esclavo

Sobre las seales observables en la figura 5:


-

RB0: RB5: Seales para manejo de la LCD.

RC4 (SDI): Seal MOSI, entrada de datos del microcontrolador esclavo.

RC3 (SCK): Entrada de la seal de reloj generada por el microcontrolador Maestro.

RA5 (SS): Entrada de habilitacin del microcontrolador Esclavo. A diferencia de la


seal correspondiente en el microcontrolador Maestro, la asignacin de este pin no
es opcional.

CIRCUITO FINAL SISTEMA DE COMUNICACIN ENTRE DOS PIC VA SPI

A continuacin, el circuito final se muestra en la figura 6.

+5V
20MHz

LCD1
LM032L
10k

VSS

33
34
35
36
37
38
39
40

Vdd

19
20
21
22
27
28
29
30

15
16
17
18
23
24
25
26
19
20
21
22
27
28
29
30

8
9
10

8
9
10
+5V

PIC16F887

RC0/T1OSO/T1CKI
RE3/MCLR/VPP
RC1/T1OSI/CCP2
RC2/P1A/CCP1
RA0/AN0/ULPWU/C12IN0RC3/SCK/SCL
RA1/AN1/C12IN1RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+
RC5/SDO
RA3/AN3/VREF+/C1IN+
RC6/TX/CK
RA4/T0CKI/C1OUT
RC7/RX/DT
RA5/AN4/SS/C2OUT
RA6/OSC2/CLKOUT
RD0
RA7/OSC1/CLKIN
RD1
RD2
RB0/AN12/INT
RD3
RB1/AN10/C12IN3RD4
RB2/AN8
RD5/P1B
RB3/AN9/PGM/C12IN2RD6/P1C
RB4/AN11
RD7/P1D
RB5/AN13/T1G
RB6/ICSPCLK
RE0/AN5
RB7/ICSPDAT
RE1/AN6
RE2/AN7

1
2
3
4
5
6
7
14
13

4
5
6

15
16
17
18
23
24
25
26

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RA0/AN0/ULPWU/C12IN0RC2/P1A/CCP1
RA1/AN1/C12IN1RC3/SCK/SCL
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
RA3/AN3/VREF+/C1IN+
RC5/SDO
RA4/T0CKI/C1OUT
RC6/TX/CK
RA5/AN4/SS/C2OUT
RC7/RX/DT
RA6/OSC2/CLKOUT
RA7/OSC1/CLKIN
RD0
RD1
RB0/AN12/INT
RD2
RB1/AN10/C12IN3RD3
RB2/AN8
RD4
RB3/AN9/PGM/C12IN2RD5/P1B
RB4/AN11
RD6/P1C
RB5/AN13/T1G
RD7/P1D
RB6/ICSPCLK
RB7/ICSPDAT
RE0/AN5
RE1/AN6
RE2/AN7

Enter

2
3
4
5
6
7
14
13

U2

RE3/MCLR/VPP

1
2
3

U1
1

RS
RW
E

VSS
VDD
VEE

SS (Slave Slect)
VSS

+5V

33
34
35
36
37
38
39
40

PIC16F887
A

+88.8
51%

R4

R5

R3

330

10k

B
C

Volts

330

D1

D2

Transmitiendo

Recibiendo

VSS

VSS

Fig. 6 Circuito final del Sistema de conexin entre dos PIC, va SPI

PROGRAMACIN DEL MICROCONTROLADOR MAESTRO

La lgica de control se especifica en el diagrama de flujos de la figura 7.

Inicio

Configuracin:
Asignar Vin (An0), Enter (RD0), Chip_Select (RC0)

Inicializacin
SPI como Master
Chip_Select: Off

Digitalizacin
Dato
Adq Vin

No

Enter

Si
Chip_Select: On

Chip_Select: On

Pausa para inicio de


lectura en el Esclavo

Pausa para inicio de


lectura en el Esclavo

SPI_Write (2 Msb Dato)

SPI_Write (8 Lsb Dato)

Pausa para fin de lectura


en el Esclavo

Pausa para fin de lectura


en el Esclavo

Chip_Select: Off

Chip_Select: Off

Pausa entre Bytes

Fig. 7 Diagrama de Flujo: Adquisicin y escritura desde el Maestro

Las rutinas claves de mikroC son:

- void SPIx_Init_Advanced(unsigned short master_slav, unsigned short data_sample,


unsigned short clock_idle, unsigned short transmit_edge): Inicializa el Bus SPI. La gran
cantidad de parmetros que requiere ameritan una descripcin ms detallada.

Master/slave mode: _SPI_MASTER_OSC_DIV64, para inicializar al PIC como el


Maestro del Bus; SPI_SLAVE_SS_ENABLE, para inicializarlo como Esclavo.

Data Sampling: Determina si el dato colocado en el bus es tomado (ledo) a la mitad


(_SPI_DATA_SAMPLE_MIDDLE) o al final (_SPI_DATA_SAMPLE_END) del
tiempo correspondiente a un bit, de acuerdo con la pauta impuesta por la seal de
reloj.

Clock IDLE: Sirve para fijar el estado de reposo Idle de la lnea de datos.
_SPI_CLK_IDLE_LOW, si se establece como 0, o _SPI_CLK_IDLE_HIGH, si
se establece como 1.

Transmit Edge: Fija el flanco de la seal de reloj con el cual ha de considerarse


vlido cada dato. _SPI_LOW_2_HIGH, para el cambio de la condicin activa a la
de reposo en la lnea de datos; o _SPI_HIGH_2_LOW, para el cambio opuesto.

En este programa se ha utilizado esta rutina de la forma siguiente:


SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64,

_SPI_DATA_SAMPLE_MIDDLE,

_SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
- void SPIx_Write (unsigned data_out): Solo requiere que se especifique el dato a ser
transmitido serialmente en el Bus.

sbit Chip_Select at RC0_bit;


sbit Chip_Select_Direction at TRISC0_bit;
sbit Enter at RD0_bit;
sbit Transmit at RD1_bit;
// End connections
void InitMain() {
TRISA0_bit = 1;
// Set RA0 pin as input
//TRISC = 0;
// Set CS# pin as Output
TRISD = 0x01;
// Puerto D para seales digitales
Transmit = 0;
Chip_Select = 1;
// Deselect DAC
Chip_Select_Direction = 0;
// Set CS# pin as Output
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW,
_SPI_LOW_2_HIGH);
}

void main() {
unsigned int Dato;
char temp;
ANSEL = 1;
InitMain();
//Chip_Select = 0;
while(1) {
Dato= ADC_Read(0);
if (Enter == 0) {
temp = (Dato>>8)&0x03;
Chip_Select = 0;
Transmit = 1;
Delay_ms(1);
SPI1_Write(temp);
Delay_ms(1);
Transmit = 0;
Chip_Select = 1;
Delay_ms(10);
temp = Dato;
Chip_Select = 0;
Transmit = 1;
Delay_ms(1);
SPI1_Write(temp);
Delay_ms(1);
Transmit = 0;
Chip_Select = 1;
}
}
}

// RA0 analgica
// Perform main initialization
// Select Slave

// Se adquiere el Dato
// Se preparan los 2 MSbits
// Select Slave
// Indica transmisin
// Tiempo para polling en el esclavo

// Deselect Slave
// pausa entre bytes
// Se prepara LSByte
// Select Slave
// Tiempo para polling en el esclavo

// Deselect Slave

PROGRAMACIN DEL MICROCONTROLADOR ESCLAVO

As como en el caso del Maestro, es necesario proceder con el Esclavo, considerando por
supuesto, la complementaridad de la lgica (figura 8).

Inicio

Configuracin:
PortB: Ctrl LCD, Todas las seales digitales

No

Chip_Select:
Si

Inicializacin
SPI como Esclavo
Dato

No

SPI_Read

Chip_Select:
Dato

Dato + temp

Si
temp

SPI_Read
Tensin equivalente
X
Vref*Dato/1024

temp

(temp<<8)&0x0300
Mostrar X

Fig. 8 Diagrama de Flujo Recepcin en el Esclavo

En el caso del PIC Esclavo los parmetros de inicializacin del Bus se diferencian porque
el Master/Salve mode ha de establecerse como _SPI_SLAVE y el Slave Select
Enable/Disable en _SPI_SS_ENABLE. La lnea de cdigo queda como sigue:

SPI1_Init_Advanced(_SPI_SLAVE_SS_ENABLE,
_SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);

_SPI_DATA_SAMPLE_MIDDLE,

Aparte de la inicializacin lo ms importante del algoritmo mostrado en la figura 8 es la


rutina de lectura. La sintaxis de esta rutina en mikroC es unsigned SPIx_Read(unsigned
buffer); y la lnea de cdigo escrita es:
temp = SPI_Read(buffer)

SIMULACIN DEL SISTEMA DE CONEXIN ENTRE DOS PIC, VA SPI

Se listan a continuacin un conjunto de acciones realizadas durante el proceso de


simulacin junto a las correspondientes imgenes ilustrativas del funcionamiento del
circuito.
-

Se establece una tensin de entrada al convertidor A/D del PIC Maestro, mediante
el potencimetro RV2.

Cuando se desee se da inicio a la transmisin del dato mediante el pulsador Enter.

Al cabo de unos breves milisegundos la LCD controlada por el PIC Esclavo,


mostrar el valor de tensin elegido

unsigned int Dato;


char temp, buffer;
float Datof;
char txt[14];
sbit Chip_Select at RA5_bit;
sbit Chip_Select_Direction at TRISA5_bit;
sbit Recib at RD1_bit;
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;

sbit LCD_D7_Direction at TRISB3_bit;


// End LCD module connections
void main() {
TRISC = 0xFF;
TRISD = 0;
// LED de recepcin
Recib = 0;
Chip_Select_Direction = 1;
// Set CS# pin as Input. Redundnte
ANSEL = 0;
// Puerto a digital
ANSELH = 0;
// Puerto B, digital
Lcd_Init();
// Initialize LCD
Lcd_Cmd(_LCD_CURSOR_OFF);
// Cursor off
Lcd_Cmd(_LCD_CLEAR);
// Clear display
Lcd_Out(1, 1, "** Dato Recibido **");
// Configuracin como Slave
// Fin Configuracin Slave
Lcd_Out(2,15, "V");
SPI1_Init_Advanced(_SPI_SLAVE_SS_ENABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW,
_SPI_LOW_2_HIGH);
do {

do {
} while (Chip_Select == 1);
Recib = 1; // Recepcin activa
temp = SPI1_Read(buffer);
Recib = 0;
Dato = temp;
Dato = (Dato<<8)&0x0300; // Se captaron los 2 MSbits
do {
} while (Chip_Select == 1);
Recib = 1;
// Recepcin activa
temp = SPI1_Read(buffer);
Recib = 0;
Dato = Dato + temp;
// Se disponen de los 10 bits
Datof = (float)Dato*5/1024; // Valor decimal equivalente de la conversin
floattoStr(Datof,txt);
Lcd_Out(2,1,"
");
Lcd_Out(2,1,txt);
}while(1);
}

También podría gustarte