MCU
EEPROM serie
Conversores A/D
Registros despl.
LCD con SPI
Comunicacin Serie Sncrona
Serial Clock
-> RC5
-> RC4
-> RC3
-> RA5
Registro de Buffer
(lectura/escritura)
Entrada serie de bits
Registro de Desplazamiento
de transmisin/recepcin
(no accesible)
Salida serie
Seleccin Esclavo
(opcional si es Esclavo)
Reloj de Entrada
(Esclavo)
Reloj de Salida
(Maestro)
Comunicacin Serie Sncro na
ENVO/RECEPCIN SIMULTNEA
Situacin Inicial
MAESTRO SPI
ESCLAVO SPI
b0 b1 b2 b3 b4 b5 b6 b7 SDO
SDI a0
a3
SDI
a1 a2
a4 a5 a6
a7
SDO
SCK
SCK
Reloj
ESCLAVO SPI
a7 b0 b1 b2 b3 b4 b5 b6 SDO
SDI b7 a0
a2
SDI
a3 a4 a5
a6
SDO
SCK
Reloj
a1
SCK
Situacin Inicial
MAESTRO SPI
ESCLAVO SPI
b0 b1 b2 b3 b4 b5 b6 b7 SDO
SDI a0
a3
SDI
Reloj
a1 a2
a4 a5 a6
a7
SDO
SCK
SCK
Flanco 8 en SCK
MAESTRO SPI
ESCLAVO SPI
a0 a1 a2 a3 a4 a5 a6 a7 SDO
SDI b0
b3
SDI
Reloj
SCK
b1 b2
SDO
SCK
Situacin Final
Intercambiados los 8 bits de datos
Comunicacin Serie Sncrona
b4 b5 b6 b7
SSPBUF
b0 b1 b2 b3 b4 b5 b6 b7
SSPBUF
b0 b1 b2 b3 b4 b5 b6 b7
SSPSR
b0 b1 b2 b3 b4 b5 b6 b7
SSPSR
a4 a5 a6 a7 b0 b1 b2 b3
SSPIF=1
SSPBUF
b0 b1 b2 b3 b4 b5 b6 b7
SSPBUF
a0 a1 a2 a3 a4 a5 a6 a7
SSPSR
a0 a1 a2 a3 a4 a5 a6 a7
SSPSR
a0 a1 a2 a3 a4 a5 a6 a7
(2)
Envo de un dato
SSPBUF
b0 b1 b2 b3 b4 b5 b6 b7
Recepcin dato
SSPBUF
a0 a1 a2 a3 a4 a5 a6 a7
SSPSR
SDI b0 b1 b2 b3 b4 b5 b6 b7 SDO
b) Slo para enviar datos
SSPSR
SDI a0 a1 a2 a3 a4 a5 a6 a7 SDO
SSPBUF
b0 b1 b2 b3 b4 b5 b6 b7
COLISIN
WCOL=1
SSPBUF
b0 b1 b2 b3 b4 b5 b6 b7
SSPSR
b0 b1 b2 b3 b4 b5 b6 b7 SDO
SSPSR
a4 a5 a6 a7 b0 b1 b2 b3 SDO
Carga de un dato
10
SSPSR
b0 b1 b2 b3 b4 b5 b6 b7
No se escribe nada
en SSPBUF
(slo recibimos)
y se inicia una nueva
recepcin
SSPSR
a4 a5 a6 a7 b0 b1 b2 b3
11
* Flancos activos del Reloj: Salida de bits en flancos de subida o bajada en SCK
* Muestreo bits de datos:
* Frecuencia de Reloj:
* Modo de Seleccin:
SLO SI ES ESCLAVO
- Control externo de SDI y SDO con entrada SS
- Sin control externo con pin SS
12
Ejemplo de Conexin
Los dos dispositivos deben ser programados con la misma
POLARIDAD DE RELOJ para que reciban y emitan a la vez
Comunicacin Serie Sncrona
13
Comunicacin
P.ej.: Si en modo Maestro slo se van a enviar datos, SDI puede usarse
como una salida de propsito general del microcontrolador cargando
Serie Sncrona
ATE-Universidad de Oviedo-Fernando Nuo
TRISC<4>=0
14
15
La polaridad del
reloj y los
flancos activosEscritura
se configuranen SSPBUF
con los bits CKP
y CKE
Muestreo
caso SMP=0
Muestreo
caso SMP=1
BYTE COMPLETO
SSPIF=1
16
17
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
Comunicacin Serie Sncrona
BYTE COMPLETO
SSPIF=1
18
19
Muestreo
siempre con SMP=0
(en mitad del bit)
con el flanco opuesto
al de salida de los
datos
Comunicacin Serie Sncrona
20
SDI
SDI
3 hilos
SDO ESCLAVO
SCK
SCK
Transmisin/recepcin simultnea
B).- Un Maestro y un Esclavo con conexin a 2 hilos,
SDO
MAESTRO
SDI
SDI
2 hilos
SDO ESCLAVO
SCK
SCK
21
SDI
SDI
2 hilos
SDO ESCLAVO
SCK
SCK
Slo puede haber una salida activa, el receptor anula su salida de datos SDO
por software mediante el registro de direccin de datos
(TRISC<5>=1 define SDO como entrada)
Estado1: Maestro emite (y recibe lo mismo que est emitiendo), Esclavo
recibe
SDO
SDI
MAESTRO
(TRISC<5>=0)
SDI
SCK
ESCLAVO
2 hilos
(TRISC<5>=1)
SCK
22
MAESTRO
SDI
SDO ESCLAVO
2 hilos
SCK
SCK
Slo puede haber una salida activa, el receptor anula su salida de datos SDO
por software mediante el registro de direccin de datos
(TRISC<5>=1 define SDO como entrada)
Estado 2: Maestro recibe, Esclavo emite (y recibe lo mismo que est
emitiendo)
SDI
MAESTRO
SDI
(TRISC<5>=1)
SDO ESCLAVO
2 hilos
(TRISC<5>=0)
SCK
SCK
23
SDO
SCK
SDI
MAESTRO
SDI
SCK SDI
SCK
ESCLAVO
1
ESCLAVO
2
SDO
SDO
SDI
......
SCK
ESCLAVO
n
SDO
24
SDO
SCK
SDI
ESCLAVO
1
MAESTRO
SDI
SDO /SS
Circuito de
Seleccin de
Esclavo
(directo
o decodif.)
PORT?
SCK SDI
.
.
.
SCK
ESCLAVO
2
SDI
......
SDO /SS
SCK
ESCLAVO
n
SDO
/SS
25
26
27
spi_write()
-> spi_write(caracter)
-> valor=spi_read(dato)
28
spi_data_is_in()
29
30
31
BUS I2C
MAESTRO
ESCLAVO
(direccin n1)
MAESTRO
o
ESCLAVO
ESCLAVO
(direccin n2)
(direccin
ni)
Cmax=400pF
Transferencias:
ESCLAVO
(direccin n3)
SCL (reloj)
SDA (datos)
Nmero mx.
de dispositivos
por capacidad
en el bus:
100 kHz,
400 kHz
1MHz
32
Resistencias
de polarizacin
Resistencias serie
opcionales (Rs<<Rp)
ESCLAVO
ESCLAVO
MAESTRO/ESCLAVO
MAESTRO/ESCLAVO
33
Bus Inactivo
El FIN de transferencia es por transicin de 0 a 1 en SDA cuando SCL est a 1
En una transmisin,
SDA slo puede cambiar
cuando SCL=0
si no, se interpretara
como START STOP
Comunicacin Serie Sncrona
SDA
SCL
Bus Activo
Fin de transferencia
(STOP)
34
35
36
A7
A6
A5
A4
A3
A2
A1 R/W
ACK
Start
Lectura o
Escritura
Start
1 0 A9 A8 R ACK
S
W ACK A7 A6 A5 A4 A3 A2 A1 A0
ACK
Reconocimientos
Lectura o
del Esclavo
Escritura
despus de cada byte
del Maestro
ATE-Universidad de Oviedo-Fernando Nuo
37
38
Salida
de datos
del transmisor
En SDA se tiene
la funcin AND
de estas 2 salidas
Salida
del receptor
Reloj del Maestro
Reconocimiento o no
del dato
CRONOGRAMAS
Introduciendo espera
39
SDA: S
De Maestro a Esclavo
De Esclavo a Maestro
R/W
Dato
0 porque el Maestro
quiere escribir (enviar)
Dato
A/A
Reconocimiento (A)
o no reconocimiento (A)
R/W
Dato
1 porque el Maestro
quiere leer (recibir)
Dato
No reconocimiento
por Maestro y Parada
40
41
42
Implementa todas las funciones del Maestro y del Esclavo en un bus I2C por
hardware
Permite detectar las condiciones START y STOP en el bus por interrupcin
Permite emplear direcciones de 7 de 10 bits como Esclavo
Se puede seleccionar uno de los siguientes modos de operacin:
- Esclavo I2C con direccin de 7 bits
- Esclavo I2C con direccin de 10 bits
- Maestro I2C con reloj SCL de frecuencia = Fosc/(4*(SSPADD+1))
El mdulo MSSP dispone de 6 registros asociados:
SSPCON
SSPCON2
SSPSTAT
SSPADD
SSPBUF
SSPSR
Registro de Control
Registro de Control 2
Registro de Estado
Registro de Direccin
Buffer de
Transmisin/Recepci
n
ATE-Universidad
de Oviedo-Fernando
Nuo
Registro
de
Desplazamiento Serie
(no accesible)
43
ESCLAVO
Entrada Reloj
Entrada
o salida
de datos
Registro de E/S
no accesible
directamente
Direccin asignada
al Esclavo
44
MAESTRO
Salidas de
drenador
abierto
Para clculo
de frecuencia
Buffer
45
- Condicin de STOP
- Transmisin de ACK
En buses multi-Maestro, el control del mismo slo puede intentarse cuando el bit P
est a 1 cuando el bus est inactivo (S y P a 0). En este caso, la lnea SDA ser
monitorizada para el arbitraje y comprobar si el nivel presente coincide con el nivel
esperado y propuesto por el propio Maestro, esta verificacin la realiza el hardware
y el resultado queda reflejado en el bit de flag de colisiones BCLIF (PIR2<3>) si hay
discrepancia y podra generar interrupcin (su mscara es BCLIE = PIE2<3>).
Comunicacin Serie Sncrona
46
FOSC
4 (SSPADD
1)
Se emplean los 7 bits menos significativos del registro SSPADD. En modo Maestro
BRG se actualiza automticamente con el cambio en SSPADD, pero en un bus multiMaestro, se carga cuando SCL pasa de 0 a estado alto
Diagrama de
bloques de BRG
47
Establecer una condicin de START en las lneas SDA y SCL (bit SEN)
Escribir un dato en SSPBUF para iniciar una transmisin de dato o
Configurar la entrada I2C para recibir datos
(bit RCEN)
direccin
Generar un pulso de reconocimiento (ACK)
(bit ACKEN)
(bit PEN)
Generar una condicin de STOP en SDA y SCL
(bit RSEN)
Establecer una repeticin de START en las mismas lneas
Una accin generada por el Maestro debe esperar a que finalice la anterior (p.e. no se
puede escribir el dato en SSPBUF hasta que se haya completado la condicin START)
48
49
50
SLAVE
SCL=pin
SDA=pin
51
Ejemplo:
#USE I2C(SLAVE, SDA=PIN_C4, SCL=PIN_C3,
ADDRESS=0xA0, NOFORCE_SW)
generacin de condicin de
lectura de un byte
i2c_poll( )
de byte
Comunicacin
Serie Sncrona
comprobacin de recepcin
ATE-Universidad de Oviedo-Fernando Nuo
52
-> I2C_write(dato)
53
I2C_read( )
-> dato=I2C_read( )
o bien
dato=I2C_read(ack)
Esta funcin sirve para leer un byte a travs del bus I2C. En modo
Maestro, se generarn los flancos en la seal de reloj (SCL) y en modo
Esclavo esperar por la aparicin de los mismos. No existe lmite de
tiempo de espera como Esclavo, se deber usar la funcin I2C_poll( )
para evitar el bloqueo del dispositivo. El ack es opcional y puede ser
1 (hay reconocimiento, que es la opcin por defecto) 0 (no hay
reconocimiento)
I2C_poll( )
Esta funcin slo puede utilizarse si el dispositivo dispone de mdulo
SSP y est implementado el bus I2C con su empleo. Esta funcin
devuelve TRUE si se ha recibido un byte y ste est disponible en el
buffer. Si se devuelve TRUE, la llamada a la funcin I2C_read( )
devuelve de manera inmediata el byte recibido.
54
Sec. de Escritura
Secuencia Lectura
Ejemplos:
#USE I2C(MASTER, SDA=PIN_C4, SCL=PIN_C3)
//Dispositivo Maestro
i2c_start( );
//Se enva bit de START
i2c_write(0xA1);
//Direccin del Esclavo y peticin de lectura
dato_1=i2c_read( );
//Se generan flancos y se lee un dato
dato_2=i2c_read( 0 );
//se lee el siguiente dato y se enva NO ACK
i2c_stop( );
//Se manda bit de STOP
i2c_start( );
//Se enva bit de START
i2c_write(0xA0);
//Direccin del Esclavo y escritura
posterior i2c_write(hi(direccion)); //Se manda parte alta de una
direccin i2c_write(direccin); //Se manda parte baja de la direccin
i2c_write(dato);
//Se enva el dato a grabar
i2c_stop( );
//Envo del bit de STOP
55
contador=0;
while
(contador<1
0)
{
while(!i2c_poll( ));
buffer[contador++]=i2c_read( );
} //Espera y recibe 10 bytes como
dispositivo esclavo
Otro ejemplo:
i2c_start(
);
//generacin de START
#use i2c(MASTER,
SDA=PIN_C4,
i2c_write(0xA0);
//Direccin de dispositivo y escritura
SCL=PIN_C3)
i2c_write(comando>>8);
//envo de parte alta de comando
long
comando;
i2c_write(comando);
//envo de parte baja
i2c_stop( );
//envo de bit de STOP
Comunicacin Serie Sncrona
56
57