Está en la página 1de 39

COMUNICACIONES

SPI
MODULO MSSP PIC16F883

SPI (Serial Port Interface)


Protocolo de comunicaciones a nivel de PCB.
Basado en una arquitectura maestro/esclavo.
Utiliza las lneas:
SDO: Serial data out, tambin conocida como
MOSI (Master Output, Slave Input).
SDI: Serial data in, tambin conocida como MISO
(Master Input, Slave Output).
SCK: Serial Clock.
SS: Slave select,

SPI (Serial Port Interface)


El direccionamiento lo realiza
el
maestro
utilizando
las
seales de SS (slave select).
Solo el esclavo seleccionado
puede controlar la lnea MISO,
los otros esclavos se aislan de
esta (tri-state).
La comunicacin es fullduplex, simultaneamente es
posible transmitir y recibir un
dato.

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A7 A6 A5 A4 A3 A2 A1 A0
CLK
Generato
r

MAESTRO

SHIFT REGISTER
MISO

B7 B6 B5 B4 B3 B2 B1 B0

CLK
SS

ESCLAVO

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A6 A5 A4 A3 A2 A1 A0 B7
CLK
Generato
r

SHIFT REGISTER
MISO

B6 B5 B4 B3 B2 B1 B0 A7

CLK
SS

MAESTRO

Despus del primer pulso de

ESCLAVO

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A5 A4 A3 A2 A1 A0 B7B6
CLK
Generato
r

SHIFT REGISTER
MISO

B5 B4 B3 B2 B1 B0

CLK
SS

MAESTRO

Despus del segundo pulso

ESCLAVO

A7

A6

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A4 A3 A2 A1 A0 B7
CLK
Generato
r

SHIFT REGISTER
MISO

B6 B5

B4 B3 B2 B1 B0

A7

CLK
SS

MAESTRO

Despus del tercero pulso de

ESCLAVO

A6

A5

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A3 A2 A1 A0 B7

SHIFT REGISTER
MISO

B6 B5 B4

CLK
Generato
r

B3 B2 B1 B0

A7

A6

CLK
SS

MAESTRO

Despus del cuarto pulso de

ESCLAVO

A5 A4

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A2 A1 A0 B7

SHIFT REGISTER
MISO

B6 B5 B4 B3

CLK
Generato
r

B2 B1 B0

A7

A6

A5 A4 A3

CLK
SS

MAESTRO

Despus del quinto pulso de

ESCLAVO

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A1 A0 B7

SHIFT REGISTER
MISO

B6 B5 B4 B3 B2

CLK
Generato
r

B1 B0

A7

A6

A5 A4 A3 A2

CLK
SS

MAESTRO

Despus del sexto pulso de

ESCLAVO

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
A0 B7

SHIFT REGISTER
MISO

B6 B5 B4 B3 B2 B1

CLK
Generato
r

B0

A7

A6

A5 A4 A3 A2 A1

CLK
SS

MAESTRO

Despus del septimo pulso

ESCLAVO

SPI (Serial Port Interface)


MOSI
SHIFT REGISTER
B7

SHIFT REGISTER
MISO

B6 B5 B4 B3 B2 B1 B0

CLK
Generato
r

A7

A6

A5 A4 A3 A2 A1 A0

CLK
SS

MAESTRO

Despus del octavo pulso de

ESCLAVO

SPI TIMING
Luego de la
transmisin de una
palabra (8 o 16
bits), la lnea de SS
se lleva a 1 para
terminar la
transmisin, incluso
si luego se continua
transmitiendo al
mismo esclavo.
Existen cuatro
modos de reloj.
Dependen de cual
es el estado del
reloj en inactividad
(0 1) y el flanco
de reloj en el que
se capturarn los
datos (subida o

MODULO SSP PIC16F883


MODO SPI MAESTRO

MODULO MSSP (SPI


MAESTRO)
Buffer, accesible por
programacin
Shift register (no directamente
accesible)
Control de salida SDO, la seal
SS influye solo en modo
esclavo.

Generador del reloj (en modo


maestro) entrada del reloj
(en modo esclavo).

PINES UTILIZADOS

Solo
modo
esclavo

Modos
maestro
y
esclavo

CONFIGURACIN DEL MDULO MSSP


SPI MAESTRO
Puertos

SELECCIN DEL MODO

Modo y
frecuencia de
reloj

SELECCIN DEL TIPO DE


RELOJ

INICIALIZACIN DEL
MDULO SPI
void SPI_init(void)
{
TRISCbits.TRISC3=0;
TRISCbits.TRISC4=1;
controlled
TRISCbits.TRISC5=0;

//SCK is an output.
//Optional, SDI is module
//SDO is an output

SSPSTAT=0;
SSPCON2=0;
SSPCONbits.SSPM=0b0001;
//SSP module is SPI master.
//Rate is Fosc/16=250Khz.
SSPCONbits.CKP=0;
SSPSTATbits.CKE=1;
SSPSTATbits.SMP=0;

SSPCONbits.SSPEN=1;
}

//Selects clock mode.

//Enables serial port

ENVIO Y RECEPCIN DE DATOS VIA


SPI
Seleccin

ENVIO Y RECEPCIN DE DATOS VIA


SPI
unsigned char SPI_Send_Receive_Byte(unsigned char data)
{
PIR1bits.SSPIF=0;
SSPBUF=data;
while(PIR1bits.SSPIF==0);
return SSPBUF;
}

Si se desea solo enviar datos se descarta el dato


recibido.
Si se desea solo recibir datos se envia un dato sin
significado Dummy data
Esta rutina no maneja la lnea de seleccin de
esclavo, dicha lnea debe ser activada

MANEJO DEL DAC


MCP4921
USANDO PUERTO SPI

MCP4921

Digital to Analog Converter, 12 bits. Single Channel.


Interfaz SPI hasta 20Mhz.
Referencia de voltaje externa.
Rango: 0 a Vref 0 a 2*Vref.

Puerto
SPI
CS = SS

Pin
sincronizacin:
permite
sincronizar las
actualizaciones
del DAC entre
dispositivos.
Si no se desea
sincronizar

MCP4921

CONFIGURACIN DEL
MCP4921

El DAC recibe una palabra de 16 bits,


indicando la configuracin y el valor
a convertir.

Dato a
convertir

CONFIGURACIN DEL
MCP4921

El DAC recibe una palabra de 16 bits,


indicando la configuracin y el valor
a convertir.

Shutdown: Si este bit es


cero se desactiva la salida
del convertidor.

CONFIGURACIN DEL
MCP4921

El DAC recibe una palabra de 16 bits,


indicando la configuracin y el valor
a convertir.

Ganancia del amplificador de


salida:
0 = Ganancia 1 = Rango 0 Vref
1= Ganancia 2 = Rango 0
2*Vref

CONFIGURACIN DEL
MCP4921

El DAC recibe una palabra de 16 bits,


indicando la configuracin y el valor
a convertir.

Buffer de Vref:
0 = Referencia sin buffer: Vref
puede llegar hasta Vdd.
1= Referencia con buffer: Alta
impedancia de Vref, menor rango
(Vdd-40mV.

RUTINA PARA ESCRITURA EN EL DAC


void MCP4921_Write(unsigned char mode,unsigned int data)
{
unsigned char HighByte, LowByte;
LowByte=(unsigned char)(data&0xFF);
HighByte=(unsigned char)((data&0x0F)>>8) + (mode<<4);
MCP4921_CS=0; //Selects the chip
SPI_Send_Receive_Byte(HighByte); //Sends the high byte of
word
SPI_Send_Receive_Byte(LowByte); //Sends the low byte of word
MCP4921_CS=1; //Releases chip
}

MANEJO DE LA MEMORIA
EEPROM SPI
25LC256

25LC256
La familia 25xx (MICROCHIP) consiste
de memorias eeprom con interfaz
serie SPI.
25LC256 = 256Kbits = 32Kregistros
x 8 bits.

OPERACIONES

OPERACIONES (II)

OPERACIONES (III)

OPERACIONES (IV)
Memoria
ocupada
Durante
escritura
1 = Ocupada
0 = Libre.

OPERACIONES (V)

LIBRERA PARA EL CONTROL DE


MEMORIA 25LC256
void EE25LC256_init(void)
{
EE25LC256_CS_TRIS=0;
EE25LC256_CS=1;
SPI_init();
}

void EE25LC256_Write(unsigned int address, unsigned char data)


{
unsigned char address_high, address_low;
address_high=(unsigned char)(address>>8);
address_low=(unsigned char)((address&0xFF));
EE25LC256_CS=0; //Selects the chip
SPI_Send_Receive_Byte(0b00000110); //Sends the write enable instruction.
EE25LC256_CS=1; //Deselects chip
EE25LC256_CS=0; //Selects the chip
SPI_Send_Receive_Byte(0b00000010); //Sends the write instruction.
SPI_Send_Receive_Byte(address_high); //Sends the high byte of address
SPI_Send_Receive_Byte(address_low); //Sends the low byte of address
SPI_Send_Receive_Byte(data); //Sends the data
EE25LC256_CS=1;
}

LIBRERA PARA EL CONTROL DE


MEMORIA 25LC256
unsigned char EE25LC256_Read(unsigned int address)
{
unsigned char address_high, address_low;
unsigned char data;
address_high=(unsigned char)(address>>8);
address_low=(unsigned char)((address&0xFF));
EE25LC256_CS=0; //Selects the chip
SPI_Send_Receive_Byte(0b00000011); //Sends the read instruction.
SPI_Send_Receive_Byte(address_high); //Sends the high byte of address
SPI_Send_Receive_Byte(address_low); //Sends the low byte of address
data=SPI_Send_Receive_Byte(0x00); //Receive the data, send dummy data.
EE25LC256_CS=1;
return data;
}
unsigned char EE25LC256_Is_Busy(void)
{
unsigned char status;
EE25LC256_CS=0; //Selects the chip
SPI_Send_Receive_Byte(0b00000101); //Sends the read status instruction.
status=SPI_Send_Receive_Byte(0x00); //receive the status byte
EE25LC256_CS=1;
return status&0x1;
}