3.8 Módulos de Comunicación Serie
El USART es uno de los primeros sistemas de comunicación serie. Las versiones nuevas de este sistema están actualizadas y se les denomina un poco diferente - EUSART.
EUSART
El módulo Transmisor/Receptor Universal Síncrono/Asíncrono mejorado (Enhanced Universal Synchronous Asynchronous Receiver Transmitter - EUSART) es un periférico de comunicación serie de entrada/salida. Asimismo es conocido como Interfaz de comunicación serie (Serial Communications Interface - SCI). Contiene todos los generadores de señales de reloj, registros de desplazamiento y búfers de datos necesarios para realizar transmisión de datos serie de entrada/salida, independientemente de la ejecución de programa del dispositivo. Como indica su nombre, aparte de utilizar el reloj para la sincronización, este módulo puede establecer la conexión asíncrona, lo que lo hace único para algunas aplicaciones. Por ejemplo, en caso de que sea difícil o imposible proporcionar canales especiales para transmisión y recepción de datos y señales de reloj (por ejemplo, mando a distancia de radio o infrarrojas), el módulo EUSART es definitivamente la mejor opción posible.
El EUSART integrado en el PIC16F887 posee las siguientes características:
- Transmisión y recepción asíncrona en modo Full-duplex;
- Caracteres de anchura de 8 – 9 bits programables;
- Detección de dirección en modo de 9 bits;
- Detección de errores por saturación del búfer de entrada; y
- Comunicación Half Duplex en modo síncrono.
EUSART EN MODO ASÍNCRONO
El EUSART transmite y recibe los datos utilizando la codificación de no retorno a cero - NRZ (non-return-to-zero). Como se muestra en la siguiente figura, no se utiliza una señal de reloj y los datos se transmiten de forma muy simple:
Cada dato se transmite de la siguiente forma:
- En estado inactivo la línea de datos permanece en estado alto (1);
- Cada transmisión de datos comienza con un bit de arranque (START), el cual, siempre es cero (0);
- Cada dato tiene un ancho de 8 o 9 bits (primero se transmite el bit menos significativo - LSB); y
- Cada transmisión de datos termina con un bit de parada (STOP), el cual, siempre es uno (1) La siguiente figura muestra cómo conectar de manera habitual un microcontrolador PIC que utiliza el módulo EUSART. El circuito RS-232 se utiliza como un convertidor de nivel de voltaje.
Figure below shows a common way of connecting PIC microcontroller that uses EUSART module. The RS-232 circuit is used as a voltage level converter.
EUSART EN MODO DE TRANSMISOR ASÍNCRONO
Para habilitar la transmisión de datos por medio del módulo EUSART, es necesario configurarlo para que funcione como un transmisor. En otras palabras, es necesario definir el estado de los siguientes bits:
- TXEN = 1 - El transmisor EUSART se habilita al poner a uno el bit TXEN del registro TXSTA.
- SYNC = 0 - El EUSART se configura a funcionar en modo asíncrono al poner a cero el bit SYNC del registro TXSTA.
- SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART está habilitado y el pin TX/CK se configura automáticamente como salida. Si el bit se utiliza simultáneamente para alguna función analógica, se debe deshabilitar al poner a cero el bit correspondiente del registro ANSEL.
La parte central del transmisor EUSART ocupa el registro de desplazamiento TSR que no está directamente disponible al usuario. Para iniciar la transmisión de datos, el módulo debe estar habilitado al poner a uno el bit TXEN del registro TXSTA. Los datos a enviar se deben escribir en el registro TXREG, lo que resultará en la siguiente secuencia de eventos:
- Byte será transmitido inmediatamente al registro de desplazamiento TSR;
- El registro TXREG permanece vacío, lo que indica la bandera de bit TXIF del registro PIR1. Si se pone a uno el bit TXIE del registro PIE1, se generará una interrupción. De todos modos, la bandera se pone a uno sin reparar en si una interrupción está habilitada o no y no se puede poner a cero por software, sino al escribir un dato nuevo en el registro TXREG.
- Dispositivos electrónicos de control "empujan" el dato hacia el pin TX en sincronización con señal de reloj interna: bit de arranque (START) (1).....datos....bit de parada (STOP) (1).
- Cuando el último bit abandona el registro TSR, el bit TRMT en el registro TXSTA se pone a cero automáticamente.
- Si mientras tanto se escribe un dato nuevo en el registro TXREG, todo el procedimiento se repite inmediatamente después de la transmisión del bit de parada del dato anterior.
Para transmitir un dato de 9 bits es necesario poner a uno el bit TX9 del registro TXSTA. El bit TX9D del registro TXSRTA es el noveno bit y el más significativo. Al transmitir un dato de 9 bits, el bit de datos TX9D deberá estar escrito antes de que de se escriban los 8 bits menos significativos en el registro TXREG. Todos los nueve bits de datos se transmiten al registro de desplazamiento TFR inmediatamente después de que se acabe la escritura en el registro TXREG.
EUSART EN MODO DE RECEPTOR ASÍNCRONO
Similar al poner en marcha el transmisor del EUSART, para habilitar el receptor es necesario configurar los siguientes bits:
- CREN = 1 - El receptor EUSART se habilita al poner a uno el bit CREN del registro RCSTA;
- SYNC = 0 - El EUSART se configura a funcionar en modo asíncrono al poner a cero el bit SYNC del registro TXSTA; y
- SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART está habilitado y el pin RX/DT se configura automáticamente como salida. Si el bit se utiliza simultáneamente para alguna función analógica, se debe desha bilitar al poner a cero el bit correspondiente del registro ANSEL.
Después de que se haya terminado el primer paso necesario y se haya detectado el bit de arranque (START), el dato se transmite al registro de desplazamiento RSR por el pin RX. Al haber recibido el bit de parada (STOP), ocurre lo siguiente:
- El dato se transmite automáticamente al registro RCREG (si está vacío);
- El bit de bandera RCIF se pone a uno y ocurre una interrupción si está habilita da por el bit RCIE en el registro PIE1. Similar al transmisor, el bit de bandera se pone a cero sólo por software, o sea, al leer el registro RCREG. Tenga en cuenta que esto es un doble registro de tipo FIFO (primero en entrar, primero en salir - first-in, first-out), lo que permite almacenamiento de dos caracteres simultáneamente);
- Si el registro RCREG está ocupado (contiene dos bytes) y el registro de desplazamiento detecta el nuevo bit de parada (STOP), el bit de sobrescritura OERR se pondrá a uno. En tal caso se pierde un dato nuevo que viene, y el bit OERR debe ponerse a cero por software al poner a cero y luego al poner a uno el bit CREN;
Nota: No es posible recibir un dato nuevo sino hasta que el bit OERR esté a uno.
- Si el bit de parada (STOP) está a cero (0), el bit FERR del registro RCSTA estará a uno, lo que indica un error en recepción; y
- Para habilitar la recepción de un dato de 9 bits, es necesario poner a uno el bit RX9 del registro RCSTA.
DETECCIÓN DE ERRORES EN RECEPCIÓN
El microcontrolador puede detectar automáticamente dos tipos de errores. El primero es denominado error de encuadre
(Framing error). Ocurre cuando el receptor no detecta el bit de parada en un intervalo predeterminado de tiempo. Este error se indica mediante el bit FERR del registro RCSTA. Si el bit está a uno, el último dato recibido puede ser incorrecto. Cabe destacar lo siguiente:
- El error de encuadre no genera por si mismo una interrupción;
- Si el bit está a uno, el último dato recibido contiene un error;
- El error de encuadre (bit está a uno) no impide la recepción de un dato nuevo;
- El bit FERR se pone a cero al leer el dato recibido, lo que significa que se debe hacer una verificación antes de leer el dato; y
- El bit FERR no se puede poner a cero por software. Si es necesario, se puede borrar al poner a cero al bit SPEN del registro RCSTA, lo cual, simultáneamente causa una reinicialización del sistema EUSART.
Otro tipo de error es denominado error de sobrescritura (Overrun Error). Como hemos mencionado anteriormente, el registro de tipo FIFO puede almacenar sólo dos caracteres. Un error de sobrescritura ocurre cuando el registro recibe el tercer carácter. Simplemente no hay espacio para almacenar un byte más, por lo que un error es inevitable. Cuando ocurre este error, el bit OERR del registro RCSTA se pone a uno. Las consecuencias son las siguientes:
- Los datos almacenados en los registros FIFO (2 bytes) se pueden leer normalmente;
- No se recibirán más datos hasta que el bit OERR esté puesto a cero; y
- A este bit no se le puede acceder directamente. Para borrarlo, es necesario poner a cero el bit CREN del registro RCSTA o reiniciar el sistema EUSART al poner a cero al bit SPEN del registro RCSTA.
RECEPCIÓN DE DATOS DE 9 BITS
Aparte de recibir los datos de forma estándar de 8 bits, el sistema EUSART soporta la recepción de datos de 9 bits. En el lado del transmisor, el noveno bit “se adjunta” al byte original directamente antes del bit de parada. En el lado del receptor, al poner a uno el bit RX9 del registro RCSTA, el noveno bit de datos será automáticamente escrito en el bit RX9D del mismo registro. Después de almacenar este byte, es necesario tener cuidado en como leer estos bits - primero se debe leer el bit RX9D y luego los ocho (8) bits menos significativos del registro RCREG. De otra forma, el noveno bit será puesto a cero antes de ser leído.
DETECCIÓN DE DIRECCIÓN
Cuando el bit ADDEN del registro RCSTA está a uno, el modulo EUSART es capaz de recibir sólo los datos de 9 bits, mientras que se ignoran todos los datos de 8 bits. Aunque parece una restricción, este modo habilita la comunicación serial entre varios microcontroladores. El principio de funcionamiento es muy simple. El dispositivo maestro envía un dato de 9 bits que representa la dirección de un microcontrolador esclavo. No obstante, todos deben tener el bit ADDEN puesto a uno, ya que de esta manera se habilita la detección de dirección. Todos los microcontroladores esclavos que comparten la misma línea de transmisión, reciben este dato (dirección) y verifican automáticamente si coincide con su propia dirección. El software, en el que ocurre la coincidencia de dirección, debe deshabilitar la detección de dirección, poniendo a cero el bit ADDEN.
El dispositivo maestro sigue enviando los datos de 8 bits al microcontrolador. Todos los datos que pasan por la línea de transmisión serán recibidos sólo por el módulo EUSART direccionado. Una vez recibido el último byte, el microcontrolador esclavo debe poner a uno el bit ADDEN para habilitar de nuevo la detección de dirección.
Registro TXSTA
CSRC - Clock Source Select bit - (bit de selección de la fuente de reloj) determina la fuente del reloj. Se utiliza sólo en modo sincrónico.
- 1 - Modo Maestro. Reloj generado internamente por el generador de tasa de baudios.
- 0 - Modo Esclavo. Reloj proveniente de una fuente externa.
TX9 - 9-bit Transmit Enable bit (bit de habilitación del modo de 9 bits en transmisión)
- 1 - Se habilita el modo de 9 bits en transmisión por el sistema EUSART.
- 0 - Se habilita el modo de 8 bits en transmisión por el sistema EUSART.
TXEN - Transmit Enable bit (Bit de habilitación de transmisión)
- 1 - Transmisión habilitada.
- 0 - Transmisión deshabilitada.
SYNC - EUSART Mode Select bit (Bit de selección del modo EUSART)
- 1 - El EUSART funciona en modo síncrono.
- 0 - El EUSART funciona en modo asíncrono.
SENDB - Send Break Character bit (Bit de envío de carácter Break en modo asíncrono) se utiliza sólo en modo asíncrono y cuando se requiere obedecer el estándar de bus LIN.
- 1 - Se enviará un carácter Break en la próxima transmisión (se pone a 0 por hardware cuando finaliza el envío).
- 0 - Envío del carácter de transmisión Break completado.
BRGH - High Baud Rate Select bit (bit de selección de modo de alta velocidad en modo asíncrono). Determina la velocidad de transmisión en modo síncrono. No afecta al EUSART en modo síncrono.
- 1 - EUSART funciona a alta velocidad.
- 0 - EUSART funciona a baja velocidad.
TRMT - Transmit Shift Register Status bit (bit de estado de registro de desplazamiento de transmisión)
- 1 - Registro TSR está vacío.
- 0 - Registro TSR está lleno.
TX9D - Ninth bit of Transmit Data (Valor del noveno bit en transmisión) Puede ser utilizado como dirección o bit de paridad o para distinguir entre dirección o dato en los buses maestro-esclavo).
Registro RCSTA
SPEN - Serial Port Enable bit (bit de habilitación del puerto serie)
- 1 - Puerto serie habilitado. Los pines RX/DT y TX/CK se configuran automáticamente como entrada y salida, respectivamente.
- 0 - Puerto serie deshabilitado.
RX9 - (bit de habilitación del modo de 9 bits en recepción):
- 1 - Se habilita la recepción de datos de 9 bits por medio del sistema EUSART.
- 0 - Se habilita la recepción de datos de 8 bits por medio del sistema EUSART.
SREN - Single ReceiveEnable bit (bit de habilitación de la recepción simple). Es utilizado sólo en modo sincrónico y en funcionamiento como Maestro.
- 1 - Recepción simple habilitada.
- 0 - Recepción simple deshabilitada.
CREN - Continuous Receive Enable bit (bit de habilitación de la recepción continua) actúa dependiendo del modo EUSART.
Modo asíncrono:
- 1 - Recepción habilitada.
- 0 - Recepción deshabilitada.
Modo síncrono:
- 1 - Se habilita la recepción continua hasta que el bit CREN esté a cero.
- 0 - No se habilita la recepción en forma continua.
ADDEN - Address Detect Enable bit (bit de habilitación de la detección de dirección) se utiliza sólo en modo de detectar la dirección.
- 1 - Habilita la detección de dirección (sólo se procesa un byte recibido en el registro de desplazamiento de recepción si el noveno bit está a uno)
- 0 - Detección de dirección deshabilitada (todos los bytes recibidos en el registro de desplazamiento de recepción son procesados independientemente del valor del noveno bit recibido). El noveno bit se utiliza como bit de paridad.
FERR - Framing Error bit (bit de error de encuadre)
- 1 - Se ha producido un error de encuadre en recepción.
- 0 - No se ha producido un error de encuadre.
OERR - Overrun Error bit (bit de error de sobrescritura).
- 1 - Se ha producido un error de sobrescritura en recepción.
- 0 - No se ha producido un error de sobrescritura.
RX9D - Ninth bit of Received Data No se ha producido un error de sobrescritura.
GENERADOR DE BAUDIOS DEL EUSART (BRG)
Si mira atentamente al diagrama del receptor o transmisor EUSART asíncrono, verá que los ambos utilizan señal de reloj del temporizador local BRG para la sincronización. La misma fuente de reloj se utiliza también en modo síncrono.
El temporizador BRG consiste en dos registros de 8 bits haciendo un registro de 16 bits.
El valor de un número escrito en estos dos registros determinará la velocidad de transmisión en baudios. Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro BAUDCTL, afectan la frecuencia de reloj utilizada para el cálculo de los baudios.
El valor de un número escrito en estos dos registros determinará la velocidad de transmisión en baudios. Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro BAUDCTL, afectan la frecuencia de reloj utilizada para el cálculo de los baudios.
BITS |
MODO BRG / EUSART |
FÓRMULA DE VELOCIDAD DE TRANSMISIÓN EN BAUDIOS |
SYNC |
BRG1G |
BRGH |
0 |
0 |
0 |
de 8 bits /asíncrono |
Fosc / [64 (n + 1)] |
0 |
0 |
1 |
de 8 bits / asíncrono |
Fosc / [16 (n + 1)] |
0 |
1 |
0 |
de 16 bits / asíncrono |
Fosc / [16 (n + 1)] |
0 |
1 |
1 |
de 16 bits / asíncrono |
Fosc / [4 (n + 1)] |
1 |
0 |
X |
de 8 bits / síncrono |
Fosc / [4 (n + 1)] |
1 |
1 |
X |
de 16 bits / síncrono |
Fosc / [4 (n + 1)] |
Las tablas en las siguientes páginas contienen los valores que deben estar escritos en el registro de 16 bits SPBRG y asignados a los bits SYNC, BRGH y BRGH16 para obtener algunos valores de la velocidad de transmisión en baudios estándar. La fórmula para hacer el cálculo de la velocidad de transmisión en baudios:
Registro BAUDCTL
ABDOVF - Auto-Baud Detect Overflow bit (bit de desbordamiento de auto-detección de la velocidad de transmisión) se utiliza sólo en modo asíncrono durante la detección de la velocidad de transmisión.
- 1 - Se ha producido desbordamiento durante la auto-detección.
- 0 - No se ha producido desbordamiento durante la auto-detección.
RCIDL - Receive Idle Flag bit No se ha producido desbordamiento durante la auto-detección.
- 1 - Receptor en estado inactivo. No hay operación de recepción en marcha.
- 0 - Se ha recibido el bit de arranque (START) y hay una operación de recepción en marcha.
SCKP - Synchronous Clock Polarity Select bit. (bit de selección de polaridad de la señal de reloj en modo síncrono). El estado lógico de este bit difiere dependiendo de cuál modo de EUSART está activo
Modo asíncrono:
- 1 - El dato invertido se transmite al pin RC6/TX/CK.
- 0 - El dato no invertido se transmite al pin RC6/TX/CK.
Modo síncrono:
- 1 - Sincronización en el flanco ascendente de la señal de reloj.
- 0 - Sincronización en el flanco descendente de la señal de reloj.
BRG16 16-bit Baud Rate Generator bit - (bit de habilitación del generador de velocidad de transmisión de 16 bits) determina si el registro SPBRGH se utilizará, o sea si el temporizador BGRG tendrá 8 o 16 bits.
- 1 - Se utiliza el generador de velocidad de transmisión de 16 bits
- 0 - Se utiliza el generador de velocidad de transmisión de 8 bits
WUE Wake-up Enable bit (bit de habilitación del modo de auto-activación en modo asíncrono):
- 1 - Modo de auto-activación habilitado. El receptor espera a que el flanco descendente aparezca en el pin RC7/RX/DT para que el microcontrolador se despierte del modo de reposo.
- 0 - Modo de auto-activación habilitado. El receptor funciona normalmente.
ABDEN - Auto-Baud Detect Enable bit (bit de habilitación de auto-detección de velocidad de transmisión) se utiliza sólo en modo asíncrono.
- 1 - Modo de auto-detección habilitado. Al detectar la velocidad de transmisión, el bit se pone a uno automáticamente.
- 0 - Modo de auto-detección deshabilitado.
Vamos a hacerlo en mikroC...
/* En este ejemplo, el módulo EUSART interno se inicializa y se ajusta para enviar el
mensaje inmediatamente después de recibirlo. La velocidad de transmisión en baudios se
ajusta a 9600 bps. El programa utiliza las siguientes rutinas de librería UART:
UART1_init(), UART1_Write_Text(), UART1_Data_Ready(), UART1_Write() y UART1_Read().*/
char uart_rd;
void main() {
ANSEL = ANSELH = 0; // Todos los pines se configuran como digitales
C1ON_bit = C2ON_bit = 0; // Deshabilitar los comparadores
UART1_Init(9600); // Inicializar el módulo UART a 9600 bps
Delay_ms(100); // Esperar a que señal de reloj del módulo UART se
// ponga estable
UART1_Write_Text("Start");
while (1) { // Bucle infinito
if (UART1_Data_Ready()) { // Si el dato se ha recibido,
uart_rd = UART1_Read(); // lea el dato recibido
UART1_Write(uart_rd); // y envíelo atrás por el UART
}
}
}
Transmisión serial asíncrona a través de los registros del módulo EUSART
- La velocidad de transmisión deseada deberá estar ajustada a través de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
- La velocidad de transmisión deseada deberá estar ajustada a través de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
- La velocidad de transmisión deseada deberá estar ajustada a través de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
- La transmisión de datos es habilitada poniendo a uno el bit TXEN del registro TXSTA. El bit TXIF del registro PIR1 está automáticamente puesto a uno.
- Para que el bit TXEN cause una interrupción, tanto el bit TXIE del registro PIE1 como los bits GIE, PEIE del registro INTCON deberán estar puestos a uno.
- En una transmisión de datos de 9 bits, el valor del noveno bit deberá estar escrito en el bit TX9D del registro TXSTA.
- La transmisión comienza cuando se escribe el dato de 8 bits sobre el registro de recepción TXREG.
Recepción serial asíncrona a través de los registros del módulo EUSART:
- La velocidad de transmisión deseada deberá estar ajustada a través de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
- El bit SYNC (del registro TXSTA) deberá estar puesto a cero y el bit SPEN (del registro RCSTA) deberá estar puesto a uno a fin de habilitar el puerto serie.
- Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON deberán estar puestos a uno si se necesita habilitar que la recepción de dato cause una interrupción.
- Para una recepción de datos de 9 bits, el bit RX9 (del registro RCSTA) deberá estar puesto a uno
- La recepción de datos es habilitada poniendo a uno el bit CREN del registro RCSTA.
- El registro RCSTA deberá leerse para obtener información acerca de la ocurrencia de errores durante la recepción. El valor del noveno bit será almacena do en este registro en la recepción de datos de 9 bits.
- El dato de 8 bits recibido será almacenado en el registro RCREG y deberá leerse para obtener dicho dato.
Ajustar el modo de detección de dirección:
- La velocidad de transmisión deseada deberá estar ajustada a través de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
- El bit SYNC (del registro TXSTA) deberá estar puesto a cero y el bit SPEN (del registro RCSTA) deberá estar puesto a uno (1) a fin de habilitar el puerto serie.
- Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON deberán estar puestos a uno si se necesita habilitar que la recepción de dato cause una interrupción.
- El bit RX9 del registro RCSTA debe estar a uno.
- El bit ADDEN del registro RCSTA debe estar a uno, lo que habilita que un dato sea reconocido como dirección.
- La recepción de datos es habilitada poniendo a uno el bit CREN del registro RCSTA.
- Tan pronto como se reciba un dato de 9 bits, el bit RCIF del registro PIR1 estará automáticamente puesto a uno. Si está habilitada se produce una interrupción.
- El registro RCSTA deberá leerse para obtener información acerca de la ocurrencia de errores durante la transmisión. El noveno bit RX9D siempre estará a uno.
- El dato de 8 bits recibido será almacenado en el registro RCREG y deberá leerse. Se deberá comprobar si la combinación de estos bits coincide con la dirección predefinida. Si coincide, es necesario poner a cero el bit ADDEN del registro RCSTA, lo que habilita la recepción de datos de 8 bits.
MÓDULO PUERTO SERIE SÍNCRONO MAESTRO (MSSP)
El MSSP (Puerto serie síncrono maestro -
Master Synchronous Serial Port) es un módulo muy útil, y a la vez uno de los circuitos más complejos dentro del microcontrolador. Este módulo permite la comunicación de alta velocidad entre un microcontrolador y otros periféricos u otros microcontroladores al utilizar varias líneas de E/S (como máximo dos o tres líneas). Por eso, se utiliza con frecuencia para conectar el microcontrolador a los visualizadores LCD, los convertidores A/D, las memorias EEPROM seriales, los registros de desplazamiento etc. La característica principal de este tipo de comunicación es que es síncrona y adecuada para ser utilizada en sistemas con un sólo maestro y uno o más esclavos. Un dispositivo maestro contiene un circuito para generación de baudios y además, suministra señales de reloj a todos los dispositivos del sistema. Los dispositivos esclavos no disponen de un circuito interno para generación de señales de reloj. El módulo MSSP puede funcionar en uno de dos modos:
- modo SPI (Interfaz periférica serial - Serial Peripheral Interface); y
- modo I2C (Circuito inter-integrado - Inter-Integrated Circuit).
Como se muestra en la siguiente figura, un módulo MSSP representa sólo una mitad de un hardware necesario para establecer una comunicación serial, mientras que la otra mitad se almacena en el dispositivo con el que intercambia los datos. Aunque los módulos en ambas puntas de línea son los mismos, sus modos de funcionamiento difieren esencialmente dependiendo de si el módulo funciona como
Maestro o como
Esclavo:
Si el microcontrolador a ser programado controla otro dispositivo o circuito (periféricos), deberá funcionar como un dispositivo
maestro. Este módulo generará señal de reloj cuando sea necesario, o sea sólo cuando se requiera recibir y transmitir los datos por software. Por consiguiente, el establecimiento de conexión depende únicamente del dispositivo maestro.
De lo contrario, si el microcontrolador a ser programado está integrado en un dispositivo más complejo (por ejemplo en una PC), deberá funcionar como un dispositivo esclavo. Como tal, un esclavo siempre tiene que esperar a que un dispositivo maestro envíe la solicitud de transmisión de datos.
MODO SPI
El modo SPI permite la transmisión y recepción simultánea de datos de 8 bits al utilizar tres líneas de entrada/salida
- SDO - Serial Data Out (salida de datos serie )- línea de transmisión;
- SDI - Serial Data In (entrada de datos serie) - línea de recepción; y
- SCK - Serial Clock (reloj de comunicación) - línea de sincronización.
Adicionalmente, hay una cuarta línea (SS) que se puede utilizar si el microcontrolador intercambia los datos con varios dispositivos periféricos. Refiérase a la siguiente figura.
SS -
Slave Select (Selección de esclavo) - Es una línea adicional utilizada para la selección de un dispositivo específico. Esta línea está activa sólo si el microcontrolador funciona como esclavo, o sea cuando el dispositivo externo - maestro requiere intercambiar los datos. Al funcionar en modo SPI, el módulo MSSP utiliza 4 registros en total:
- SSPSTAT - registro de estado
- SSPCON - registro de control
- SSPBUF - búfer serie de transmisión/recepción
- SSPSR - registro de desplazamiento (no es accesible directamente)
Los primeros tres registros son de lectura/escritura y se pueden modificar en cualquier momento, mientras que el cuarto, como no es accesible, se utiliza para convertir datos en formato serial.
Como se muestra en la siguiente figura, la parte central del módulo SPI consiste de dos registros conectados a los pines para recepción, transmisión y sincronización.
El registro de desplazamiento (SSPRS) está directamente conectado a los pines del microcontrolador y es utilizado para transmisión de datos en formato serie. El registro SSPRS dispone de la entrada y salida para desplazar los datos hacia dentro y hacia fuera del dispositivo. En otras palabras, cada bit que aparece en la entrada (línea de recepción) desplaza simultáneamente otro bit hacia la salida (línea de transmisión).
El registro SSPBUF (
Búfer) es una parte de memoria utilizada para almacenar temporalmente los datos antes de que se envíen, o sea inmediatamente después de que se reciban. Después de que todos los 8 bits hayan sido recibidos, el byte se mueve del registro SSPRS al registro SSPBUF. Este proceso de crear un doble búfer para recibir los datos permite iniciar la recepción del próximo byte antes de leer los datos que se acaban de recibir. Durante la transmisión/recepción de datos se ignora un intento de escribir un dato en el registro SSBUF. Desde el punto de vista de un programador, este registro se considera el más importante por haber sido accedido con más frecuencia. Concretamente, si dejamos aparte el ajuste del modo de funcionamiento, la transmisión de datos por el módulo SPI no es nada más que escritura y lectura de datos de este registro, mientras que las demás “acrobacias” como mover los registros, se llevan a cabo automáticamente por el hardware.
Vamos a hacerlo en mikroC...
/* En este ejemplo, el microcontrolador PIC (maestro) envía un byte de datos a un chip
periférico (esclavo) por el módulo SPI. El programa utiliza las funciones de librería
SPI SPI1_init() y SPI1_Write. */
sbit Chip_Select at RC0_bit; // Pin RC0 es un pin de seleccionar el chip
// periférico Selección_de_chip
sbit Chip_Select_Direction at TRISC0_bit; // Bit TRISC0 define el pin RC0 como entrada o salida
unsigned int value; // Dato a ser enviado es de tipo unsigned int
void main() {
ANSEL = ANSELH = 0; // Todos los pines de E/S son digitales
TRISB0_bit = TRISB1_bit = 1; // Configurar los pines RB0, RB1 como entradas
Chip_Select = 0; // Seleccionar el chip periférico
Chip_Select_Direction = 0; // Configurar el pin CS# como salida
SPI1_Init(); // Inicializar el módulo SPI
SPI1_Write(value); // Envíar el valor al chip periférico
...
Comunicación serial síncrona SPI
Antes de inicializar el módulo SPI, es necesario especificar varias opciones:
- Modo maestro TRISC.3=0 (pin SCK es salida de señal de reloj);
- Modo de esclavo TRISC.3=1 (pin SCK es entrada de señal de reloj);
- Fase de datos de entrada - la mitad o el final del tiempo de salida (bit SMP del registro SSPSTAT );
- Flanco de reloj (bit CKE del registro SSPSTAT);
- Velocidad de transmisión en baudios, los bits SSPM3-SSPM0 del registro SSPCON (sólo en modo Maestro);
- Selección de modo esclavo, bits SSPM3-SSPM0 del registro SSPCON (sólo en modo Esclavo)
El módulo se pone en marcha al poner a uno el bit SSPEN:
Paso 1.
Los datos a ser transmitidos deberán ser escritos en el registro del búfer SSPBUF. Si el módulo SPI funciona en modo maestro, el microcontrolador ejecutará automáticamente la secuencia de los siguientes pasos 2,3 y 4. Si el módulo SPI funciona en modo esclavo, el microcontrolador no ejecutará la secuencia de los siguientes pasos hasta que el pin SCK detecte señal de reloj.
Paso 2.
El dato se mueve al registro SSPSR y el contenido del registro SSPBUF no se borra.
Paso 3.
El dato se desplaza hacia el pin de salida (primero se desplaza el bit más significativo - MSB), mientras que a la vez el registro se carga con los bits por el pin de entrada. En modo maestro el microcontrolador en si mismo genera señal de reloj, mientras que el modo esclavo utiliza señal de reloj externa (pin SCK).
Paso 4.
El registro SSPSR está lleno después de que hayan sido recibidos 8 bits de datos, lo que se indica al poner a uno el bit BF del registro SSPSTAT y el bit SSPIF del registro PIR1. Los datos recibidos (un byte) son automáticamente movidos del registro SSPSR al registro SSPBUF. Como la transmisión de datos serial se realiza automáticamente, el resto de programa se ejecuta normalmente mientras que la transmisión de datos está en progreso. En este caso, la función del bit SSPIF es de generar una interrupción al acabar la transmisión de un byte.
Paso 5.
Por último, el dato almacenado en el registro SSPBUF está listo para su uso y debe moverse al registro deseado.
Modo I2C
El modo I
2C (Bus de circuito inter-integrado) es adecuado para ser utilizado cuando el microcontrolador debe intercambiar los datos con un circuito integrado dentro de un mismo dispositivo. Éstos son con frecuencia otros microcontroladores, o los circuitos integrados especializados y baratos que pertenecen a la nueva generación de así llamados "periféricos inteligentes" (memorias, sensores de temperatura, relojes de tiempo real etc.)
Similar a la comunicación serie en modo SPI, la transmisión de datos en modo I2C es síncrona y bidireccional. Esta vez sólo dos pines se utilizan para transmisión de datos. Éstos son los pines de SDA (Datos seriales) y SCL (Reloj serial). El usuario debe configurar estos pines como entradas o salidas por los bits TRISC.
Al observar las reglas particulares (protocolos), este modo habilita conectar simultáneamente de una manera simple hasta 112 diferentes componentes al utilizar sólo dos valiosos pines de E/S. Vamos a ver cómo funciona el sistema:
El reloj, necesario para sincronizar el funcionamiento de ambos dispositivos, siempre es generado por un dispositivo maestro (un microcontrolador) y su frecuencia directamente afecta a la velocidad de transmisión de datos. Aunque hay un protocolo que permite como máximo una frecuencia de reloj de 3,4 MHz (así llamado bus I2C de alta velocidad), este libro cubre sólo el protocolo utilizado con más frecuencia, con una frecuencia de reloj limitada a 100 KHz. La frecuencia mínima no está limitada.
Cuando los componentes maestro y esclavo están sincronizados por el reloj, el maestro siempre inicia cada intercambio de datos. Una vez que el módulo MSSP se ha habilitado, espera que ocurra una condición de arranque (Start condition). El dispositivo maestro primero envía el bit de arranque (está a cero) por el pin SDA, luego la dirección de 7 bits del dispositivo esclavo seleccionado, y por último, el bit que requiere al dispositivo escribir (0) o leer (1) el dato enviado. En otras palabras, los ocho bits se desplazan al registro SSPSR después de ocurrir una condición de arranque. Todos los dispositivos esclavos que comparten la misma línea de transmisión recibirán simultáneamente el primer byte, pero sólo el que contiene la dirección coincidente recibirá el dato entero.
Una vez que el primer byte se ha enviado (sólo se transmiten datos de 8 bits), el maestro se pone en modo de recepción y espera el reconocimiento del dispositivo receptor acerca de la dirección coincidente.
Si el dispositivo esclavo envía un bit de reconocimiento (1) la transmisión de datos continuará hasta que el dispositivo maestro (microcontrolador) envíe el bit de parada (Stop).
Esto es una explicación simple de cómo se comunican dos componentes. Este microcontrolador es capaz de controlar las situaciones más complicadas cuando están conectados 1024 diferentes componentes (dirección de 10 bits), compartidos por varios dispositivos maestros diferentes. Por supuesto, estos dispositivos se utilizan pocas veces en la práctica por lo que no es necesario hablar de ellos detalladamente.
La siguiente figura muestra el diagrama de bloques del módulo MDSSP en modo I
2C.
En una operación I
2C con el módulo MSSP intervienen seis registros. Algunos de ellos se muestran en la Figura anterior.
- SSPCON
- SSPCON2
- SSPSTAT
- SSPBUF
- SSPSR
- SSPADD
Registro SSPSTAT
SMP Sample bit (Bit de muestra)
Modo maestro SPI - Este bit determina fase de datos de entrada.
- 1 - Estado lógico se lee al final del tiempo de salida.
- 0 - Estado lógico se lee en la mitad del tiempo de salida.
Modo esclavo SPI - Este bit debe ser borrado cuando SPI se emplea en modo esclavo.
Modo I²C (
maestro o
esclavo)
- 1 - Deshabilita control de variaciones para velocidad estándar (100kHz).
- 0 - Habilita control de variaciones para velocidad alta (400k Hz).
CKE - Clock Edge Select bit (bit de selección del flanco de reloj) selecciona el modo de sincronización.
CKP = 0:
- 1 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
- 0 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
CKP = 1:
- 1 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
- 0 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
D/A - Data/Address bit (bit de direcciones/datos) se utiliza sólo en modo I
2C.
- 1 - Indica que el último byte recibido o transmitido es un dato.
- 0 - Indica que el último byte recibido o transmitido es una dirección.
P - Stop bit (bit de parada) se utiliza sólo en modo I²C.
- 1 - Bit de parada (STOP) se ha detectado.
- 0 - Bit de parada (STOP) no se ha detectado.
S - Start bit (bit de arranque) se utiliza sólo en modo I2C.
- 1 - Bit de arranque (START) se ha detectado.
- 0 - Bit de arranque (START) no se ha detectado.
R/W - Read Write bit (bit de información Lectura/Escritura) se utiliza sólo en modo I
2C. Este bit contiene la información del bit de L/E después de la última dirección coin cidente. Este bit es válido sólo desde la dirección coincidente hasta el siguiente bit de arranque, bit de parada o bit no ACK.
Modo I²C en modo esclavo
- 1 - Lectura de dato.
- 0 - Escritura de dato.
Modo I²C en modo esclavo
- 1 - Transmisión en progreso.
- 0 - Transmisión no está en progreso.
UA - Update Address bit (bit de activación de dirección) se utiliza sólo en modo I
2C de 10 bits.
- 1 - Indica que es necesario actualizar la dirección en el registro SSPADD.
- 0 - Indica que la dirección es correcta y que no se necesita actualizarla.
BF Buffer Full Status bit (bit de estado de búfer lleno)
Durante la recepción de dato (en modos SPI e I²C)
- 1 - Recepción completa. El registro SSPBUF está lleno.
- 0 - Recepción no completa. El registro SSPBUF está vacío.
Durante la transmisión de dato (sólo en modo I²C)
- 1 - Transmisión de dato en progreso (no incluye el bit ACK y bits de parada).
- 0 - Transmisión de dato completa (no incluye el bit ACK y bits de parada).
Registro SSPSTAT
WCOL Write Collision Detect bit (bit detector de colisión)
- 1 - Colisión detectada. En el registro SSPBUF se ha escrito cuando no se han cumplido las condiciones para iniciar una transmisión.
- 0 - No hay colisión.
SSPOV Receive Overflow Indicator bit (bit detector de desbordamiento en recepción)
- 1 - Se recibe un nuevo byte cuando el registro SSPBUF aún mantiene los datos ante riores. Como no hay espacio para recibir datos nuevos, uno de estos dos bytes debe ser borrado. En este caso, los datos almacenados en el registro SSPSR se pierden irremediablemente.
- 0 - Dato serial es recibido correctamente.
SSPEN - Synchronous Serial Port Enable bit (bit de habilitación del módulo SSP - puerto serie síncrono) determina la función de los pines del microcontrolador e inicializa el módulo MSSP:
En modo SPI
- 1 - Habilita el módulo MSSP y configura los pines SCK, SDO, SDI y SS como una fuente de pines del puerto serie.
- 0 - Deshabilita el módulo MSSP y configura estos pines como pines del puerto de E/S.
En modo I²C
- 1 - Habilita el módulo MSSP y configura los pines SDA y SCL como una fuente de pines del puerto serie.
- 0 - Deshabilita el módulo MSSP y configura estos pines como pines del puerto de E/S.
CKP - Clock Polarity Select bit (bit de selección de polaridad de reloj) no se utiliza en modo I²C maestro.
En modo SPI
- 1 - Para una señal de reloj, el estado inactivo es un nivel alto.
- 0 - Para una señal de reloj, el estado inactivo es un nivel bajo.
En modo I²C esclavo
- 1 - Señal de reloj habilitada.
- 0 - Mantiene la salida de señal de reloj en estado bajo. Se utiliza para proporcionar más tiempo para estabilización de datos.
SSPM3-SSPM0 - Synchronous Serial Port Mode Select bits. (bit de selección del modo del SSP (puerto serie síncrono). El modo SSP se determina al combinar los siguientes bits:
SSPM3 |
SSPM2 |
SSPM1 |
SSPM0 |
MODO |
0 |
0 |
0 |
0 |
Modo maestro del SPI, reloj = Fosc/4. |
0 |
0 |
0 |
1 |
Modo maestro del SPI, reloj = Fosc/16. |
0 |
0 |
1 |
0 |
Modo maestro del SPI, reloj = Fosc/64. |
0 |
0 |
1 |
1 |
Modo maestro del SPI, reloj = (TMR output)/2. |
0 |
1 |
0 |
0 |
Modo esclavo del SPI, habilitado el pin de control SS. |
0 |
1 |
0 |
1 |
Modo esclavo del SPI, deshabilitado el pin de control SS, SS se puede utilizar como pin de E/S. |
0 |
1 |
1 |
0 |
Modo esclavo I2C, dirección de 7 bits utilizada. |
0 |
1 |
1 |
1 |
Modo esclavo I2C, dirección de 10 bits utilizada. |
1 |
0 |
0 |
0 |
Modo maestro I2C, reloj = Fosc / [4(SSPAD+1)]. |
1 |
0 |
0 |
1 |
Máscara utilizada en modo esclavo I2C. |
1 |
0 |
1 |
0 |
No utilizado. |
1 |
0 |
1 |
1 |
Modo maestro I2C controlado. |
1 |
1 |
0 |
0 |
No utilizado. |
1 |
1 |
0 |
1 |
No utilizado. |
1 |
1 |
1 |
0 |
Modo esclavo I2C, dirección de 7 bits utilizada, los bits de arranque (START) y de parada (STOP) habilitan interrupción. |
1 |
1 |
1 |
1 |
Modo esclavo I2C, dirección de 10 bits utilizada, los bits de arranque (START) y de parada (STOP) habilitan interrupción. |
Registro SSPCON2
GCEN - General Call Enable bit (bit de habilitación general)
Sólo en modo esclavo I²C
- 1 - Habilita interrupción cuando una dirección de llamada general es recibida en el SSPST (0000h).
- 0 - Deshabilita dirección de llamada general.
ACKSTAT - Acknowledge Status bit (bit de estado de reconocimiento)
Sólo en modo de transmisión maestro I²C
- 1 - Reconocimiento del esclavo no recibido.
- 0 - Reconocimiento del esclavo recibido.
ACKDT - Acknowledge data bit (bit de recepción)
Sólo en modo de recepción maestro I²C
- 1 - No reconocimiento.
- 0 - Reconocimiento.
ACKEN - Acknowledge Sequence Enable bit (bit de habilitación de secuencia de reconocimiento)
En modo de recepción maestro I²C
- 1 - Indica una secuencia de reconocimiento en los pines SDA y SCL y transmite el bit ACKDT. Automáticamente borrado por hardware.
- 0 - Secuencia de reconocimiento en reposo.
RCEN - Receive Enable bit (bit de habilitación de recepción)
Sólo en modo maestro I²C
- 1 - Habilita recepción en modo I2C.
- 0 - Recepción deshabilitada.
PEN - STOP condition Enable bit (bit de habilitación de condición de Parada)
Sólo en modo maestro I²C
- 1 - Indica una condición de Parada en los pines SDA y SCL. Luego, este bit es automáticamente borrado por hardware.
- 0 - Condición de Parada en reposo.
RSEN - Repeated START Condition Enabled bit (bit de habilitación de repetir condición de Arranque)
Sólo en modo maestro I²C
- 1 - Indica repetición de condición de Arranque en los pines SDA y SCL. Luego, este bit es automáticamente borrado por hardware.
- 0 - Condición de repetición de Arranque en reposo.
SEN - START Condition Enabled/Stretch Enabled bit (bit de habilitación de condición de Arranque)
Sólo en modo maestro I²C
- 1 - Indica condición de Arranque en los pines SDA y SCL. Luego, este bit es automáticamente borrado por hardware.
- 0 - Condición de Arranque en reposo.
I²C en Modo Maestro
El caso más común es que un microcontrolador funciona como maestro y un periférico como esclavo. Es la razón por la que este libro sólo trata este modo. Se da por entendido que la dirección consiste en 7 bits y el dispositivo contiene un solo microcontrolador (dispositivo con maestro único).
Para habilitar el módulo MSSP en este modo, siga las siguientes instrucciones:
Ajuste la velocidad de transmisión (registro SSPADD), desactive el control de velocidad de rotación (al poner a uno el bit SMP del registro SSPSTAT) y seleccione el modo maestro (registro SSPCON). Después de finalizar todos los ajustes y habilitar el módulo (registro SSPCON: bit SSPEN), es necesario esperar a que los circuitos de control internos indiquen con una señal que todo esté preparado para transmisión de datos: o sea, que el bit SSPIF del registro PIR1 se haya puesto a uno.
Después de poner este bit a cero por software, el microcontrolador está listo para intercambiar los datos con los periféricos.
Transmisión de datos en Modo Maestro I²C
La transmisión de datos en el pin SDA se inicia con un cero lógico (0) que aparece al poner a uno el bit SPEN del registro SSPCON2. Sin embargo, aunque está habilitado, el microcontrolador tiene que esperar cierto tiempo antes de iniciar la comunicación. Se le denomina 'Condición de Inicio' durante la que se realizan las preparaciones y verificaciones internas. Si se cumplen con todas la condiciones, el bit SSPIF del registro PIR1 se pone a uno y la transmisión de datos se inicia en cuanto se cargue el registro SSPBUF.
Como máximo 112 circuitos integrados (dispositivos esclavos) pueden compartir simultáneamente la misma línea de transmisión. El primer byte de datos enviado por el dispositivo maestro contiene la dirección que coincide con una sola dirección del dispositivo esclavo. Todas las direcciones se enumeran en las hojas de datos respectivas. El octavo bit del primer byte de datos especifica la dirección de transmisión de datos, o sea si el microcontrolador va a enviar o recibir los datos. En este caso, como se trata de transmisión de datos, el octavo bit se pone a cero (0).
Cuando ocurre la coincidencia de direcciones, el microcontrolador tiene que esperar a que el dispositivo esclavo envíe el bit de reconocimiento, o sea que se ponga a cero el bit ASKSTAT del registro SSPCON2. Una vez que la coincidencia de direcciones ha ocurrido apropiadamente, todos los bytes de datos se transmiten de la misma manera.
La transmisión de datos termina al poner a uno el bit SEN del registro SSPCON2. Ocurre la condición de parada (STOP), lo que habilita que el pin SDA reciba una secuencia de pulsos:
Inicio - Dirección - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento - Parada!
Recepción de datos en Modo Maestro I²C
Las preparaciones para recibir los datos son similares a las de transmitir los datos, con excepción de que el último bit del primer byte enviado (el que contiene la dirección) se ponga a uno lógico (1). Eso especifica que el dispositivo maestro espera recibir los datos del dispositivo esclavo direccionado. Con respecto al microcontrolador, ocurre lo siguiente:
Después de hacer las pruebas internas y poner a uno el bit de arranque (START), el dispositivo esclavo envía byte por byte. Estos bytes se almacenan en el registro serial SSPSR. Después de recibir el último - octavo bit, cada dato se carga en el registro SSPBUF del que se puede leer. Al leer este registro, se envía automáticamente el bit de reconocimiento, lo que significa que el dispositivo maestro está listo para recibir los nuevos datos.
Al igual que en el caso de la transmisión, la recepción de datos termina al poner a uno el bit de parada (STOP):
Inicio - Dirección - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento - ¡Parada!
En esta secuencia de pulsos, el bit de reconocimiento se envía al dispositivo
esclavo.
Generador de baudios
Para sincronizar la transmisión de datos, todos los eventos que ocurren en el pin SDA deben estar sincronizados con la señal de reloj generada en el dispositivo maestro. Esta señal de reloj se genera por un simple oscilador cuya frecuencia depende de la frecuencia del oscilador principal del microcontrolador, del valor que se introduce al registro SSPADD y así como del modo SPI actual. La frecuencia de señal de reloj del modo descrito en este libro depende del cristal de cuarzo seleccionado y del registro SPADD. La fórmula utilizada para hacer el cálculo de frecuencia de reloj es:
Vamos a hacerlo en mikroC...
/* En este ejemplo, el microcontrolador PIC está conectado a la memoria EEPROM 24C02
por los pines SCL y SDA. El programa envía un byte de dato a la dirección 2 de la EEPROM.
Entonces, el programa lee este dato por el modo I2C de la EEPROM y lo envía al
puerto PORTB para comprobar si el dato se ha escrito con éxito. El byte para direccionar
la EEPROM está compuesto por 7 bits de la dirección (1010001) y el bit que determina
lectura o escritura del dato (LSB - bit menos significativo).*/
void main(){
ANSEL = ANSELH = PORTB = TRISB = 0; // Todos los pines son digitales. Los pines del
// puerto PORTB son salidas.
I2C1_Init(100000); // Inicializar I2C con reloj deseado
// Incio del bloque de sentencias para escribir un byte en la memoria EEPROM.
I2C1_Start(); // Señal de inicio de I2C
I2C1_Wr(0xA2); // Enviar byte por I2C (dirección de dispositivo + W)
I2C1_Wr(2); // Enviar byte (dirección de la localidad EEPROM)
I2C1_Wr(0xF0); // Enviar los datos a escribir
I2C1_Stop(); // Señal de parada de I2C
Delay_100ms();
// En el siguiente bloque de sentencias se determina la dirección 2 de la que se leerá el dato
I2C1_Start(); // Señal de inicio de I2C
I2C1_Wr(0xA2); // Enviar byte por I2C (dirección de dispositivo + W)
I2C1_Wr(2); // Enviar byte (dirección de dato)
// La dirección está determinada y el dato está listo para ser leído
I2C1_Repeated_Start(); // Se vuelve a generar el inicio de señal I2C
I2C1_Wr(0xA3); // Enviar byte (dirección de dispositivo + R)
PORTB = I2C1_Rd(0u); // Leer el dato (reconocimiento NO)
I2C1_Stop(); // Señal de parada de I2C
}
NOTAS ÚTILES ...
Cuando el microcontrolador se comunica con un periférico, puede ocurrir un fallo en la transmisión de datos por alguna razón. En este caso, es recomendable comprobar el estado de algunos bits que pueden aclarar el problema. En la práctica, el estado de estos bits se comprueba al ejecutar una pequeña subrutina después de transmisión y recepción de cada byte (por si acaso).
WCOL (SPCON,7) - Si intenta escribir un dato nuevo al registro SSPBUF mientras que otra transmisión/recepción de datos está en progreso, el bit WCOL se pone a uno y el contenido del registro SSBUF se queda sin cambios. No hay escritura. Luego, el bit WCOL debe ser borrado por el software.
BF (SSPSTAT,0) - Al transmitir los datos, este bit se pone a uno durante la escritura en el registro SSPBUF y se queda puesto a uno hasta que el byte en formato serial se desplace del registro SSPRS. En modo de recepción, este bit se pone a uno al cargar un dato o una dirección al registro SSPBUF. Se pone a cero después de leer el registro SSPBUF.
Pines SDA y SCL - Cuando el módulo SSP está habilitado, estos pines se vuelven a las salidas de Drenaje Abierto. Esto significa que deben estar conectados a resistencias conectados a la otra punta al polo positivo de la fuente de alimentación.
SSPOV (SSPCON,6) - En modo de recepción, este bit se pone a uno al recibir un nuevo byte en el registro SSPSR por medio de la comunicación serial, todavía sin haber leído el dato anteriormente recibido del registro SSPBUF.
Para establecer la comunicación serial en modo I2C, se debe realizar lo siguiente:
Ajustar el módulo y enviar la dirección:
- Introducir en el registro SSPADD el valor para definir la velocidad de transmisión en baudios.
- Poner a uno el bit SMP del registro SSPSTAT para desactivar el control de la velocidad de rotación.
- Introducir el valor binario 1000 a los bits SSPM3-SSPM0 del registro SSPCON1 para seleccionar el modo Maestro.
- Poner a uno el bit SEN del registro SSPCON2 (secuencia de Inicio - START).
- El bit SSPIF se pone a uno automáticamente en final de la secuencia de Inicio cuando el módulo está listo para funcionar. Se deberá poner a cero.
- Introducir la dirección de esclavo al registro SSPBUF.
- Cuando se envía un byte, el bit SSPIF (interrupción) se pone a uno automáticamente después de haber recibido el bit de reconocimiento del dispositivo esclavo.
Transmitir los datos:
- Introducir en el registro SSPBUF los datos a enviar.
- Cuando se envía un byte, el bit SSPIF (interrupción) se pone a uno automáticamente después de haber recibido el bit de reconocimiento del dispositivo esclavo.
- La condición de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro SSPCON para informar al dispositivo Esclavo que la transmisión de datos se acabó.
Recibir los datos:
- Poner a uno el bit RSEN del registro SSPCON2 para habilitar la recepción.
- El bit SSPIF indica con su estado lógico la recepción de datos. Después de leer los datos del registro SSPBUF, el bit ACKEN del registro SSPCON2 debe ponerse a uno para habilitar el envío del bit de reconocimiento.
- La condición de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro SSPCON para informar al dispositivo Esclavo que la transmisión se acabó.
Aparte de disponer de un gran número de líneas digitales de E/S utilizadas para la comunicación con los periféricos, el PIC16F887 contiene 14 entradas analógicas. Debido a éstas, el microcontrolador no sólo puede reconocer si un pin es llevado a bajo o alto (0 o +5V), sino que puede medir con precisión el voltaje y convertirlo en un valor numérico, o sea, en formato digital.