I2C PIC comunicación serial


Compartir: Share on Facebook9Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

I2C PIC es uno de los modos de trabajo del módudo SSP puerto serial síncrono del microcontrolador PIC, en la comunicación I2C se utilizan 2 hilos a lo que se conoce como bus I2C, a estos hilos se conectan los dispositivos que se puedan comunicar mediante el protocolo I2C, por uno de los hilos se enviará una señal de reloj para la sincronización y por el otro hilo se enviarán o recibirán datos, se pueden conectar varios dispositivos de los que uno de ellos será el maestro, es el que generará la señal de reloj además de decidir cuando se inicia o finaliza la comunicación y si la comunicación será de recepción o transmisión de datos, los demás dispositivos conectados al bus I2C se conocen como esclavos.

Cada uno de los dispositivos tiene una dirección, cuando el maestro necesita comunicarse con alguno de los esclavos lo hará enviando la dirección del esclavo a través del bus I2C, cuando el esclavo reciba su dirección podrá comunicarse con el maestro, el maestro ademas tiene que enviar un bit mediante el cual le indica al esclavo si quiere enviarle un dato o quiere recibir un dato del esclavo.

I2C PIC pines PIC16F877AEl microcontrolador PIC cuenta con el módulo SSP el que se utilizará en su modo de trabajo para la comunicación serial I2C PIC, el microcontrolador PIC puede  ser utilizado como maestro o como esclavo en la comunicación serial I2C PIC.

Los pines que se utilizan en el modo I2C PIC son los nombrados como SDA serial data y SCL serial clock, el pin SDA es para enviar o recibir los datos, y el pin SCL es para la señal de reloj, estos pines deben ser declarados como entradas digitales, ademas se les debe conectar mediante unas resistencias que pueden ser de 4,7K a la tensión de alimentación del microcontrolador PIC; los pines de los demás dispositivos conectados al bus I2C también están nombrados como SDA y SCL, cuando no se estén comunicando estos pines estarán normalmente en alto o a 1.

En la imagen se tiene la distribución de pines del PIC16F877A, se han resaltado las ubicaciones de los pines SCL y SDA.

La velocidad de comunicación puede ser de hasta 100Kbps en el modo estandar o normal, aunque puede llegar en el modo rápido hasta los 400Kbps y en la alta hasta mas de 3Mbps, esto dependerá de los dispositivos utilizados, para ello es recomendable revisar sus hojas de datos.

La comunicación I2C se realiza de la siguiente manera

  • La señal del pin SDA del maestro pasa de un alto a un bajo mientras la señal su pin SCL esté a un alto, esto es el inicio de la comunicación I2C, al iniciar la comunicación se genera una señal de reloj por el pin SCL del maestro y se empieza a enviar los datos por el pin SDA en grupos de 8 bits o un byte, que es lo mismo.
  • El maestro enviará primero la dirección de identificación del esclavo con el que se quiera comunicar junto con el bit de escritura lectura, si el maestro quiere enviar o escribir un dato este bit será 0, si el maestro quiere leer o recibir un dato este bit será 1, la dirección del esclavo normalmente sera de 7 bits aunque también hay direcciones de 10bits.
  • Cada vez que el esclavo reciba un byte el esclavo responderá enviando un bit en bajo o 0 al maestro para indicar que se ha establecido la comunicación, este es un bit de confirmación de hay comunicación y se le llama ACK, si la comunicación no se establece el valor del bit ACK será un 1.
  • Luego el maestro enviará el dato si lo que se quiere es enviar o escribir un dato en el el registro del esclavo, el esclavo responderá enviando al maestro el bit de confirmación ACK; pero si lo que se quiere es que el maestro recibirá o  lea algún dato desde algún registro del esclavo, ocurrirá que si la recepción es correcta es maestro enviará al esclavo el bit de confirmación ACK.
  • Luego el maestro enviará el dato si lo que se quiere es enviar o escribir un dato en el el registro del esclavo, el esclavo responderá enviando al maestro el bit de confirmación ACK; o de lo contrario se recibirá algún dato si se quiere leer o recibir un dato del registro del esclavo, si la recepción es correcta es maestro enviará al esclavo el bit de confirmación ACK.
  • Por último y para finalizar la comunicación la señal del pin SDA pasará de un bajo a un alto mientras la señal de reloj en el pin SCL este en un alto, en ese momento se deja de generar la señal de reloj y la comunicación habrá terminado.

Las conexiones tienen que hacerse de tal manera que los nombres de los pines coincidan, en la siguiente imagen se muestra como será la conexión para la comunicación I2C PIC, al ser utilizado el PIC como maestro, con otros dispositivos capaces de comunicarse con el protocolo I2C.

I2C PIC conexiones sda scl

La intensión de esta sección es ver como utilizar el modo de trabajo I2C PIC del módulo SSP para hacerlo trabajar con otros dispositivos, para mas información sobre la comunicación I2C se puede visitar este enlace, este otro y muchos mas.

I2C PIC PROGRAMACIÓN

Para programar la comunicación serial I2C PIC se recomienda mucho leer la hoja de datos del PIC utilizado, es lo mejor que se puede hacer, como referencia se verá para el PIC16F877A, para lo que se utilizan los siguientes registros: el registro SSPSTAT, el registro SSPCON, el registro SSPCON2, el registro SSPBUF, el registro SSPSR, el registro SSPADD y si se utilizan interrupciones I2C PIC los registros PIE1 y PIR1.

El registro SSPSTAT es el registro para los estados del módulo la comunicación serial síncrona SSP, en este caso en el modo I2C PIC.

I2C PIC SSPSTAT

El bit7 SMP este bit es para indicar si la la velocidad de la comunicación I2C PIC será la estandar o en alta velocidad, si se pone a 1 la velocidad será la standar, si se pone a 0 la velocidad será alta.

El bit6 CKE al poner este bit a 1 se utilizará en la comunicación I2C el bus del tipo SMBUS, al poner este bit a 0 se utilizará en la comunicación I2C el bus del tipo I2C.

El bit5 D/A este bit no tiene efecto en el maestro, para el esclavo si se pone a 1 indica que el último byte transmitido o recibido era un dato, si se pone a 0 indica que el último byte transmitido o recibido era una dirección.

El bit4 P este bit de estado si se pone a 1 indica que se ha detectado condición de parada en la comunicación, si está a 0 indica que no hay condición de parada en la comunicación.

El bit3 S este bit de estado si se pone a 1 indica que se ha detectado condición de inicio en la comunicación, si está a 0 indica que no hay condición de inicio en la comunicación.

El bit2 R/W en este bit se carga el bit que se envía junto con la dirección del esclavo para hacer una lectura de datos del esclavo o una escritura de datos en el esclavo, cuando es 1 indica que se hará una lectura de datos y cuando es 0 indica que se hará una escritura de datos.

El bit1 UA Este bit es para cuando la dirección del esclavo es de 10 bits, si se pone a 1 indica que se necesita actualizar la dirección, si está a 0 no se la necesita actualizar.

El bit0 BF Este bit indica el estado del registro SSPBUF, que es el registro donde se pone el dato que se quiere transmitir o recibir en la comunicación I2C PIC, cuando se transmite si este bit está a 1 indica que la transmisión está en proceso o el registro SSPBUF está lleno, si está a 0 indica que se ha completado la transmisión y que el registro SSPBUF está vacío, cuando se recibe si este bit está a 1 indica que la recepción es completa o que el registro SSPBUF está lleno, si está a 0 indica que la recepción no se ha completado o que el registro SSBUF está vacío.

El registro SSPCON este es un registro de control para el módulo la comunicación serial síncrona MSSP, en este caso en el modo I2C.

I2C PIC SSPCON1

El bit7 WCOL para el maestro cuando este bit es 1 indica que se ha cargado un dato en el registro SSPBUF sin que se cumplan las condiciones válidas del I2C, si está a 0 todo esta bien; para el esclavo si este bit está a 1 indica que se ha cargado un nuevo valor en este registro sin que se haya terminado de transmitir el dato cargado previamente, si esta ha 0 todo esta bien.

El bit6 SSPOV este bit indica si han ocurrido sobreescrituras en el registro SSPBUF, si se pone a 1 indica que ha ocurrido una sobreescritura sin haberse leído el dato anterior, si está a 0 es porque se ha leído correctamente el dato anterior.

El bit5 SSPEN este es el bit de habilitación del puerto serie asíncrono, es el bit que permite el uso del I2C PIC, si se pone a 1 se habilita el uso del I2C PIC, si se pone a 0 se deshabilita el uso del I2C PIC.

El bit4 CKP Este bit es para el control de la señal de reloj cuando el esclavo está enviando un dato al maestro, mientras cargue el dato a enviar en el registro SSPBUF este bit será puesto a 0 por el esclavo, cuando el dato enviar esté cargado en el registro SSPBUF el esclavo pondrá este bit a 1.

Los bits 3, 2, 1 y 0 mediante las combinaciones de estos bits se elige la forma de trabajo del módulo SSP, para el modo I2C se pueden hacer las siguiente combinaciones:

I2C PIC SSPCON1 modo de trabajo

Al elegir el modo maestro con la combinación 1000 se tendrá que utilizar la fórmula que se ve para la velocidad de la comunicación, dependiendo de esta velocidad se obtendrá un valor para cargar en el registro SSPADD.

El registro SSPCON2 este es otro registro de control para el módulo la comunicación serial síncrona MSSP, en este caso en el modo I2C.

I2C PIC SSPCON2

El bit7 GCEN este bit interviene cuando el PIC es utilizado como esclavo y tiene su propia dirección de respuesta al maestro, al poner este bit a 1 el PIC responde cuando el maestro envíe la dirección 0x0000 produciendo una interrupción, si es puesto a 0 el bit no responderá a la llamada general.

El bit6 ACKSTAT este bit indica si se ha establecido la comunicación con el esclavo, esto es si el esclavo le ha enviado el bit de reconocimiento ACK, si el bit ACKSTAT se pone a 0 es que hay comunicación y se ha recibido el bit ACK ,si se pone a 1 es que no hay comunicación y el maestro no ha recibido el ACK.

El bit5 ACKDT este es el bit de reconocimiento que le enviará el maestro al esclavo tras una recepción indicando que se ha recibido el dato, el bit de reconocimiento se pondrá a 0 si se quiere seguir recibiendo mas datos del esclavo, en caso que el maestro ya no quiera recibir mas datos se pondrá este bit a 1.

El bit4 ACKEN si es puesto a 1 se habilita el envío por parte del maestro del bit de reconocimiento ACK almacenado en el bit5 o ACKDT, si es puesto a 0 el envío del bit ACKDT no estará habilitado.

El bit3 RCEN si es puesto a 1 se habilita la recepción I2C PIC de datos por parte del maestro, si es puesto a 0 la recepción estará deshabilitada.

El bit2 PEN si es puesto a 1 detiene la comunicación I2C PIC, se pone a 0 automáticamente luego de detener la comunicación.

El bit1 RSEN si es puesto a 1 se reinicia la comunicación I2C PIC, luego se pondrá a 0 automáticamente.

El bit0 SEN si es puesto a 1 inicia la comunicación I2C PIC, luego se pondrá automáticamente a 0.

El registro SSPBUF en la comunicación I2C PIC en este registro se pondrá el dato que se quiera transmitir hacia el esclavo, y también donde se encontrará el dato recibido desde el esclavo, tiene esta doble función.

El registro SSPSR es un registro que trabaja junto con el  registro SSPBUF, no es accesible, cuando se carga un dato en el registro SSPBUF para ser enviado al esclavo, el I2C PIC antes de enviar el dato lo carga en el registro SSPSR, desde donde enviará el dato al esclavo; cuando se recibe un dato desde el esclavo, el dato se recibe en el registro SSPSR, luego el I2C PIC lo pasa al registro SSPBUF desde donde recién puede ser leido.

El registro SSPADD Cuando el microcontrolador es utilizado como esclavo, en este registro se guarda su dirección para ser reconocido por el maestro, cuando  el microcontrolador es utilizado como maestro, en este registro se cargará el valor con el que se elige la velocidad de transmisión de los datos, esto es los baudios o la cantidad de bits por segundo que se enviarán en la comunicación I2C PIC.

El valor a cargar en el registro SSPADD se calcula con la siguiente fórmula que dependerán de la velocidad elegida, y de la frecuencia del oscilador utilizado.

Velocidad=Fosc/(4*(SSPADD+1))

Esta formula se puede reacomodar para obtener la siguiente fórmula:

SSPADD=(Fosc/(4*Velocidad))-1

Si se quiere por ejemplo una velocidad d 100Kbps, y el oscilador es de 4Mhz, si en la fórmula anterior se reemplaza y se despeja se tendrá:

SSPADD=(4000000/(4*100000))-1

de donde:

SSPADD=9

Por lo que para obtener un una velocidad de 100Kbps se tendrá que cargar el registro SSPADD con 9.

I2C PIC PROGRAMACIÓN en el XC8

Para la programación de la comunicación serial I2C PIC, cuando el PIC sea el maestro se utilizará el XC8, ya que este permite trabajar directamente con los registros y esto es de gran ayuda para conocer mucho mas sobre el manejo de los microcontroladores PIC, en este caso se comentará como se puede proceder para utilizar el módulo SSP en modo I2C PIC del PIC16F877A, lo aquí comentado es muy similar para otros microcontroladores PIC.

Para iniciar el I2C PIC, siendo el PIC el maestro.

Los pines del PIC16F877A para el manejo de la comunicación I2C PIC son el pin RC3 para la señal de reloj por lo que en este caso se le llama pin SCL, y el pin RC4 para la transmisión y recepción de datos, en este caso se le llama pin SDA, los pines serial clock SCL y serial data SDA se tienen que configurar como entradas digitales, esto en el XC8 se puede hacer así:

TRISCbits.TRISC3=1;//pin SCL como una entrada digital

TRISCbits.TRISC4=1;//pin SDA como una entrada digital

Configuración del registro SSPSTAT para elegir el  tipo de velocidad de la comunicación y el tipo de bus a utilizar.

El bit7 se pondrá a 1 para que la comunicación I2C PIC sea a velocidad estándar de 100Kbps.

El bit6 se pondrá a 0 para que la comunicación sea con las especificaciones I2C.

El bit5 se pondrá a 0 ya que no afecta directamente al maestro.

El bit4 se pondrá a 0 porque se está inicializando el I2C PIC y por lo tanto no se ha detectado ningún bit de parada.

El bit3 se pondrá a 0 porque se está inicializando el I2C PIC y por lo tanto no se ha detectado ningún bit de incio.

El bit2 se pondrá a 0 porque se está inicializando el I2C PIC y por lo tanto no se ha realizado ninguna transmisión.

El bit1 se pondrá a 0 porque se está inicializando el I2C PIC y por lo tanto no se hay ninguna  dirección que necesite actualización.

El bit0 se pondrá a 0 porque se está inicializando el I2C PIC y por lo tanto el registro SSPBUF estará vacío.

Luego en la inicialización de de la comunicación serial I2C PIC el registro SSPSTAT en el XC8 quedará así:

SSPSTAT=0b10000000;// velocidad standar, bus I2C

Configuración del registro SSPCON para habilitar la comunicación serial I2C PIC y poner al microcontrolador PIC como maestro.

El bit7 se pondrá a 0 porque se está inicializando el I2C PIC y por lo tanto no hay colisión de datos.

El bit6 se pondrá a 0 porque se está inicializando el I2C PIC y por lo tanto no hay sobreescritura de datos.

El bit5 se pone a 1 para habilitar el uso del módulo SSP en modo I2C PIC.

El bit4 se pone a 0 este bit es utilizado por el pic cuando está en modo esclavo.

Los bits 3, 2, 1 y 0 la combinación utilizada para estos bits será 1000, ya que el  pic será el maestro.

Luego en la inicialización de la comunicación serial I2C PIC el registro SSPCON en el XC8 quedará así:

SSPCON=0b00101000;// I2C PIC habilitado en modo maestro

Configuración del registro SSPCON2

El bit7 se pondrá a 0 ya que este bit es utilizado cuando el PIC trabaja como esclavo.

El bit6 este bit trabaja en forma automática, se inicia a 0 porque aún no hay comunicación y por tanto el maestro no ha recibido el bit ACK.

El bit5 se pone a 0 para que el bit  de reconocimiento sea 0.

El bit4 se pondrá a 0 porque se está inicializando el I2C PIC se habilitará en programa

El bit3 se pondrá a 0 porque se está inicializando el I2C PIC, se habilitará para la recepción de datos.

El bit2 se pondrá a 0 porque se está inicializando el I2C PIC, se habilitará cuando se quiera detener la comunicación I2C PIC.

El bit1 se pondrá a 0 porque se está inicializando el I2C PIC, se habilitará cuando se quiera repetir o reiniciar la comunicación I2C PIC.

El bit0 se pondrá a 0 porque se está inicializando el I2C PIC, se habilitará cuando se quiera iniciar la comunicación I2C PIC.

Luego en la inicialización de la comunicación serial I2C PIC el registro SSPCON2  en el XC8 quedará así:

SSPCON2=0b00000000;// comunicación I2C no iniciada

Carga del registro SSPADD para los baudios o la cantidad de bits por segundo para la comunicación serial I2C PIC, como será a velocidad estándar por lo que el bit SMP del registro SSPSTAT se puso a 1, se utilizará la fórmula.

El valor a cargar en el registro SSPADD se calcula con la siguiente fórmula que dependerán de la velocidad elegida, y de la frecuencia del oscilador utilizado.

Velocidad=Fosc/(4*(SSPADD+1))

Esta formula se puede reacomodar para obtener la siguiente fórmula:

SSPADD=(Fosc/(4*Velocidad))-1

Se utilizará una velocidad d 100Kbps, y el oscilador es de 4Mhz, si en la fórmula anterior se reemplaza y se despeja se tendrá:

SSPADD=(4000000/(4*100000))-1

de donde:

SSPADD=9

Por lo que para obtener un una velocidad de 100Kbps se tendrá que cargar el registro SSPADD con 9, luego en el XC8 será:

SSPADD=9;//para una velocidad de 100Kbps con un oscilador de 4Mhz

Entonces se puede iniciar el módulo SSP en modo I2C PIC en el XC8 de la siguiente manera:

La inicialización podría hacerse dentro de una función a la que se le puede dar el nombre que se quiera, en este caso se la llamará i2c_iniciar() lo que en el XC8 será así:

Antes de empezar una comunicación I2C se verificará si se cumple algunas condiciones, ya que de lo contrario se puede interferir si se está realizando ya alguna comunicación, por lo que se tendrá que esperar a que no se ha iniciado ninguna comunicación, ni recepción ni transmisión, ni un inicio, ni un reinicio y ni una parada, esto se realizará con una función a la que se le llamará i2c_espera(), la que en el XC8 puede ser hecha así:

Para iniciar la comunicación I2C PIC, una vez inicializado el módulo SSP en modo  I2C PIC se puede iniciar la comunicación poniendo el bit0 SEN del registro SSPCON2 a 1, pero esperando que se cumplan las condiciones adecuadas con la función de espera, el inicio de la comunicación se hará mediante una función a la que se le llamará i2c_inicia_com(), se le puede llamar como se quiera, en el XC8 se puede hacer así:

Para reiniciar la comunicación I2C PIC, si se quiere seguir realizando una comunicación I2C PIC que ya se ha estado realizando y está por terminar se puede reiniciar la comunicación poniendo el bit1 RSEN del registro SSPCON2 a 1, pero esperando que se cumplan las condiciones adecuadas con la función de espera, el reinicio de la comunicación se hará mediante una función a la que se le llamará i2c_reinicia_com(), se le puede llamar como se quiera, en el XC8 se puede hacer así:

Para detener la comunicación I2C PIC, si ya no se quiere seguir realizando una comunicación I2C PIC se puede detener la comunicación poniendo el bit2 PEN del registro SSPCON2 a 1, pero esperando que se cumplan las condiciones adecuadas con la función de espera, la parada de la comunicación se hará mediante una función a la que se le llamará i2c_detener(), se le puede llamar como se quiera, en el XC8 se puede hacer así:

Para la transmisión de datos del maestro al esclavo se espera a que se cumplan las condiciones adecuadas luego se carga en el registro SSPBUF el dato que se quiera enviar, el envío de datos se hará mediante una función a la que sel llamará i2c_envia_dato(), se le puede llamar como se quiera, esta función devolverá un 0 que se encontrará en el bit6 ACKSTAT del registro SSPCON2 si el esclavo a recibido el dato correctamente, en el XC8 se puede hacer así:

Para la recepción de los datos leídos por el maestro desde el esclavo se creará una variable donde se almacenará el dato leído, luego el maestro tendrá que enviar el bit de reconocimiento ACKDT al esclavo, si el bit enviado es 0 se le indica al esclavo que se seguirán recibiendo mas datos, si es un 1 se le indica al esclavo que ya no se recibirán mas datos, la recepción de datos se hará mediante una función a la que sel llamará i2c_recibe_dato(), se le puede llamar como se quiera, esta función devolverá el dato recibido, en el XC8 se puede hacer así:

ARCHIVO DE CABECERA PARA EL USO DEL MÓDULO I2C PIC EN EL XC8

Se puede agrupar todas la funciones vistas anteriormente para el uso del módulo SSP en modo I2C PIC en el XC8 en modo maestro del PIC16F877A con una velocidad de 100Kbps, en un archivo de cabecera al que se le llamará en este caso i2c.h, aunque se le puede dar el nombre que se desee, se hará uso de este archivo de cabecera en los ejemplos que se realizarán con el PIC16F877A, si se utiliza otro pic u otra velocidad de comunicación es fácil hacer los cambios que se necesiten dentro del archivo i2c.h, se verá algún ejemplo.

I2C PIC PROGRAMACIÓN Ejemplos en el XC8

Para ver los ejemplos del manejo del módulo SSP en modo I2C PIC visitar este enlace.

Si he podido ayudarte con el uso del módulo módulo SSP en modo I2C PIC, comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.

Atte: MrElberni.

Compartir: Share on Facebook9Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0