Comunicación I2C
Enviado por Nelson Vi • 29 de Enero de 2017 • Trabajo • 2.247 Palabras (9 Páginas) • 267 Visitas
Definición comunicación I2C.-
Definición 1.-
Según Jonathan Ruiz de Garibay:
“I2C (Inter-Integrated Circuit) es un bus de comunicaciones serie síncrona muy utilizado en la industria para la comunicación entre µcontroladores y sus periféricos en sistemas integrados. Utiliza únicamente dos líneas para trasmitir los datos (SDA) y la señal de reloj (SCL).” [1]
Definición 2.-
Según electroensaimada:
“I2C (Inter-Integrated Circuit) es un bus de comunicación muy utilizado para comunicar circuitos integrados, uno de sus usos más comunes es la comunicación entre un microcontrolador y sensores periféricos. El I2C es un bus multi-maestro es decir permite que haya múltiples maestros y múltiples esclavos en el mismo bus.
El bus I2C cuenta con dos lineas SDA(datos) y SCL(clock) ademas de masa. Como hemos visto en SPI a cada flanco de SCL se captura un bit de SDA, aunque la forma de transmitir la información es diferente. Ademas hay que tener en cuenta que la linea SDA solo puede cambiar de valor en caso de que la linea SCL este a 0..”[2]
Definición 3.-
“I2C es un bus de comunicaciones serie síncrona muy utilizado en la industria para la comunicación entre microcontroladores y sus periféricos en circuitos integrados, utiliza únicamente dos líneas para transmitir los datos y la señal de reloj.” [3]
Definición grupal.-
Es un bus de comunicación utilizado para comunicar circuitos integrados, memorias y otros dispositivos con cierto nivel de "inteligencia", utiliza dos líneas SDA(datos) y SCL(clock), además de masa. Cuenta con múltiples maestros y múltiples esclavos en el mismo bus.
Diagrama comunicación I2C.-
[pic 1]
Descripción de las señales
- SCL (System Clock) es la línea de los pulsos de reloj que sincronizan el sistema.
- SDA (System Data) es la línea por la que se mueven los datos entre los dispositivos.
- GND o Vdd (Masa) común de la interconexión entre todos los dispositivos "enganchados" al bus.
Las líneas SDA y SCL son del tipo drenaje abierto, es decir, un estado similar al de colector abierto, pero asociadas a un transistor de efecto de campo (o FET). Se deben polarizar en estado alto (conectando a la alimentación por medio de resistores "pull-up") lo que define una estructura de bus que permite conectar en paralelo múltiples entradas y salidas.
El bus I2C cuenta con dos lineas SDA(datos) y SCL(clock) ademas de masa. Como hemos visto en SPI a cada flanco de SCL se captura un bit de SDA, aunque la forma de transmitir la información es diferente. Ademas hay que tener en cuenta que la linea SDA solo puede cambiar de valor en caso de que la linea SCL este a 0.
En este caso la misma linea de datos envia la información en las dos direcciones, por lo que es necesario un control de acceso al bus y un direccionamiento de cada elemento.
En I2C hay un valor fuerte y otro valor débil, normalmente el 0 es el valor fuerte y el 1 el débil Esto es así porque el 0 se consigue forzando la linea a esa tensión pero por contra el 1 se consigue con pull-up, por lo tanto en caso de que alguien transmita un 0 y otro un 1, en la linea solo se vera reflejado el 0. Por lo tanto se define como el valor de reposo del bus como el 1, ya que si alguien quiere empezar a comunicar siempre podrá modificar el estado del bus y los demás se darán cuenta.
Otro aspecto a tener en cuenta en I2C es que los maestros o maestro son los únicos que pueden controlar la linea de SCL, eso implica que solo un maestro puede iniciar una transmisión por lo que un Slave tendrá que esperar a que un maestro le pregunte por un dato para poder enviarlo.
Así en I2C cada dispositivo tiene una dirección de 7 bits, es decir se pueden tener hasta 128 dispositivos conectados al mismo bus, hay que tener en cuenta que existen versiones extendidas de I2C con direccionamiento a 8,10 y 12 bits.
En el caso del I2C el protocolo del bus si reserva unos campos para poder realizar la transmisión, cosa totalmente diferente con el SPI donde podíamos enviar en cada byte el dato que queramos.
Trama
Una trama I2C está comprendida por los siguientes campos.
- Bit de start: Este es un bit especial ya que como hemos dicho antes la linea SDA no puede cambiar a menos que SCL este a 0. Este bit rompe dicha norma y provoca un cambio de 1 a 0 cuando SCL esta a nivel alto.
- Address: El primer byte enviado empieza con 7 bits de dirección, el cual indica a quien enviamos o solicitamos el dato.
- R/W (Read/Write): El siguiente bit indica si vamos a realizar una operación de lectura o escritura.
- ACK: Este bit esta presente al final de cada byte que enviamos y nos permite asegurarnos que el byte ha llegado a su destino. De este modo el que envía deja el bit a 1 y si alguien a recibido el mensaje fuerza ese bit a 0. De esta manera confirma que le ha llegado el byte y la transmisión puede continuar.
- 1º Byte de datos: Este es el primer byte de datos propiamente dicho ya que lo anterior no lo podemos elegir nosotros y nos viene impuesto por el protocolo. Aquí podemos poner el dato que queramos en caso de comunicación con sensores remotos un uso habitual es poner el numero de registro al que queremos escribir o leer. Después del byte de datos se espera otro ACK del receptor.
- Se repite el paso 5 tantas veces como sea necesario.
- Bit de Stop. En este caso ocurre lo contrario al bit de Start, se pasa de 0 a 1 cuando la linea SCL se encuentra en alto. Esto termina la transmisión y deja el bus libre para que otro puede empezar a transmitir.
[pic 2]
PROGRAMACION
Interrupciones i2c
En el caso del PIC esclavo, necesita del módulo SSP, por tanto no se puede forzar una comunicación por software como en el PIC maestro y los pines han de ser necesariamente los propios del bus I2C del PIC.
En los esclavos, la comunicación se establece cuando, mediante la interrupción #INT_SSP se detecta actividad en el bus I2C. [1]
#INT_SSP void interrupcion_I2C(void) { } |
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.
[pic 3]
Figura 2. Registro SSPCON2
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 habilitación a la interrupción, si es puesto a 0 el bit no responderá a la llamada general.
...