Sei sulla pagina 1di 23

Curso: MICROCONTROLADORES

Semana 13
El módulo SPI (Serial Peripheral Interface) y el módulo I2C del
PIC18F4550

Mag. Ing. Sergio Salas A.


El protocolo SPI
La Interfaz serial periférica SPI (Serial Peripheral Interface) es un protocolo
de comunicación serial síncrono creado por la compañía Motorola que se
ha convertido en un estándar de comunicación en la gran mayoría de
sistemas embebidos. El protocolo SPI permite la comunicación de un
sistema embebido con uno o varios dispositivos periféricos a través de un
bus de comunicación compartido. Cada año aparecen nuevos dispositivos
periféricos con este protocolo de comunicación, entre los dispositivos más
comunes se tienen acelerómetros, memorias EEPROM, relojes en tiempo
real, memorias SD, conversores analógicos digitales y otros más. Por esta
razón, conocer la correcta configuración del módulo SPI de un sistema
embebido permite integrar una gran cantidad de dispositivos externos a un
proyecto de diseño digital.

Mag. Ing. Sergio Salas A.


Fundamentos del bus SPI

Mag. Ing. Sergio Salas A.


Líneas de comunicación del bus SPI

• SCK: Señal de reloj generada siempre por el MAEST RO y recibida por el


ESCLAVO.

• SDO: Serial Data Output. Señal generada por el MAESTRO que será recibida
por el esclavo. Por esta línea el MAESTRO transmite los datos en bloques de
8 bits.

• SDI: Serial Data Input. Señal generada por el ESCLAVO y recibida por el
MAESTRO. Se encuentra sincronizada con los pulsos de reloj de SCK. Se
transmite en formato Full dúplex junto con la señal SDO.

• CS: Chip Select. Esta línea permite habilitar a un dispositivo ESCLAVO para
la comunicación con el MAESTRO. Solo un dispositivo ESCLAVO puede
estar a activo a la vez. Por lo general está línea activa con nivel ‘0’ lógico.

Mag. Ing. Sergio Salas A.


Formatos de transmisión del SPI

Mag. Ing. Sergio Salas A.


El módulo SPI del PIC18F4550

Mag. Ing. Sergio Salas A.


El registro SSPSTAT

Bit SMP: Este bit permite definir el momento en el cual se realizará el muestreo de la
línea de datos SDI cuando el módulo SPI se encuentra configurado en modo maestro.
Si SMP es ‘1’ lógico el muestreo se realiza al finalizar el periodo de reloj de la señal.
En caso el bit sea ‘0’ lógico el muestreo es realizado a la mitad del periodo (tal como
aparece indicado en la Figura 12.2). En modo esclavo este bit debe estar fijado en nivel
‘0’ lógico.
Bit CKE: Este bit permite configurar el flanco activo para la generación del bit en SDO.
Si CKE es ‘1’ lógico la transmisión ocurre en la transición de reloj activo a estado de
idle y en caso contrario la transición será de estado de idle a estado activo del reloj.
Los bits D/A, P, S, R/W y UA solo tienen efecto en el modo de operación I2C y serán
explicados en el siguiente capítulo.
Bit BF: Es la bandera de recepción completa. Esta se pone a nivel ‘1’ lógico cuando el
registro SSPBUF se encuentra lleno y listo para ser leído.

Mag. Ing. Sergio Salas A.


El registro SSPCON1
Bit SSPOV: Este bit indica el estado de desbordamiento en la recepción del dato. Esto
significa que se ha recibido un byte por el pin SDI y este byte ha desplazado el valor
anterior de SSPBUF el cual no fue previamente leído.
Bit SSPEN: Este bit permite activar al módulo SPI haciendo que las líneas SCK, SDO
y SDI se comporten como pines seriales. Si este bit es ‘1’ lógico el módulo se encontrará
activo.
Bit CKP: Este bit permite configurar la polaridad del reloj. Si CKP es ‘1’ lógico
entonces el estado de Idle será un nivel alto, mientras que si CKP es ‘0’ lógico el estado
de Idle será bajo.
Bits SSPM3:SSPM0
SSPM3 SSPM2 SSPM1 SSPM0 Configuración
0 0 0 0 SPI en modo maestro. La frecuencia de reloj será FOSC/4
0 0 0 1 SPI en modo maestro. La frecuencia de reloj será FOSC/16
0 0 1 0 SPI en modo maestro. La frecuencia de reloj será FOSC/64
0 0 1 1 SPI en modo maestro. La frecuencia de reloj será la
salida de TMR2/2
0 1 0 0 SPI en modo esclavo. La habilitación se obtiene por el
pin RA5
0 1 0 1 SPI en modo esclavo sin habilitación por el pin RA5
Mag. Ing. Sergio Salas A.
Librería SPI.h
#define SPI_CLOCK_64 2
#define SPI_CLOCK_16 1
#define SPI_CLOCK_4 0
#define MODO_A ‘A’
#define MODO_B 'B'
#define MODO_C 'C'
#define MODO_D 'D'
#define SDI_MIT 0
#define SDI_FIN 1
void INICIO_SPI(char reloj,char modo, char smp);
void TX_SPI(char dato);
char RX_SPI(char dato);

Mag. Ing. Sergio Salas A.


Librería SPI.c
#include <p18F4550.h>
#include "SPI.h" }
SSPCON1bits.SSPEN = 1;
void INICIO_SPI(char reloj,char modo, char smp) }
{
SSPSTATbits.SMP=smp; void TX_SPI(char dato)
SSPCON1 = reloj; {
if(modo == 'A') SSPBUF = dato;
{ while(PIR1bits.SSPIF == 0);
SSPSTATbits.CKE = 1; PIR1bits.SSPIF = 0;
SSPCON1bits.CKP = 1;
} }
else if(modo == 'B')
{ char RX_SPI(char dato)
SSPSTATbits.CKE = 1; {
SSPCON1bits.CKP = 0; SSPBUF = dato;
} while(PIR1bits.SSPIF == 0);
else if(modo == 'C') PIR1bits.SSPIF = 0;
{ dato = SSPBUF;
SSPSTATbits.CKE = 0; return(dato);
SSPCON1bits.CKP = 1; }
}
else if(modo == 'D')
{
SSPSTATbits.CKE = 0;
SSPCON1bits.CKP = 0; Mag. Ing. Sergio Salas A.
Ejemplo de medición de temperatura con
el sensor TC72

Mag. Ing. Sergio Salas A.


La interfaz I2C
El protocolo I2C fue una invención de la empresa Philips Semiconductor específicamente
para aplicaciones de audio y video. Este estándar se basa en el uso de dos líneas (SDA y
SCL) que transportan datos de forma bidireccional entre dos o más circuitos integrados.
El nombre I2C proviene del hecho que el protocolo comunica Circuitos integrado en un
bus de 2 líneas.
La comunicación entre los dispositivos presenta dos jerarquías: el maestro y el esclavo.
El estándar presenta un mecanismo de detección de colisiones en el bus, con lo cual el
maestro solo transmitirá un byte cuando detecte que las líneas de comunicación están
libres (estado de Idle). En I2C solo existen tres velocidades de reloj para la comunicación:

a. 100 Kbps (modo estándar)


b. 400 Kpbs (modo rápido)
c. 3.4 Mbps (modo de alta velocidad)

Mag. Ing. Sergio Salas A.


Comunicación entre dos dispositivos en un
bus I2C

Mag. Ing. Sergio Salas A.


Diagrama interno de los pines I2C

Mag. Ing. Sergio Salas A.


Condiciones de START y STOP en el bus I2C

Mag. Ing. Sergio Salas A.


Trama de envío de datos del bus I2C

Mag. Ing. Sergio Salas A.


La arbitrariedad
El protocolo I2C permite que múltiples maestros puedan coexistir en el sistema de
comunicación. Cuando dos o más maestros intentan intervenir el bus al mismo
tiempo, un esquema de arbitrariedad permite que solo uno de ellos tenga acceso y
el resto tenga que esperar un tiempo adicional.
Los datos en el bus I2C son solo válidos cuando la línea SCL se encuentra en el nivel
alto del pulso de reloj. El dispositivo esclavo puede tomar control de la línea SCL y
ponerlo a nivel bajo cuando se encuentra procesando un dato, con el fin de darle
aviso al maestro que debe esperar un tiempo adicional para una respuesta.
Cuando dos dispositivos maestros conectados al bus tratan de transmitir al mismo
tiempo un dato, antes deben verificar la condición de la línea SDA. Si uno de los
maestros llega a detectar la condición de START deberá dejar libre las líneas y esperar
más tiempo, o en todo caso configurarse como dispositivo esclavo.

Mag. Ing. Sergio Salas A.


Direccionamiento de periféricos
Todo dispositivo I2C contiene una dirección por defecto, la cual tiene que ser
enviada primero por el maestro para identificar al dispositivo en el bus.
Las direcciones son de 7 bits o también de 10 bits. Si hay varios dispositivos
similares en el bus I2C algunos dispositivos permiten fijar en los pines del circuito
Integrado los bits menos significativos de la dirección para distinguirlos.
La dirección de acceso al ESCLAVO culmina con el bit de acceso a lectura o
escritura R/W.

Mag. Ing. Sergio Salas A.


El formato de transferencia de datos
Formato de escritura

Formato de lectura

Mag. Ing. Sergio Salas A.


El módulo MSSP del PIC18F4550 en modo I2C

Mag. Ing. Sergio Salas A.


Configuración de la frecuencia de reloj
El registro SSPAD permite definir si la tasa de bit puede ser de 100Kpbs, 400Kpbs
o de 1Mbps

Mag. Ing. Sergio Salas A.


Funciones de la librería i2c.h de Microchip
Función Descripción
Permite generar una condición de ACK del maestro al dispositivo esclavo
AckI2C()
CloseI2C() Desactiva el módulo MSSP
Permite determinar si existe un dato disponible en SSPBUF
DataRdyI2C()
Retorna el byte enviado por el dispositivo esclavo
getcI2C()
Retorna una cadena de bytes enviadas por el dispositivo esclavo
getsI2C()
Realiza una espera hasta que el bus retorne al estado de Idle
IdleI2C()
NotAckI2C() Genera una condición de NACK en el bus I2C
Permite configurar el módulo MSSP para operar en modo I2C. El primer
OpenI2C(unsigned char sync_mode, unsigned char slew) parámetro puede ser SLAVE_7, SLAVE_10 o MASTER (esclavo a 7 bits de
dirección, 10 bits de dirección o modo maestro respectivamente). El
segundo parámetro puede ser SLEW_OFF o SLEW_ON (modo de 100kHz
habilitado o modo de 400kHz habilitado respectivamente)
putcI2C(unsignedcharnum) Transmite un byte al dispositivo esclavo
putsI2C(unsignedchar *num) Transmite una cadena de bytes al dispositivo esclavo

ReadI2C() Permite leer un solo byte del bus I2C


Genera una condición de RSTART en el bus I2C
RestartI2C()
StartI2C() Genera una condición de START en el bus I2C
StopI2C() Genera una condición de STOP en el bus I2C
WriteI2C() Escribe un byte en el bus I2C
Mag. Ing. Sergio Salas A.
Ejemplo de lectura de temperatura del sensor
DS1621

Mag. Ing. Sergio Salas A.

Potrebbero piacerti anche