COMUNICACIONES
SPIMODULO MSSP PIC16F883
SPI (Serial Port Interface)
• Protocolo de comunicaciones a nivel de PCB.• Basado en una arquitectura maestro/esclavo.• Utiliza las líneas:– SDO: Serial data out, también conocida como
MOSI (Master Output, Slave Input).– SDI: Serial data in, también 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 señales de SS (slave select).
•Solo el esclavo seleccionado puede controlar la línea MISO, los otros esclavos se aislan de esta (tri-state).
•La comunicación es full-duplex, simultaneamente es posible transmitir y recibir un dato.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A7 A6 A5 A4 A3 A2 A1 A0
SHIFT REGISTER
B7 B6 B5 B4 B3 B2 B1 B0MISO
CLK Generator
CLK
SS
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A6 A5 A4 A3 A2 A1 A0 B7
SHIFT REGISTER
B6 B5 B4 B3 B2 B1 B0 A7MISO
CLK Generator
CLK
SS
Después del primer pulso de reloj.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A5 A4 A3 A2 A1 A0 B7 B6
SHIFT REGISTER
B5 B4 B3 B2 B1 B0 A7 A6MISO
CLK Generator
CLK
SS
Después del segundo pulso de reloj.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A4 A3 A2 A1 A0 B7 B6 B5
SHIFT REGISTER
B4 B3 B2 B1 B0 A7 A6 A5MISO
CLK Generator
CLK
SS
Después del tercero pulso de reloj.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A3 A2 A1 A0 B7 B6 B5 B4
SHIFT REGISTER
B3 B2 B1 B0 A7 A6 A5 A4MISO
CLK Generator
CLK
SS
Después del cuarto pulso de reloj.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A2 A1 A0 B7 B6 B5 B4 B3
SHIFT REGISTER
B2 B1 B0 A7 A6 A5 A4 A3MISO
CLK Generator
CLK
SS
Después del quinto pulso de reloj.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A1 A0 B7 B6 B5 B4 B3 B2
SHIFT REGISTER
B1 B0 A7 A6 A5 A4 A3 A2MISO
CLK Generator
CLK
SS
Después del sexto pulso de reloj.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
A0 B7 B6 B5 B4 B3 B2 B1
SHIFT REGISTER
B0 A7 A6 A5 A4 A3 A2 A1MISO
CLK Generator
CLK
SS
Después del septimo pulso de reloj.
SPI (Serial Port Interface)
MAESTRO ESCLAVO
MOSI
SHIFT REGISTER
B7 B6 B5 B4 B3 B2 B1 B0
SHIFT REGISTER
A7 A6 A5 A4 A3 A2 A1 A0MISO
CLK Generator
CLK
SS
Después del octavo pulso de reloj.
SPI TIMING
Luego de la transmisión de una palabra (8 o 16 bits), la línea de SS se lleva a 1 para terminar la transmisión, 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 capturarán los datos (subida o bajada).
MODULO SSP PIC16F883
MODO SPI MAESTRO
MODULO MSSP (SPI MAESTRO)
Shift register (no directamente accesible)
Buffer, accesible por programación
Control de salida SDO, la señal SS influye solo en modo esclavo.
Generador del reloj (en modo maestro) ó entrada del reloj (en modo esclavo).
PINES UTILIZADOS
Modos maestro y
esclavo
Solo modo esclavo
CONFIGURACIÓN DEL MÓDULO MSSP SPI MAESTRO
Puertos•El pin SDI es controlado por el módulo, no es necesario configurarlo.•El pin SDO debe ser salida.•El pin SCK debe ser salida (entrada si se trata del esclavo).•El pin SS no se utiliza en modo esclavo.
Modo •Configurar el modo maestro utilizando el registro SSPCON•Definir la frecuencia de reloj
Reloj •Definir el tipo de reloj (fase, estado inactivo, punto muestreo)
ON •Activar el módulo SSP (bit SPEN)
SELECCIÓN DEL MODO
Modo y frecuencia de reloj
SELECCIÓN DEL TIPO DE RELOJ
INICIALIZACIÓN DEL MÓDULO SPIvoid SPI_init(void){ TRISCbits.TRISC3=0; //SCK is an output. TRISCbits.TRISC4=1; //Optional, SDI is module controlled TRISCbits.TRISC5=0; //SDO is an output
SSPSTAT=0; SSPCON2=0; SSPCONbits.SSPM=0b0001; //SSP module is SPI master. //Rate is Fosc/16=250Khz. SSPCONbits.CKP=0; //Selects clock mode. SSPSTATbits.CKE=1; SSPSTATbits.SMP=0;
SSPCONbits.SSPEN=1; //Enables serial port
}
ENVIO Y RECEPCIÓN DE DATOS VIA SPI
Selección •Seleccionar el esclavo poniendo en cero su señal SS.•Esto se realiza independiente del módulo, usando un pin GPIO
Bandera •Limpiar bandera SSPIF
Escritura •Cargar el dato a transmitir en SSPBUF.•Inmediatamente se comienza a generar el reloj.
Bandera •Esperar que se active la bandera SSPIF.•Esto indica el fin de la transferencia entre registros
Lectura •Leer el contenido de SSPBUF, ahora contiene los datos enviados por el esclavo.
Selección •Liberar el esclavo poniendo en 1 el pin SS.
ENVIO Y RECEPCIÓN 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 línea de selección de esclavo, dicha línea debe ser activada externamente a esta función.
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 SPICS = SS
Pin sincronización: permite sincronizar las actualizaciones del DAC entre dispositivos.Si no se desea sincronizar puede llevarse a 0v
MCP4921
CONFIGURACIÓN DEL MCP4921• El DAC recibe una palabra de 16 bits,
indicando la configuración y el valor a convertir.
Dato a convertir
CONFIGURACIÓN DEL MCP4921• El DAC recibe una palabra de 16 bits,
indicando la configuración y el valor a convertir.
Shutdown: Si este bit es cero se desactiva la salida del convertidor.
CONFIGURACIÓN DEL MCP4921• El DAC recibe una palabra de 16 bits,
indicando la configuración y el valor a convertir.
Ganancia del amplificador de salida: 0 = Ganancia 1 = Rango 0 – Vref1= Ganancia 2 = Rango 0 – 2*Vref
CONFIGURACIÓN DEL MCP4921• El DAC recibe una palabra de 16 bits,
indicando la configuración 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 ocupadaDurante escritura1 = Ocupada0 = Libre.
OPERACIONES (V)
LIBRERÍA 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;}
LIBRERÍA 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;}