Micro Control Adores y Lenguaje C
Short Description
Download Micro Control Adores y Lenguaje C...
Description
MICROCONTROLADORES Y LENGUAJE C
Fundamentos de Lenguaje Lenguaje C para PICs
Introducción En un programa en C se pueden diferenciar varios elementos. * Directivas de preprocesado /* FORMATO TIPO DE FICHERO - Indican al compilador cómo cómo debe generar el código máquina.
* Funciones - Bloque Bloquess funcionales funcionales del programa. - Siempr Siempree debe incluirse una una función llamada main() .
#includ #include e stdio.h>
C*/
//Directiva //Directiva
/* Suma dos enteros */ i nt nt s um um a (i nt nt a ,b ,b ) { return return (a+b); (a+b);
//Devuel //Devuelve ve suma
}
* Sentencias
- Instr Instruccion ucciones es que definen lo que hace el programa y la secuencia de ejecución del mismo.
/* Función principal */ main() { int dato1,dat dato1,dato2; o2; //Declaració //Declaración n int res; //Declar //Declaració ación n
* Comentarios
- Imprescindib Imprescindibles les como documentación del código fuente.
dato1=5; dato2=3;
//Asignación //Asignación
res=suma(dato1,dato2); }
Fundamentos de Lenguaje Lenguaje C para PICs
Variables Una variable es un nombre asignado a una o varias posiciones de memoria RAM. En C es necesario declarar declarar todas las variables variables antes de poder utilizarlas utilizarlas,, indicando indicando el nombre asignado y el tipo de datos que en ella ella se van a almacenar (opcionalmente (opcionalmente también el valor inicial inicial asignado).
tipo no nombre_variable [= [=valor] ;
p.e.: int i;
Los tipos de datos aceptados en C estándar son cinco: char (carácter) intt in (entero) float (coma flotante en 32 bits) double (coma flotante en 64 bits) void (sin valor)
Las variables pueden ser locales o globales. Las variables locales locales sólo pueden ser usadas en la función función en que se declaran, mientras que las variables globales son compartidas por todas las funciones del programa (deben declararse fuera de cualquier función y antes de ser utilizadas).
Fundamentos de Lenguaje Lenguaje C para PICs El compilador de CCS acepta los siguiente tipos de variable. Especificación
Significado
Tamaño
Rango
char
carácter
8 bits
(sin signo) signo) 0 a 255 (sin
int
entero
8 bits
(sin signo) signo) 0 a 255 (sin
float
coma fl f lotante
32 bits
double
floa floatt doble precisió precisiónn
no soportado
No para PCM
void
sin valor
nulo
ninguno
int1
entero de de 1 bit
1 bit
0a1
int8
entero de d e 8 bits
8 bits
(sin in sig signo) no) 0 a 255 (s
int16
entero de 16 bits
16 bits
int32
entero de 32 bits
32 bits
0 a (2 32-1)
short
entero de de 1 bit
1 bit
0a1
long
entero de 16 bits
16 bits
6 bits de precisión
0 a 65535
0 a 65535
(sin signo) gno)
(sin si sign gno) o)
Los tipos de variable short short y y long pueden tener detrás la palabra int sin efecto alguno.
Fundamentos de Lenguaje Lenguaje C para PICs Todos los tipos de datos son por defecto sin signo ( unsigned unsigned)) salvo los de tipo float float.. Para almacenar datos con signo, hay que introducir el modificador signed signed delante del tipo. tipo. El efecto que se consigue es el recogido en la siguiente tabla. Especificación
Significado
Tamaño
Rango
signed char
carác carácter ter con signo signo
8 bits
-128 a 127
sign si gned ed in intt
entero co con si signo
8 bits
-128 a 127
signed long
coma fl f lotante
16 bits
-32768 a 32767
Los números negativos se codifican en complemento a 2. Cuando se opera con distintos grupos de datos en una misma expresión, se aplican una serie de reglas para resolver las diferencias. En general se produce una “promoción” hacia los tipos de datos de mayor longitud presentes en la expresión.
Fundamentos de Lenguaje C para PICs
Funciones Las funciones son los bloques constructivos fundamentales en C. Todas las sentencias deben encontrarse dentro de funciones. Las funciones deben ser definidas antes de ser utilizadas. Formato general de definición de una función
tipo_dato nombre_func (tipo param1 , tipo param2 , … ) { cuerpo de la función (sentencias); } Las funciones pueden devolver un valor a la sentencia que las llama. El tipo de dato devuelto se indica mediante tipo_dato. Si no se indica nada, se entiende que devuelve un entero. Si no devuelve nada, debe incluirse una especificación tipo void.
Fundamentos de Lenguaje C para PICs La manera que tiene una función para devolver un valor es mediante la sentencia return. return (expresión);
return expresión;
La expresión debe proporcionar el mismo tipo de dato que el especificado en la función. Si no debe devolver nada, se finaliza con return;
Cuando una función se encuentra con una sentencia return se vuelve a la rutina de llamada inmediatamente y las sentencias posteriores a return no se ejecutan. Además de con las sentencia return, las funciones terminan su ejecución y vuelven al lugar desde donde se les llamó cuando alcanzan la llave de cierre de función } tras ejecutar la última sentencia de la misma.
Fundamentos de Lenguaje C para PICs Además de devolver valores, una función también puede recibir parámetros (denominados argumentos) según se indicó en su definición. Por ejemplo:
int suma (int a , int b) { return (a+b); } main() { int c; c = suma (10 , 23); }
Los argumentos se pueden pasar a las funciones por valor o por referencia. La llamada por valor copia el argumento de llamada en el parámetro formal de la función. La llamada por referencia usa la dirección de la variable que se pasa a la función.
Fundamentos de Lenguaje C para PICs
Operadores El lenguaje C define numerosos operadores mediante los cuales se construyen las expresiones (combinación de operadores y operandos).
Operadores aritméticos +
-
*
/
% (resto de división de enteros)
Operadores incremento y decremento x++
ó
++x
x--
ó
--x
Operadores relacionales >
>=
<
>
!=
Operadores lógicos &&
||
!
Operadores a nivel de bits &
|
^
~
a&b
a|b
a^b
~a
> n a 5V “0” -> 0V Micro a 5V lectura y escritura
“1” -> -5V a -15V “0” -> +5V a +15V
“1” -> -3V a -15V “0” -> +3V a +15V
Escritura RS232
Lectura RS232
Existen varios circuitos integrados comerciales que realizan esta adaptación con muy pocos componentes (p.e. la familia MAX220 a 249)
La conexión puede realizarse utilizando las líneas que se consideren oportunas. Se puede simplificar el conexionado y obviar las líneas de pregunta-respuesta “engañando” al emisor para hacerle creer que el receptor está siempre listo. El truco pasa por “puentear” las líneas de petición de envío y las respuestas.
Comunicación serie asíncrona
Emisores/Receptores de 2 canales para adaptación TTL -RS232 Una sola alimentación de 5V para generar tensiones de ±10V.
13
Comunicación serie asíncrona
Conexión serie según norma RS232: Comunicación PIC - PC Niveles escritura RS232 “1” -> -5V a -15V “0” -> +5V a +15V
“1” -> 5V “0” -> 0V RX TX GND EJEMPLO DE CONEXIÓN A 3 HILOS FULL DÚPLEX
Driver RS232 (MAX232)
TX
Pin3 Pin2
RX
Pin5
Puentes Pins 4 y 8 Pins 6 y 7
GND Niveles lectura RS232 “1” -> -3V a -15V “0” -> +3V a +15V
14
Comunicación Serie Síncrona I2C
Características generales de la comunicación serie Los datos se envían bit a bit por una misma línea durante un tiempo fijo. La velocidad de transmisión se indica en baudios (número de bits enviados por segundo). La transferencia puede ser síncrona o asíncrona. Síncrona: Se envía la señal de reloj para sincronizar cada bit. Asíncrona: Se necesitan “relojes” en el emisor y el receptor de la
misma frecuencia y en fase Datos
Datos EMISOR
¿Reloj?
Bit i RECEPTOR
Bit i+1
Reloj
Referencia de tensión
t
Comunicación Serie Síncrona I2C
Se emplean dos registros de desplazamiento (uno en el emisor y otro en el receptor) encadenados para la conversión paralelo/serie en la emisión y serie/paralelo en la recepción. Se puede llevar a cabo varios tipos de sincronización.
De los sucesivos bits. De cada paquete de bits (8 ó 9 bits)
Se envía la señal de reloj si la distancia entre Emisor y Receptor es corta.
Así se consiguen menores retardos en las transiciones y mejores flancos en la señal de reloj recibida.
Posibles codificaciones de cada bit. NRZ: Nivel alto: 1 / NRZI: Cambio de nivel: 1 / Impulso: 1 / RZ: ...
t
Nivel bajo: 0 Sin cambio de nivel: 0 Sin impulso: 0
Comunicación Serie Síncrona I2C
Transferencia Transfere ncia síncrona La comunicación comunicación síncrona entre dos dispositivos dispositivos requiere que uno de ellos actúe como maestro y el otro, como esclavo. Dispositi Dispositivo vo Maestr Maestro: o: Es el que que gener generaa la señal señal de reloj reloj y el que tiene tiene capacidad de iniciar iniciar o finalizar finalizar una transferenci transferenciaa . Disposit Dispositivo ivo Escla Esclavo: vo: Recibe Recibe la seña señall de reloj reloj y no tiene tiene capacid capacidad ad para para iniciar una transferencia de información. Es posib posible le efec efectuar tuar una transmis transmisión ión continu continua a de bits de informació informaciónn. Dato
M ae s t r o
Clk
Dato
Esclavo
Maestro
Clk
Esclavo
Ref.
Ref.
Maestro Maestro Emitiendo Emitiendo
Maestro Maestro Recibiendo Recibiendo
Comunicación Serie Síncrona I2C
Comunicación Comunic ación serie síncrona síncrona en micro microcontrol controlador adores es PIC Se imple implement mentaa mediant mediantee el módulo módulo SSP
: Interfaz de comunicación serie síncrona. Está pensado para poder poder comunicarse con otros otros microcontrolado microcontroladores res o periféricos mediante transmisión serie síncrona.
EEPROM serie Registros de Desplazamiento Drive Dr ivers rs de Dis Displa plays ys Conversores A/D ....
Almacenamiento de datos no volátiles Almacenamiento Expansión de entradas entradas y/o salidas Reducción de conexiones Digitalización externa de señales
El módulo SSP tiene dos posibles modos de funcionamiento. nterface: ace: Inter Interface face de Periférico Periféricoss Serie Serie)) SPI (Serial Peripheral Interf
SPI: Es una Marca Marca Registrada de Motorola Corporation
I 2C (Inter-I ntegrated Circuit: Entre Circuitos Integrados)
I2C: Es una Marca Registrada Registrada de Philips
Comunicación Serie Síncrona I2C
Característica Carac terísticass general generales es del bus bus I2C El bus Inter-Integrated-C Inter-Integrated-Circ ircuit uit (I2C) fue creado por Philips.
Para transferencia de datos entre entre CIs de una PCB. PCB. Soporta transmisión de datos de hasta 400kbd.
Es más lento que el módulo SPI.
Un bus I 2C puede tener distintas configuraciones.
Configuración de un y varios . Configuración . En cualquiera de estas configuraciones, el dispos dispositivo itivo es el único que tiene capacidad de iniciar la transferencia, decidir con quiénn se realiza, quié realiza, el sentido sentido de la misma misma (envío o recepció recepciónn desde el punto de vista del ) y cuándo se finaliza.
El bus I 2C consiste físicamente en dos líneas de colector abierto.
SCL para el reloj (pin (pin RC3) RC3).. SDA para los datos (pin (pin RC4) RC4)..
La comunicación es, por tanto,
.
Comunicación Serie Síncrona I2C
Las líneas necesitan resistencias externas de
.
Para poder implementar un (Y cablea cableado). do). Cuando el bus está inactivo, ambas líneas están a “1”.
El protocolo I 2C puede usar direcciones de 7 ó de 10 bits.
Puede haber hasta 128 ó hasta 1024 dispositivos colgados del bus. Con la dirección se informa si el quiere leer o escribir.
El protocolo I 2C incluye un mecanismo de comprobación (
).
- Cada transferencia de de 8 bits, el Maestro envía un un 9º pulso de reloj. - En ese instante, el dispositivo “transmisor” suelta la línea SDA y el “receptor” reconoce el dato enviado mediante un ACK (SDA ←0). - Se envía un NACK (deja SDA=1) SDA=1) para finalizar la transmisión.
Todos los cambios en SDA deben ocurrir mientras SCL=0.
Así se permit permitee diferen diferencia ciarr dos condiciones condiciones únicas: únicas: Secuencia START (S). El Maestro hace SDA←0 mientras SCL=1. Secuencia STOP (P). El Maestro hace SDA←1 mientras SCL=1.
Comunicación Serie Síncrona I2C
Fácil inclusión de nuevos dispositivos I 2C en el bus.
Una vez disponibl disponiblee el microcontr microcontrolado oladorr con sus funciones funciones de interface con bus interface bus I2C, la inclusión de un dispositivo I 2C adicional sólo precisaa su conexión precis conexión a las dos dos líneas líneas del bus (SDA (SDA y SCL), SCL) , que son las mismas para todos, todos, y asign asignarle arle una direcci dirección. ón.
Conexiones en el bus I 2C. VDD
R p ≥ Periférico Rp
V DD − V OL i OL
Rp Rs
Número máx. máx. de dispositivos dispositivos definidos por la capacida capacidadd en el bus: C max=400pF
Rs
SDA SCLL SC
C bus=10 – 400p 400pFF
Comunicación Serie Síncrona I2C
Direccionamiento de dispositivos en el bus I 2C
Formato de 7 bits: (A7-A6 (A7-A6-...-A1) -...-A1)
Reconocimiento (lo de debe be pone ponerr el Es Escl clav avo) o)
Lo “pone” “pone” el Maes Maestro tro
En la líneaSDA: Start
S A7 A6 A5 A4 A3 A2 A1 R/ R /W ACK Dirección de 7 bits bits del esclavo esclavo
Lectura Lectura (1) o Escri Escritur turaa (0)
Formato de 10 10 bits: (A9-A8-A7-...-A0) Primer byte del Maestro
2º byte del del Maestro Maestro
En la R ACK A7A6A5A4A3 A2A1A0 ACK líneaSDA: S 1 1 1 1 0 A9 A9 A8 W ACK S Start
Lectura Lectura (1) o Escri Escritur turaa (0)
Reconocimientos del Escl Esclavo avo despu de spués és de cad cadaa by byte te del Maestro
Comunicación Serie Síncrona I2C
Reconocimiento de transferencia (ACK)
Los datos se transmiten en paquetes de 8 bits (bytes). Tras cada byte el receptor debe intercalar un bit de reconocimiento (ACK). Si el receptor es el Esclavo y no genera el bit de reconocimiento después de cada byte, el Maestro debe abortar la transferencia generando un bit de fin (STOP).
En este caso, y dado que las etapas de salida son de drenador abierto, los niveles lógicos “0” son dominantes en las líneas, por lo que el Esclavo debe dejar su salida SDA a “1” para que el Maestro pueda generar el STOP (paso de “0” a “1” con SCL=“1”)
Si el receptor es el dispositivo Maestro, genera un ACK tras cada byte recibido, permitiendo al Esclavo que continúe enviando bytes. Si el Maestro decide finalizar la transferencia, genera un bit de STOP tras colocar un bit de no-reconocimiento (NACK). El Esclavo puede retardar el envío del siguiente byte (porque no lo tiene todavía disponible, p.e.) situando la línea SCL en estado bajo, forzando así al Maestro a situarse en un estado de “Espera” puesto que no podrá generar flancos en SCL.
Comunicación Serie Síncrona I2C
Secuencia de transmisión I 2C desde el Maestro.
SDA:
S Dirección del Esclavo De Maestro a Esclavo De Esclavoa Maestro
R/W
A Dato
“0” porque el Maestro quiere escribir (enviar)
A Dato
A/A
P
Reconocimiento (A) o no reconocimiento (A)
Secuencia de recepción I 2C por parte del Maestro.
SDA:
S Dirección del Esclavo R/W
A Dato
“1” porque el Maestro quiere leer (recibir)
A Dato
A P
No reconocimiento por Maestro y Parada
Comunicación Serie Síncrona I2C
Típica transmisión I 2C para lectura desde el Esclavo.
ACK
A7 A6 A5 A4 A3 A2 A1
Puesto por el Esclavo NACK
ACK D7 D6 D5 D43 D3 D2 D1 D0
D7 D6 D5 D4 D3 D2 D1 D0
R/W
1
S
2
3
4
5
6
7
8
9
1
2
Pulso ACK
3
4
5
6
7
8
9
1
2
3
ACK
5
6
7
Pulso ACK
8
9
P
Pulso ACK
Típica transmisión I 2C por parte del Esclavo.
A7 A6 A5 A4 A3 A2 A1
4
Puesto por el Maestro NACK
D7 D6 D5 D4 D3 D2 D1 D0
R/W S
1
2
3
4
5
6
7
8
9
Pulso ACK
1
2
3
4
5
El Esclavo pone SCL a 0 para darse tiempo de preparar el dato
6
7
8
9
P
Pulso ACK
Comunicación Serie Síncrona I2C
Repetición de START (Sr)
Si un dispositivo Maestro no desea abandonar el bus tras una transferencia, en lugar de generar un bit de STOP y volver a generar el nuevo START, puede generar una Repetición de START (Sr). La Repetición de START es idéntica a la condición de START (SDA pasa de 1 a 0 con SCL en estado alto) pero se produce tras un pulso de reconocimiento de bus (ACK) y no desde un estado inactivo.
Comunicación Serie Síncrona I2C
El interface I2C en los microcontroladores PIC Puede implementarse en dos módulos (s egún el tipo de PIC). BSSP (Basic )
Modo Esclavo: Completo por hardware. Modo Maestro: Detección de bits START y STOP por hardware. 16C64, 16C65, 16C73, 16C74, ...
MSSP (Master
)
Modo Esclavo: Completo por hardware. Modo Maestro: Completo por hardware. 16F87x
Ambos módulos son idénticos en lo que se refiere al interface SPI. Características del interface I 2C en el módulo MSSP.
- Detecta condiciones START y STOP en el bus por interrupción. - Permite seleccionar tres modos de operación. Esclavo I2 C con dirección de 7 bits. Esclavo I2 C con dirección de 10 bits. Maestro I2C con reloj SCL de frecuencia fSCL = fOSC/[4·(SSPADD+1)]
- Seis registros asociados al funcionamiento de este módulo. SSPCON SSPADD
SSPCON2 SSPBUF
SSPSTAT
Comunicación Serie Síncrona I2C
Diagrama de bloques del bus I 2C en modo Bus de datos Leer
RC3 / SCL
Escribir
SSPBUF
Reloj
Registro Registro E/S E/S
No Noaccesible accesible directamente directamente
SSPSR
RC4 / SDA
MSb
Buffer Buffer para para envío envío yy recepción recepción
LSb
Detector de dirección
Detecta coincidencia en la dirección o llamada general
SSPADD Detección de START/STOP
Control de los bits S y P del registro SSPSTAT
Dirección Dirección asignada asignada alal Esclavo Esclavo
Comunicación Serie Síncrona I2C
Diagrama de bloques del bus I 2C en modo Bus de datos Leer
SSPM3:SSPM0 SSPADD
Escribir
SSPBUF SDA In
RC4 SDA
SSPSR MSb
Generador de baudios
Reloj LSb
Generación de START/STOP ACK
RC3 SCL
Detección de START/STOP SCL In Colisión de bus
Detección de colisión Control de CLK
S , P , WCOL (SSPSTAT) SSPIF , BCLIF ACKSTAT , PEN (SSPCON2)
Comunicación Serie Síncrona I2C
Registro SSPSTAT (94h) SMP
bit 7
CKE
D/A
P
S
R/W
UA
BF
bit 4
SMP: Bit de control de slew rate 0 : V el oci dad estándar 1 : Alta velocidad (400k Hz) CKE: Bit de selección de niveles umbral en los pines 0: Especificaciones I 2C 1: Especificaciones SMBus D/A: Información del último byte transmitido 0: Dirección 1: Dato P: Bit de STOP Se pone a 1 si la última secuencia detectada es un bit de STOP
bit 3
S: Bit de START Se pone a 1 si la última secuencia detectada es un bit de START
bit 2
R/W: Información de lectura/escritura 0: Escritura 1: Lectura ( 0 : N o hay transmi sión 1 : Transmisión en pr ogreso ( UA: Actualización del byte de dirección 0: No hace falta 1 : Es necesario actualizar la dirección BF: Bit de estado del buffer 0: SSPBUF está vacío 1 : SSPBUF está lleno
bit 6 bit 5
bit 1 bit 0
)
)
Comunicación Serie Síncrona I2C
Registro SSPCON (14h) WCOL
SSPOV
SSPEN
CKP
SSPM3
SSPM2
bit 7
WCOL: Bit de detección de colisión 0 : N o ha habido coli sión 1 : Ha habid o colisión
bit 6
SSPOV: Bit indicador de overflow en la recepción 0: No ha habido overflow 1: Ha habido overflow
bit 5
SSPEN: Habilitación del puerto serie síncrono 0: Desabilitado 1: Habilitado (usa SCL y SDA)
bit 4
CKP: Control de SCL 0 : Mantiene SCL a “0”
SSPM1
SSPM0
1 : Reloj habilitado
bits 3:0 SSPM3:SSPM0: Modo de funcionamiento 0110: con direcciones de 7 bits. 0111 : con direcciones de 10 bits. 1000 : con CLK=Fosc / [4·(SSPADD+1)]. 1011 : Modo controlado por firmware ( inactivo). 1110: controlado por Fw(dir. de 7 bits, interrup. por bits de START y STOP). 1111: controlado porFw (dir. de 10 bits, interrup. por bits de START y STOP).
Comunicación Serie Síncrona I2C
Registro SSPCON2 (91h) GCEN
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
ACKSTAT
ACKDT
ACKEN
RCEN
PEN
RSEN
SEN
GCEN: Habilita 0: Deshabilitada 1 : Habilita interrupciones por / Recepción) ACKSTAT: Bit de reconocimiento ( 0: Recibido ACK del 1: No se ha recibido ACK del ACKDT: Valor a transmitir tras una recepción ( / Recepción) 0: ACK 1: NACK ACKEN: Habilitación de secuencia ACK ( / Recepción) 0 : Desactivada 1 : Inicia secuencia de reconocimiento en SDA y SCL RCEN: Bit de habilitación de recepción ( ) 0: Recepción desactivada 1: Activa modo recepción PEN: Habilitación de una secuencia STOP ( ) 0: Desactivada 1 : Inicia situación de STOP en SDA y SCL RSEN: Habilitación de START repetido ( ) 0: Desactivado 1 : Inicia repetidas situaciones de START SEN: Habilitación de una secuencia START ( ) 0: Desactivada 1: Inicia situación de START en SDA y SCL
Comunicación Serie Síncrona I2C
Otros registros relacionados con el módulo MSSP TRISC
(87h)
Para definir RC3 y RC4 como entradas.
SSPBUF
(13h)
Buffer de transmisión/recepción serie.
SSPSR
Registro de desplazamiento SSP (no accesible directamente).
SSPADD
(93h)
Define la dirección del
PIR1 – PIE1
(0Ch – 8Ch)
PIR2 – PIE2
(0Dh – 8Dh)
o los baudios de la comunicación (
).
Interrupciones del módulo SSP (SSPIF – SSPIE). Interrupción por colisión del bus (BCLIF – BCLIE).
INTCON
(0Bh , 8Bh , 10Bh , 18Bh)
Habilita interrupciones de periféricos.
Comunicación Serie Síncrona I2C
Funcionamiento en modo Antes de activar el módulo hay que configurar RC como entradas. Configurar el MSSP en el registro SSPCON.
I 2C con direcciones de 7 bits o con direcciones de 10 bits. I 2C con o sin interrupciones por bits de START y STOP. Lo más habitual es que no se usen interrupciones por ST ART/STOP
Establecer la dirección del esclavo.
Escribirla en el registro SSPADD.
La dirección viene indicada por SSPADD - SSPADD=0 LSb se usa para determinar la operación solicitada por el
Esperar por un suceso I 2C.
Se puede determinar con la ayuda del bit SSPIF. La interrupción puede estar activada o no
Identificar el suceso y actuar en consecuencia.
Los sucesos I2C que percibe el
pueden ser de 5 tipos.
Comunicación Serie Síncrona I2C
solicita escritura. Último byte fue una dirección El ha comenzado una operac ión de escritura con el inicio de una secuencia START o RESTART en el bus, seguida del envío de la dirección del . La dirección que hay en el bus pasa al registro SSPSR del Si coincide con la suya, la dirección recibida pasa a SSPBUF.
.
Bits del registro SSPSTAT. -S=1 La última secuencia detectada fue un START - R/W = 0 El va a escribir datos en el - D/A = 0 El último byte recibido fue una dirección - BF = 1 El buffer está lleno Debe leerse el registro SSPBUF aunque no se vaya a usar la información que contiene. Esta acción borra el bit BF y evita posteriores .
Comunicación Serie Síncrona I2C
solicita escritura. Último byte fue un dato Tras el byte de dirección, el bytes de datos al .
puede enviar uno o más
Bits del registro SSPSTAT. -S=1 La última secuencia detectada fue un START - R/W = 0 El escribe datos en el - D/A = 1 El último byte recibido fue un dato - BF = 1 El buffer está lleno Debe leerse el registro SSPBUF. Si SSPBUF no estaba lleno antes de la escritura, el un reconocimiento ACK en el 9º pulso de reloj.
Lo hace el MSSP automáticamente. Si ya estaba lleno, SSPOV ← 1 y se envía un NACK.
envía
Comunicación Serie Síncrona I2C
solicita lectura. Último byte fue una dirección El ha comenzado una operación de lec tura con el inicio de una secuencia START o RESTART en el bus, seguida del envío de la dirección del . Bits del registro SSPSTAT. -S=1 La última secuencia detectada fue un START - R/W = 1 El va a leer datos del - D/A = 0 El último byte recibido fue una dirección - BF = 0 El buffer está vacío El bit CKP se pone a 0 para que la línea SCL pase a estado bajo, dando así tiempo al para preparar el dato a enviar. El
debe escribir en el buffer el dato solicitado por el .
Y debe hacer CKP
←
1 para liberar la línea SCL.
Comunicación Serie Síncrona I2C
solicita lectura. Último byte fue un dato El
ya ha leído un dato del
y quiere leer otro.
Bits del registro SSPSTAT. -S=1 La última secuencia detectada fue un START - R/W = 1 El lee datos del - D/A = 1 El último byte recibido fue un dato - BF = 0 El buffer está vacío El bit CKP se pone a 0 para que la línea SCL pase a estado bajo, dando así tiempo al para preparar el dato a enviar. El Esclavo manda el dato al Maestro escribiéndolo en el registro SSPBUF y haciendo CKP 1 para liberar la línea SCL.
Comunicación Serie Síncrona I2C
envía NACK El ha enviado un NACK como respuesta al dato que ha recibido desde el .
De este modo indica que ya no quiere recibir más datos. Bits del registro SSPSTAT. -S=1 La última secuencia detectada fue un START - R/W = 0 La lógica del queda reseteada - D/A = 1 El último byte recibido fue un dato - BF = 0 El buffer está vacío El envío de un NACK queda identificado porque R/W
0.
Debido a que la recepción de un NACK da lugar a un reset de la lógica I 2C del . Esta situación da lugar a que los bits del registro SSPSTAT reflejen una situación incoherente. Indican que se ha recibido un dato del está vacío.
pero que el buffer
Comunicación Serie Síncrona I2C
Control de errores en modo Cada vez que se lee el SSPBUF, el usuario debe asegurarse de que no han ocurrido overflows.
Comprobando el estado del bit SSPOV. Si ha ocurrido un overflow, será necesario hacer SSPOV SSPBUF para permitir nuevas recepciones.
←
0 y leer
Los sucesos que tienen lugar tras un overflow dependen de cada caso.
La lógica del Típicamente el reciba un ACK.
le enviará un NACK al . intentará volver a enviar el dato hasta que
Tras escribir un dato en SSPBUF, el usuario debe comprobar el valor de WCOL para asegurar que no se ha producido una colisión.
En la práctica, no habrá colisiones si únicamente se escribe en SSPBUF cuando BF=0 y el está transmitiendo al .
Comunicación Serie Síncrona I2C
Funcionamiento en modo Configurar el MSSP para funcionar en modo
- Definir líneas SDA y SCL como entradas.
I 2C.
TRISC ← xxx11xxx
- Configurar el modo I2C.
SSPCON1 ← 00101000
- Seleccionar los baudios de la comunicación. Sólo se usan los bits 0 a 6
SSPADD ← [(f osc/Bd) / 4] – 1 Control del slew rate (SSPSTAT)
100kHz 400kHz 1MHz
- Configurar interrupciones (si se necesitan) SSPIE / SSPIF -
BCLIE / BCLIF
Implementar alguno de los 6 eventos I 2C.
1. START 2. RESTART 3. STOP 4. Leer (recibir datos)
5. Reconocer (tras una lectura) * ACK * NACK
6. Escribir (transmitir datos)
Comunicación Serie Síncrona I2C
Funcionamiento del Maestro Secuencia típica de transmisión de un byte por parte del Maestro a) Se genera una condición de START poniendo a 1 el bit de habilitación
de START (SEN) del registro SSPCON2.
b) Se esperará el tiempo necesario para detectar START , cuando se
haya dado la condición, SSPIF=1 (se debe poner a 0 por software).
c) Se carga SSPBUF con la dirección a enviar por el bus y el bit R/W=0. d) Los bits de la dirección salen por SDA hasta completar los 8 bits. e) Se el bit de reconocimiento (ACK) recibido del esclavo y se
introduce ese bit en SSPCON2.
f) Al final del 9º flanco en SCL, se pone SSPIF=1 (hay que resetearlo). g) Se cargan en SSPBUF los 8 bits del dato a enviar. h) Los bits del dato salen por SDA hasta completar la transmisión. el bit de reconocimiento (ACK) y se graba su valor en i) Se
SSPCON. j) Al final del 9º flanco en SCL se pone SSPIF a 1 (hay que ponerlo a 0). k) Se genera una condición de STOP poniendo a 1 el bit de habilitación de STOP (PEN) de SSPCON2. l) Una vez detectada la condición de STOP, se pone a 1 el flag SSPIF.
Comunicación Serie Síncrona I2C
Generación de una secuencia START Hacer SEN
1 para habilitar la generación de START.
Bit SSPCON2.
Esto da lugar a que la línea SDA pase a “0” mientras SCL está a “1”.
Así se define una secuencia START, que da lugar a: S←1 SEN ← 0 SSPIF ← 1
(SSPSTAT) (SSPCON2) (PIR1)
Generación de una secuencia de START repetido Hacer RSEN
1 para habilitar la generación de RESTART.
Bit SSPCON2.
Esto da lugar a que se ejecuten secuencias de START sin ser precedidas de la correspondiente secuencia de STOP.
De este modo, el
no cede el control del bus en ningún momento.
Comunicación Serie Síncrona I2C
Generación de una secuencia STOP Hacer PEN
1 para habilitar la generación de STOP.
Bit SSPCON2.
Esto da lugar a que la línea SDA pase a “1” mientras SCL está a “1”.
Se indica así que ha finalizado la recepción/transmisión. El bus I2C queda libre y se tiene: P←1 PEN ← 0 SSPIF ← 1
(SSPSTAT) (SSPCON2) (PIR1)
Generación de una lectura (recepción) Hacer RCEN
1 para habilitar una lectura.
Bit SSPCON2.
Entran bits cada pulso de SCL en SSPSR.
Tras el 8º bit, RCEN ← 0, SSPSR ← SSPBUF, BF ← 1, SSPIF ← 1. En ese momento SCL=0 y hay que leer el buffer para hacer BF ← 0. A continuación se puede enviar un ACK.
Comunicación Serie Síncrona I2C
Generación de un ACK Indicar en ACKDT si se va a generar un ACK (“0”) o un NACK (“1”).
Bit SSPCON2.
Hacer ACKEN
1 para habilitar la generación de ACK.
Bit SSPCON2.
Esto libera la línea de datos (SDA ponga a “0” durante un pulso de reloj.
1), para que el receptor la
Tras este pulso de reloj, ACKEN ← 0 automáticamente. Es obligatorio mandar un ACK/NACK al final de cada transferencia. ¡¡IMPORTANTE!!
Generación de una escritura (transmisión) Basta con escribir el dato a enviar en SSPBUF.
- BF ← 1 mientras se está enviando el dato. - Cuando se ha enviado el 8º bit, BF ← 0. - El Maestro libera entonces SDA para recibir ACK. - Tras el 9º pulso de reloj, SSPIF ← 1.
Comunicación Serie Síncrona I2C
Control de errores en modo Las colisiones por escritura deben controlarse mediante observación del bit WCOL (SSPCON).
Una colisión de escritura sucede cuando se intenta escribir un dato en el buffer antes de que haya terminado el evento anterior. No tiene asociada ninguna interrupción. Las colisiones de bus sí tienen asociada una interrupción: BCLIF.
Cuando SCL=1, el dato en SDA debe ser estable. Se produce colisión de bus cuando el dato cambia mientras SCL=1 o si se detecta SDA=0 cuando SDA debería ser 1 (estar libre). En ese caso se hace BCLIF ← 0 y se pone la lógica I 2C en reposo. La siguiente secuencia deberá ser un START. Un NACK puede indicar error o simplemente un estado de funcionamiento que debe ser detectado y procesado.
El puede recibir un NACK si hay un error en el o si éste está desbordado. Según la situación, el Maestro deberá generar un RESTART, un STOP o un STOP/START.
Comunicación Serie Síncrona I2C
Bus I2C en el compilador C de CCS Configuración del módulo I 2C
#use i2c (opciones) opciones: MASTER
SLAVE SCL = pin SDA = pin ADDRESS = nn FAST SLOW NOFORCE_SW RESTART_WDT
Selecciona modo Selecciona modo Especifica el pin SCL (PIN_C3) Especifica el pinSCL (PIN_C4) Especifica la dirección del Selecciona la especificación I2C rápida Selecciona la especificación I2C lenta Utiliza funciones I 2C hardware. Resetea el WDT mientras espera a hacer una lectura de bus
2 SiSino nose seindica indica NOFORCE_SW implementaráelelprotocolo protocoloII2CCpor porsoftware. software. NOFORCE_SW, ,implementará - Pensado para aquellos microcontroladores PIC que no disponen de MSSP.
- Pensado para aquellos microcontroladores PIC que no disponen de MSSP. --ElElmodo , ,sin modo sinembargo, embargo,deberá deberáusarse usarsecon conelelMSSP. MSSP.
Comunicación Serie Síncrona I2C
Secuencias de ST ART y STOP
i2c_start (); Si el PIC está en modo , esta instrucción genera una secuencia START, tras la cual la línea SCL se pone a “0” hasta que se escribe en el bus. Si se lanza otra secuencia START antes de que se produzca una secuencia STOP, se habrá ejecutado una secuencia RESTART.
i2c_stop (); Si el PIC está en modo secuencia STOP.
, esta instrucción genera una
View more...
Comments