1
Microcontroladores PIC ©ATE-Universidad de Oviedo
COMUNICACIÓN SERIE
PARA SISTEMAS BASADOS EN MICROCONTROLADORES PIC
MÓDULO SSP (SYNCHRONOUS SERIAL PORT)
MCU Conversores A/D
EEPROM serie
LCD con SPI Registros despl.
2
Microcontroladores PIC
MÓDULO SSP (
S
YNCHRONOUSS
ERIALP
ORT)
• Puerto Serie Síncrono: Interface de Comunicación Serie Síncrona
• Pensado para comunicación con otros Microcontroladores o Periféricos: EEPROM serie (almacenamiento de datos no volátiles)
Registros de Desplazamiento (expansión de entradas y/o salidas) Drivers de Displays (reducción de conexiones)
Conversores A/D (digitalización externa de señales) ....
• Modos de Operación posibles del módulo SSP:
- SPI (Serial Peripheral Interface): Interface de Periféricos Serie SPI: Es una Marca Registrada de Motorola Corporation
- I2C (Inter-Integrated Circuit): Entre Circuitos Integrados I2C: Es una Marca Registrada de Philips
3
Microcontroladores PIC
1.- Interface SPI en el módulo SSP
• Permite la transmisión y recepción síncrona simultánea de datos de 8 bits
• Para la comunicación debe existir un dispositivo Maestro (genera la señal de reloj) y uno ó varios esclavos (reciben la señal de reloj)
• En los microcontroladores PIC hay 3 pines asociados con la comunicación SPI:
Salida Serie de Datos (SDO) Serial Data Output -> RC5
Entrada Serie de Datos (SDI) Serial Data Input -> RC4
Reloj de comunicación Serie (SCK) Serial Clock -> RC3
De manera adicional, hay un 4º pin que se puede utilizar cuando el microcontrolador se configura como dispositivo Esclavo:
Selección de Esclavo (SS) Slave Select -> RA5
• La inicialización del Interface SPI se realiza mediante la configuración de los bits de control SSPCON<5:0> y SSPSTAT<7:6>
4
Microcontroladores PIC
Diagrama de Bloques del Módulo SSP en modo SPI
Entrada serie de bits Salida serie Reloj de Salida (Maestro) Registro de Desplazamiento de transmisión/recepción (no accesible) Selección Esclavo (opcional si es Esclavo) Reloj de Entrada (Esclavo) Registro de Buffer (lectura/escritura)
5 Microcontroladores PIC b0 b1 b2 b3 b4 b5 b6 b7 a0 a1 a2 a3 a4 a5 a6 a7 Reloj SDO SDO SDI SDI
MAESTRO SPI ESCLAVO SPI
SCK SCK a7 b0 b1 b2 b3 b4 b5 b6 b7 a0 a1 a2 a3 a4 a5 a6 Reloj SDO SDO SDI SDI
MAESTRO SPI ESCLAVO SPI
SCK SCK
Flanco 1 en reloj SCK Situación Inicial
6 Microcontroladores PIC b0 b1 b2 b3 b4 b5 b6 b7 a0 a1 a2 a3 a4 a5 a6 a7 Reloj SDO SDO SDI SDI
MAESTRO SPI ESCLAVO SPI
SCK SCK a7 b0 b1 b3 b4 b7 a0 a1 a2 a3 a4 a5 a6 Reloj SDO SDO SDI SDI
MAESTRO SPI ESCLAVO SPI
SCK SCK b6 b5 Flanco 8 en SCK b2 Situación Inicial Situación Final
7
Microcontroladores PIC
• SSPSR (registro de desplazamiento) envía y recoge los bits simultáneamente
• SSPBUF tiene doble función: para “cargar” el registro SSPSR para envío de datos y para “recoger” los datos recibidos en SSPSR
b0 b1 b2 b3 b4 b5 b6 b7 b0 b1 b2 b3 b4 b5 b6 b7
SSPBUF
SSPSR
1.- Carga de SSPSR a través de SSPBUF
a7 b0 b1 b2 b3 a4 a5 a6 b0 b1 b2 b3 b4 b5 b6 b7 SSPBUF SSPSR 2.- SSPSR enviando/recibiendo SSPBUF b0 b1 b2 b3 b4 b5 b6 b7 SSPSR a7 a0 a1 a2 a3 a4 a5 a6 3.- Completada recepción/envío SSPSR a7 a0 a1 a2 a3 a4 a5 a6 a7 a0 a1 a2 a3 a4 a5 a6 SSPBUF
4.- SSPSR carga SSPBUF con recepción SSPIF=1
8
Microcontroladores PIC
* SSPIF = PIR1<3> (Completada transmisión) Lectura/escritura
Indica que se ha completado un envío/recepción en SSPSR Se debe poner a 0 por software, puede generar interrupción * BF = SSPSTAT<0> (Buffer de recepción lleno) Sólo lectura
Se pone a 1 cuando se ha completado la recepción de un dato
se pone a 0 por hardware cuando se lee el registro SSPBUF Se empleará normalmente únicamente en modo de recepción * WCOL = SSPCON<7> (Colisión de Escritura) Lectura/escritura
Indica que se ha intentado escribir en SSPBUF mientras se está transmitiendo un dato previo. Si se da tal situación, se debe poner a 0 por software
* SSPOV = SSPCON<6> (Desbordamiento en Recepción) Lectura/escritura
Indica que se ha recibido un byte nuevo mientras SSPBUF contiene un dato recibido anteriormente no leido. El nuevo dato se pierde y ya no se actualiza SSPBUF. Se pondrá a 0 por software
Fl ags In dic ad or es e n m od o SPI
9
Microcontroladores PIC
El módulo SPI puede utilizarse (independientemente de modo Maestro o Esclavo): a) Para envío y recepción simultánea (SDI y SDO)
SSPBUF debe leerse antes de cargarlo con el nuevo dato a enviar b) Sólo para enviar datos (SDO)
SSPBUF se puede cargar con un nuevo dato únicamente después de haberse completado el envío del anterior dato
Si se pretende cargar un dato en SSPBUF durante una transmisión se produce una colisión y dicha carga será ignorada
c) Sólo para recibir datos (SDI)
Sólo en este caso SSPBUF se utilizaría como buffer intermedio de recepción, se puede iniciar la recepción de un nuevo dato antes de leer el dato que se acaba de recibir
10 Microcontroladores PIC b0 b1 b2 b3 b4 b5 b6 b7 b0 b1 b2 b3 b4 b5 b6 b7 SSPBUF SSPSR SDI SDO a0 a1 a2 a3 a4 a5 a6SSPSR a7 a7 a0 a1 a2 a3 a4 a5 a6 SSPBUF SDI SDO
a) Para envío y recepción simultánea
Envío de un dato
b) Sólo para enviar datos
b0 b1 b2 b3 b4 b5 b6 b7 b0 b1 b2 b3 b4 b5 b6 b7 SSPBUF SSPSR SDO a4 a5 a6 a7 b0 b1 b2 b3 b0 b1 b2 b3 b4 b5 b6 b7 SSPBUF SSPSR SDO Intento de carga de Dato2
en SSPBUF durante envío COLISIÓN
WCOL=1
(1)
(2)
Antes de cargar un nuevo envío debemos leer recepción
Recepción dato
11
Microcontroladores PIC
c) Sólo para recibir datos
b0 b1 b2 b3 b4 b5 b6 b7 b0 b1 b2 b3 b4 b5 b6 b7
SSPBUF
SSPSR
Se completa la recepción de un dato (BF=1)
Se lee el dato recibido (BF=0)
No se escribe nada en SSPBUF
(sólo recibimos)
y se inicia una nueva recepción SDI SSPBUF a7 b0 b1 b2 b3 a4 a5 a6 b0 b1 b2 b3 b4 b5 b6 b7 SSPSR SDI
Si antes de leer el dato anterior se completa la recepción de un nuevo dato, se perdería el dato previamente recibido, se da error de “OVERFLOW” (SSPOV=1).
Este error sólo es posible si el dispositivo es ESCLAVO
Un microcontrolador MAESTRO inicia una nueva transferencia cargando el dato en SSPBUF
12
Microcontroladores PIC
ESPECIFICACIÓN DEL MODO SPI EN LA INICIALIZACIÓN * Modo de funcionamiento: Maestro (SCK salida) o Esclavo (SCK entrada) * Polaridad del Reloj: Estado Inactivo del Reloj (SCK) a “1” ó a “0”
* Flancos activos del Reloj: Salida de bits en flancos de subida o bajada en SCK * Muestreo bits de datos: Muestreo de entrada en el “centro” o al “final” del bit * Frecuencia de Reloj: SÓLO SI ES MAESTRO, frecuencia en salida SCK * Modo de Selección: SÓLO SI ES ESCLAVO
- Control externo de SDI y SDO con entrada SS - Sin control externo con pin SS
13
Microcontroladores PIC
El dispositivo Maestro inicia la transferencia enviando la señal de reloj SCK, los datos salen en los flancos programados y se capturan las entradas en el
momento indicado con el bit SMP si es Maestro.
Los dos dispositivos deben ser programados con la misma POLARIDAD DE RELOJ para que reciban y emitan a la vez
14
Microcontroladores PIC
HABILITACIÓN DE LOS PINES DE ENTRADA/SALIDA de SSP
• Para habilitar el módulo SSP, es necesario que el bit SSPEN se encuentre a 1. Si se desea “resetear” el módulo SSP, se debe poner a 0 este bit y luego volverlo a 1 • Para que la funcionalidad de los pines SDI, SDO, SCK y /SS sea la determinada por los bits de configuración, es necesario además que los bits de dirección de datos (en TRISA y en TRISC) tengan la dirección adecuada:
SDI (RC4) debe tener TRISC<4> = 1 para ser entrada de datos
SDO (RC5) debe tener TRISC<5> = 0 para que sea salida de datos
SCK (RC3)
debe tener TRISC<3> = 0 si el microcontrolador es MAESTRO y TRSC<3> = 1 si se define como ESCLAVO
/SS (RA5) debe ser TRISA<5> = 1 si es ESCLAVO y tiene control externo Cualquier función no deseada en el puerto serie puede ser omitida si en el
registro de dirección de datos (TRIS) se configura el valor opuesto
P.ej.: Si en modo Maestro sólo se van a enviar datos, SDI puede usarse como una salida de propósito general del microcontrolador cargando TRISC<4>=0
15 Microcontroladores PIC Bi ts A soci ados con el mod o S PI Registro SSPCON<7:5> (0x14)
16 Microcontroladores PIC Registro SSPCON (0x14) Bi ts A soci ados con el mod o S PI Registro SSPCON<4:0> (0x14)
17 Microcontroladores PIC Bi ts A soci ados con el mod o S PI Registro SSPSTAT (0x94)
18
Microcontroladores PIC
Registros y bits Asociados
con el Modo SPI
19
Microcontroladores PIC
Funcionamiento como MAESTRO
• El Maestro puede iniciar la transferencia en cualquier momento puesto que controla la línea SCK. El protocolo software determinará cuando el Esclavo está en condiciones de enviar datos.
• En modo Maestro, la transmisión/recepción se inicia tan pronto como se escribe en el registro SSPBUF. Si se desea sólo recibir, la línea SDO puede desactivarse definiéndola como entrada, los datos presentes en la línea SDI irán entrando al registro SSPSR a la velocidad marcada por el reloj de transferencia
• La velocidad de transferencia del modo SPI es programable entre los valores: Fosc/4
Fosc/16 Fosc/64
Frecuencia de Salida de TMR2/2
siendo por tanto la máxima velocidad de trasnferencia: 5Mbps (con Fosc=20MHz) • La polaridad del reloj y los flancos activos se configuran con los bits CKP y CKE
20
Microcontroladores PIC
Escritura
en SSPBUF CRONOGRAMA SPI MAESTRO
Muestreo caso SMP=1 Muestreo caso SMP=0 BYTE COMPLETO SSPIF=1
21
Microcontroladores PIC
Funcionamiento como ESCLAVO sin Selección Externa
• El Esclavo el dato es transmitido/recibido cuando aparecen los pulsos en la entrada SCK
• Cuando el último bit termina de ser muestreado, el flag SSPIF se pone a uno • La polaridad del reloj y los flancos activos se configuran con los bits CKP y CKE • El muestreo de los bits de datos se realiza siempre en la mitad de un bit en el modo Esclavo (SMP=0 siempre en modo Esclavo)
• La señal de reloj debe cumplir las especificaciones mínimas de tiempos mínimos en los estados alto y bajo
• En modo de bajo consumo (SLEEP) el Esclavo puede transmitir y recibir datos puesto que el registro de desplazamiento es asíncrono con el oscilador.
• Al completar una transferencia de un byte, el dispositivo podría despertarse si se encontraba “dormido”
22
Microcontroladores PIC
CRONOGRAMA SPI ESCLAVO SIN SELECCIÓN EXTERNA
CKE=0
F.subida F.bajada
Muestreo
siempre con SMP=0 (en mitad del bit) con el flanco opuesto al de salida de los datos
Esperando a que el Maestro genere flancos
BYTE COMPLETO SSPIF=1
23
Microcontroladores PIC
Funcionamiento como ESCLAVO con Selección Externa
• El pin /SS (nivel activo bajo) permite la conexión de varios esclavos con un Maestro, habilitando en cada instante únicamente la transferencia con un Esclavo
• El dispositivo Maestro debe seleccionar para la transferencia únicamente uno de los Esclavos mediante la activación de la señal /SS (a cero) del elegido, permaneciendo el resto en estado alto
• Se debe configurar el modo SSP Esclavo con SSPCON<3:0> = 0100 y además definir el pin /SS/RA5 como entrada con TRISA<5>=1
• Cuando /SS está a 0, se permite transmisión/recepción y el pin SDO se maneja internamente por parte del registro dedesplazamiento
• Si el pin /SS está a 1, el pin SDO se sitúa en alta impedancia respecto al registro de desplazamiento (podrían necesitarse resistencias de polarización).
• Además, con /SS a “1” (Vdd) el módulo SPI permanecerá reseteado igual que si SSPEN=0 y el contador de bits entrantes permanecerá a cero
24
Microcontroladores PIC
CRONOGRAMA SPI ESCLAVO CON SELECCIÓN EXTERNA
Muestreo
siempre con SMP=0 (en mitad del bit) con el flanco opuesto al de salida de los datos
25
Microcontroladores PIC
Interface SPI: Posibilidades de conexión A).- Un Maestro y un Esclavo con conexión a 3 hilos,
MAESTRO ESCLAVO SDO SDI SCK SDI SDO SCK Transmisión/recepción simultánea
Transmisión/recepción pero no simultáneas
B).- Un Maestro y un Esclavo con conexión a 2 hilos,
MAESTRO ESCLAVO SDO SDI SCK SDI SDO SCK 2 hilos 3 hilos
26
Microcontroladores PIC
B).- Un Maestro y un Esclavo con conexión a 2 hilos
MAESTRO ESCLAVO SDO SDI SCK SDI SDO SCK 2 hilos MAESTRO
(TRISC<5>=0) (TRISC<5>=1)ESCLAVO SDO SDI SCK SDI SCK 2 hilos
Estado1: Maestro emite (y recibe lo mismo que está emitiendo), Esclavo recibe
Sólo puede haber una salida activa, el receptor anula su salida de datos SDO por software mediante el registro de dirección de datos
(TRISC<5>=1 define SDO como entrada)
27
Microcontroladores PIC
B).- Un Maestro y un Esclavo con conexión a 2 hilos,
MAESTRO ESCLAVO SDO SDI SCK SDI SDO SCK
Sólo puede haber una salida activa, el receptor anula su salida de datos SDO por software mediante el registro de dirección de datos
(TRISC<5>=1 define SDO como entrada)
2 hilos
MAESTRO
(TRISC<5>=1) SDI (TRISC<5>=0)ESCLAVO SCK
SDI SDO SCK 2 hilos
Estado 2: Maestro recibe, Esclavo emite (y recibe lo mismo que está emitiendo) ¡ Conflicto en las Salidas !
28
Microcontroladores PIC
MAESTRO ESCLAVO1 ESCLAVO2 ESCLAVOn
SDO SDI SDI SDI
...
SCK SCK SCK SCK
C).- Un Maestro emitiendo y varios Esclavos recibiendo, conexión a 2 hilos
No sería necesario el control de la selección del esclavo, todos tendrían la entrada de datos activa
SDO SDO SDO
29
Microcontroladores PIC
D).- Un Maestro y varios Esclavos con posibilidad de emisión, 3 h. y líneas de selección
MAESTRO ESCLAVO1 ESCLAVO2 ESCLAVOn
SDO SDI SDI SDI
...
SCK SCK SCK SCK
SDO SDO SDO
SDI /SS /SS /SS Circuito de Selección de Esclavo (directo o decodif.)
.
.
.
PO RT ?Sólo un Esclavo Seleccionado que “maneja” la línea SDO
y que recibe por SDI (/SS=0, resto /SS=1)
30
Microcontroladores PIC
Utilidades de SPI: Expansión de Puertos de Entrada con Registro de Desplazamiento
RC5/SDO RC4/SDI RC3/SCK RD7 LOAD CLOCK b7 b6 b5b4b3b2 b1 b0 Salida serie Entrada serie REGISTRO DE DESPLAZAMIENTO 74HC165 MÓDULO SPI Microcontrolador
1.- Pulso en RD7 para Lectura del “Puerto” (carga paralelo de 74HC165)
2.- Aparición de flancos en SCK por escritura interna en SSPBUF se debe configurar CKP=1, CKE=1
3.- Tras 8 flancos de subida, entra el dato completo
Datos Puerto de entrada
31
Microcontroladores PIC
74HC165: Registro de Desplazamiento
Entrada Paralelo de datos
Activación carga paralelo Entrada serie Salida serie Reloj Habilitación
32 Microcontroladores PIC b7 b6 b5 b4 b3 b2 b1 b0 RC5/SDO RC4/SDI RC3/SCK RD7 LOAD CLOCK b7 b6 b5b4b3b2 b1 b0 Salida serie Entrada serie REGISTRO DE DESPLAZAMIENTO 74HC165 MODO SPI Microcontrolador RD7 SCK (CKP=1, CKE=1) SDI Escritura en SSPBUF b0
Dato completo en SSPBUF
Cronograma del proceso de lectura del puerto adicional
Desde el MCU PIC: 1.- “Bajar y subir” RD7 2.- Poner SSPIF=0
3.- Escribir en SSPBUF “cualquier cosa” 4.- Detectar SSPIF=1
33
Microcontroladores PIC
Expansión para Puertos de Entrada de mayor tamaño (p.e. 3 bytes)
74HC165 74HC165 74HC165
Sal Ent Sal Ent Sal Ent
RD7 SDI SCK
PIC
BYTE 1 BYTE 2 BYTE 3
Procedimiento para leer los 3 bytes:
1.- Pulso bajo en RD7 para leer simultáneamente los 3 bytes
2.- Borrar SSPIF y escribir en SSPBUF -> se generan 8 flancos y “entra” BYTE 1 pasando BYTE 2 a la posición de BYTE 1 y BYTE 3 a la de BYTE 2
3.- Se recoge BYTE 1 en SSPBUF y se almacena
4.- Borrar SSPIF y escribir en SSPBUF -> 8 flancos en SCK y “entra” BYTE 2... 5.- Se recoge BYTE 2 en SSPBUF y se almacena
6.- Borrar SSPIF y escribir en SSPBUF -> 8 flancos en SCK y “entra” BYTE 3... 7.- Se recoge BYTE 3 en SSPBUF y se almacena
Carga Carga Carga
34
Microcontroladores PIC
Utilidades de SPI: Expansión de Puertos de Salida con Registro de Desplazamiento
RC5/SDO RC4/SDI RC3/SCK RD7 MÓDULO SPI Microcontrolador b6 b5 b4 b3 b2 b1 b0 D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR Registro 74HC595 b7 SECUENCIA A SEGUIR
1.- Escribir el dato a sacar en SSPBUF
2.- Aparecen 8 flancos en SCK que cargan el dato en los biestables D internos del 74HC595 3.- Generar flanco de subida en RD7
para que salga el dato al exterior 4.- Dato retenido y disponible en la salida
Reloj ent. serie
Reloj sal. paralelo Ent.serie
35 Microcontroladores PIC RC5/SDO RC4/SDI RC3/SCK RD7 MÓDULO SPI Microcontrolador b6 b5 b4 b3 b2 b1 b0 D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR Registro 74HC595 b7 Cronograma del proceso de escritura en el puerto adicional
b7 b6 b5 b4 b3 b2 b1 b0 SCK (CKP=1, CKE=0) SDO RD7 Escritura en SSPBUF (antes pondremos SSPIF=0)
Dato completo en Registro (nos enteramos por SSPIF=1)
Flanco de subida para salida al exterior Los bits salen por SDO
en los flancos de bajada
Los bits “entran” al
registro en los flancos de subida (ya estables los bi)
36
Microcontroladores PIC
Desde el punto de vista del MCU PIC:
1.- Poner SSPIF=0
2.- Escribir en SSPBUF el dato a sacar
3.- Detectar SSPIF=1
4.- “Bajar y subir” RD7 (flanco de subida)
RC5/SDO RC4/SDI RC3/SCK RD7 MÓDULO SPI Microcontrolador b6 b5 b4 b3 b2 b1 b0 D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR D Q Q SET CLR Registro 74HC595 b7 Qué hacer para “escribir” en el puerto adicional
37
Microcontroladores PIC
74HC595Sal 74HC595Sal 74HC595
Ent Ent Ent
RD7 SDO
SCK
PIC
BYTE 1 BYTE 2 BYTE 3
R.par.
3 Registros de Desplazamiento Encadenados
Expansión para Puertos de Salida de mayor tamaño (p.e. 3 bytes)
R.par. R.par.
Procedimiento para escribir los 3 bytes de salida:
1.- Borrar SSPIF y escribir en SSPBUF el BYTE 3, se generan 8 flancos y “entra” BYTE 3 en el registro interno de la izquierda (lo detectamos por SSPIF=1)
2.- Se borra SSPIF y se escribe BYTE 2 en SSPBUF, se generan otros 8 flancos y pasa BYTE 3 al registro central, entrando BYTE 2 en el de la izquierda
4.- Borrar SSPIF y escribir en SSPBUF el BYTE 1, otros 8 flancos en SCK y “entra” BYTE 3 a la derecha, queda BYTE 2 en el centro y BYTE 1 a la izquierda 5.- Pulso bajo en RD7 para generar un flanco de subida que haga que los bytes almacenados internamente en los registros salgan al exterior todos a la vez