Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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).
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.
Objetivo: Disear un sistema donde dos PIC se comuniquen mediante el BUS SPI.
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.
Vin
A/D
Inicio de la
transmisin
Mdulo SPI
SDO
Microcontrolador Master
SCk
SDI
Mdulo SPI
SS
LCD
Microcontrolador Slave
R3
10k
Recibiendo
VSS
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
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
+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
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
Chip_Select: Off
Chip_Select: Off
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.
_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.
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
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
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,
Se establece una tensin de entrada al convertidor A/D del PIC Maestro, mediante
el potencimetro RV2.
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);
}