Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
El 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.
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.
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.
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.
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 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 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.
Velocidad=Fosc/(4*(SSPADD+1))
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.
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í:
El bit6 se pondrá a 0 para que la comunicación sea con las especificaciones I2C.
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.
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.
Velocidad=Fosc/(4*(SSPADD+1))
SSPADD=(Fosc/(4*Velocidad))-1
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
1 /////////////////////////////////////////////////////////////
2 /////////////////////////////////////////////////////////////
6
7
1 ////////////////////////////////////////////////////////////////////////////
2 /////////////////////////////////////////////////////////////////////////////
3 //inicialización del módulo SSP en modo I2C PIC en el XC8 en una función////
6
7 void i2c_iniciar(){
2 ////////////////////////////////////////////////////////////
8
9 void i2c_espera(){
11 }
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í:
1 /////////////////////////////////////////////////////////////
2 ////////////////////////////////////////////////////////////
4
5 void i2c_inicia_com() {
8}
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í:
1 ////////////////////////////////////////////////////////////
2 ////////////////////////////////////////////////////////////
4
5 void i2c_reinicia_com(){
8}
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í:
1 /////////////////////////////////////////////////////////////
2 ////////////////////////////////////////////////////////////
4
5 void i2c_detener() {
1 //////////////////////////////////////////////////////////////////
2 /////////////////////////////////////////////////////////////////
5 //el dato
6
11 }
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í:
1 //////////////////////////////////////////////////////////////////
2 /////////////////////////////////////////////////////////////////
5
6 unsigned char i2c_recibe_dato(){
7
8 unsigned char datoleido; //variable para guardar el dato que se reciba o lea
10
15
19
21
25 //mas datos
26
31 return datoleido;
32 }
1 ///////////////////////////////////////////////////////////////////////
2 ///////////////////////////////////////////////////////////////////////
3 //Archivo de cabecera para el uso del SSP en modo I2C PIC con el XC8///
7 //cambios como los pines SCL y SDA, la Fosc, siempre revisar la hoja//
9 ///////////////////////////////////////////////////////////////////////
10
11 #ifndef I2C_H
12 #define I2C_H
13
20 //datos en el esclavo
22
23 ///////////////////////////////////////////////////////////////////////////
24 /////////////////////////////////////////////////////////////////////////////
25 //inicialización del módulo SSP en modo I2C PIC en el XC8 en una función////
29 void i2c_iniciar(){
36 }
37
38 ////////////////////////////////////////////////////////////
39 ////////////////////////////////////////////////////////////
45
46 void i2c_espera(){
48 }
49
50 ////////////////////////////////////////////////////////////
51 ////////////////////////////////////////////////////////////
53
54 void i2c_inicia_com() {
57 }
58
59 ////////////////////////////////////////////////////////////
60 ////////////////////////////////////////////////////////////
63 void i2c_reinicia_com(){
66 }
67
68 ////////////////////////////////////////////////////////////
69 ////////////////////////////////////////////////////////////
71
72 void i2c_detener() {
75 }
76
77 /////////////////////////////////////////////////////////////////
78 /////////////////////////////////////////////////////////////////
81 //el dato
82
87 }
88
89 /////////////////////////////////////////////////////////////////
90 /////////////////////////////////////////////////////////////////
93
95
96 unsigned char datoleido; //variable para guardar el dato que se reciba o lea
98
103
107
109
114
120 }
121
Compartir: 0
1 ///////////////////////////////////////////////////////////////////////
2 ///////////////////////////////////////////////////////////////////////
3 //Archivo de cabecera para el uso del SSP en modo I2C PIC con el XC8///
7 //cambios como los pines SCL y SDA, la Fosc, siempre rebisar la hoja//
9 ///////////////////////////////////////////////////////////////////////
10
11 #ifndef I2C_H
12 #define I2C_H
13
20 //datos en el esclavo
21 unsigned char i2c_recibe_dato(); //función para recibir o leer datos del esclavo
22
23 ///////////////////////////////////////////////////////////////////////////
24 /////////////////////////////////////////////////////////////////////////////
25 //inicialización del módulo SSP en modo I2C PIC en el XC8 en una función////
28
29 void i2c_iniciar(){
36 }
37
38 ////////////////////////////////////////////////////////////
39 ////////////////////////////////////////////////////////////
46 void i2c_espera(){
48 }
49
50 ////////////////////////////////////////////////////////////
51 ////////////////////////////////////////////////////////////
53
54 void i2c_inicia_com() {
57 }
58
59 ////////////////////////////////////////////////////////////
60 ////////////////////////////////////////////////////////////
62
63 void i2c_reinicia_com(){
66 }
67
68 ////////////////////////////////////////////////////////////
69 ////////////////////////////////////////////////////////////
71
72 void i2c_detener() {
75 }
76
77 /////////////////////////////////////////////////////////////////
78 /////////////////////////////////////////////////////////////////
81 //el dato
82
87 }
88
89 /////////////////////////////////////////////////////////////////
90 /////////////////////////////////////////////////////////////////
95
96 unsigned char datoleido; //variable para guardar el dato que se reciba o lea
98
103
107
109
114
120 }
121
I2C PIC EJEMPLOS
I2C PIC ejemplos 1 En este primer ejemplo se realizará la comunicación
serial I2C PIC entre el PIC16F877A, y la memoria EEPROM 24LC256 (revisar
su hoja de datos) la que está fabricada para
El ejemplo es sencillo para no complicar el código, pero se puede hacer lo que
se quiera mediante la comunicación I2C. La idea es muy similar por no decir la
misma si se utiliza otro tipo de dispositivo que se pueda utilizar como esclavo
en la comunicación I2C PIC.
1 //////////////////////////////////////////////
2 ///////*********************************///////
4 ///////*****************************//////////
6 ///////********************************///////
7
8 //bits de configuración del PIC16F877A
10 #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
11 #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
12 #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
14 #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit
15 #pragma config WRT = OFF // Flash Program Memory Write Enable bits
17
19 #include <xc.h>
23
26
29
30 void main(void) {
31 TRISD=0b00000000; //todos los pines de puerto D como salidas para conectar los leds
32 //que permitirán ver el dato leido desde la EEPROM en forma binaria
34
36
38
44
46 //de la 0 a la 50
50
53 }
54 }
55 }
56 return;
57 }
58
64
67
74
75 //lo que sigue es enviar la dirección del registro de la memoria EEPROM donde se
77 //la EEPROM 24LC256 son de 2 bytes, se envía primero la parte alta de esta dirección
83
84 //Lo que sigue es enviar el dato a la dirección del registro de la memoria EEPROM
88
89 //una vez que el esclavo recibe el dato se terminará la comunicación I2C PIC
91 }
92
96 //que será la dirección del registro de la memoria EEPROM que se desea leer
100
102
109
110 //lo que sigue es enviar la dirección del registro de la memoria EEPROM de donde
111 //el maestro PIC16F877A leerá o recibirá el dato, como estas direcciones en
112 //la EEPROM 24LC256 son de 2 bytes, se envía primero la parte alta de esta dirección
118
119 //lo que sigue una vez que ya se le dijo al esclavo donde se leerá es reiniciar la
122
123 //a continuación se vuelve a enviar la dirección del esclavo con el que el maestro se
124 //está comunicanco, en este cado de la EEPROM de quien su dirección es de 7 bits (1010000)
125 //pero esta vez junto con el bit 1 que es el que le indica al esclavo que el maestro
126 //quiere leer o recibir un dato de la EEPROM, por lo que se envia 10100001
129
131 //y se guarda en la variable dato creada en un inicio dentro de esta función
133
134 //una vez que el maestro lee o recibe el dato se terminará la comunicación I2C PIC
136
137 return dato; //la función devolverá el dato leído desde la EEPROM y guardado en
139 }
La siguiente es una imagen del circuito de prueba realizado para el I2C PIC
ejemplos 1
I2C PIC ejemplos 1