I2C
2
3
Origen
• Desarrollado por Philips a principios de los 80 como medio de interconexión entre una CPU y dispositivos periféricos dentro de la electrónica de consumo.• Simplificar las conexiones entre los periféricos (pistas, decodificadores, ..)• Aumentar de la inmunidad al ruido.• Control de sistemas de audio y vídeo (baja velocidad).
• Actualmente diseñan dispositivos basados en I2C muchos fabricantes: • Xicor, SGS-Thomson, Siemens, Intel, TI, Maxim, Atmel, Analog Devices
• Aplicaciones• Bus de interconexión entre dispositivos en una tarjeta o equipo.• Sistema de configuración y supervisión en ordenadores servidores.• Sistemas de gestión de alimentación.• Conexión en serie de dispositivos externos a un ordenador.• Tarjetas chip
IntroducciónBUS I2C
Fuente: http://galia.fc.uaslp.mx/~cantocar/microcontroladores/EL_BUS_I2C/TRANSPARENCIASI2C.PDF
4
Mas …
• Ventajas• Pocos cables de interconexión.• Componentes con encapsulado reducido.• Tarjetas reducidas.• Conexión de dispositivos a distancia
• Inconvenientes• Velocidad inferior a un bus paralelo• Disponibilidad de circuitos que soporten el bus
• Parámetros generales• Número de hilos de conexión• Velocidad (bits/segundo)• Distancia máxima y número de dispositivos• Protocolo de acceso al medio compartido• Política de direccionamiento
IntroducciónBUS I2C
Fuente: http://galia.fc.uaslp.mx/~cantocar/microcontroladores/EL_BUS_I2C/TRANSPARENCIASI2C.PDF
5
Características
• Bus de comunicación síncrono• La comunicación es controlada por una señal de reloj común
• Bus formado por 2 hilos• SDA (Serial Data Line): datos• SCL (Serial Clock line): reloj
• Velocidad de transmisión• Standard: hasta 100 Kbits/s• Fast: hasta 400 Kbits/s• High-speed: hasta 3,4 Mbits/s
• Cada dispositivo del bus tiene una dirección única• Distancia y número de dispositivos
• Limitado por la capacidad del bus. Normalmente 2 o 3 metros• Protocolo de acceso al bus:
• Maestro – esclavo• I2C soporta protocolo multimaestro
IntroducciónBUS I2C
6
Conexión al bus
• Todos los dispositivos conectados a las mismas líneas.• Las salidas deben ser en colector o drenador abierto.
IntroducciónBUS I2C
7
Protocolo de acceso al medio: maestro - esclavo
IntroducciónBUS I2C
• El maestro controla la comunicación• Genera la señal de reloj del bus (SCL)• Inicia y termina la comunicación• Direcciona a los esclavos• Establece el sentido de la comunicación
• El protocolo requiere que cada byte de información sea confirmado por el destinatario.
Nomenclatura• Emisor: Dispositivo que envía datos al bus• Receptor: Dispositivo que recibe datos del bus• Maestro: Dispositivo que inicia una transferencia, genera las
señales de reloj y termina la transferencia• Esclavo: Dispositivo direccionado por un maestro.
8
Transmisión de bits
• Los bits de datos van por SDA• Por cada bit de información es necesario un pulso de SCL• Los datos sólo pueden cambiar cuando SCL está a nivel bajo
IntroducciónBUS I2C
9
Transmisión de datos
• La unidad básica de transmisión en el byte• Las transferencias de datos son de 8 bits• Cada byte enviado requiere una respuesta de confirmación
• ACK: el destinatario (maestro o esclavo) mantiene SDA a nivel bajo durante un tiempo de bit (si no lo hace -> NACK)
• El maestro genera un pulso de SCL.
IntroducciónBUS I2C
10
Inicio de transmisión
• La transmisión la inicia el maestro• Condición: Flanco de bajada en SDA con SCL a nivel alto• Obs: Cuando nadie accede al bus hay un nivel alto en SCL y SDA
IntroducciónBUS I2C
11
Finalización de la Transmisión
• La transmisión la finaliza el maestro• Flanco de subida en SDA con SCL a nivel alto
IntroducciónBUS I2C
12
Intercambio de datos
Direccionamiento• Tras la condición de inicio el maestro envía:
• Dirección del esclavo (7 bits)• Comando de lectura o escritura (R=1 – W=0)
IntroducciónBUS I2C
13
Maestro envía datos a un esclavo
IntroducciónBUS I2C
14
Intercambio de datos
IntroducciónBUS I2C
15
Maestro lee datos de un esclavo
IntroducciónBUS I2C
16
Intercambio de datos
IntroducciónBUS I2C
17
Librería WIRE
La librería viene incluida en el IDE Arduino. Esta librería te permite comunicar con dispositivos I2C / TWI.
IntroducciónBUS I2C
18
Librería WIRE
IntroducciónBUS I2C
Función Wire.begin(address)
Descripción: Inicializa la librería Wire y configura el bus I2C como maestro o esclavo.
Parámetros: address: La dirección de 7 bits de esclavo (opcional); si no se específica, se configura como maestro.
Retorno: Nada.
Función Wire.beginTransmission(address)
Descripción: Comienza una transmisión a un dispositivo I2C esclavo con la dirección dada (address). Posteriormente, prepara los bytes a transmitir con la función write() y los transmite llamando a la función endTransmission().
Parámetros: address: la dirección de 7 bits del dispositivo a transmitir
Retorno: Nada.
19
Librería WIRE
IntroducciónBUS I2C
Función Wire.requestFrom(address, quantity)Wire.requestFrom(address, quantity, stop)
Descripción: Master solicita bytes de otro dispositivo. Los bytes pueden ser recibidos con las funciones available() y read().
Parámetros: address: La dirección de 7 bits del dispositivo a pedir los bytes. .quantity: el numero byte de la petición.stop : boolean. Será true si se envía un mensaje de stop despues de la petición, liberará el bus. False: enviará continuamente un reinicio después de la solicitud, manteniendo la conexión activa. Por defecto TRUE.
Retorno: Byte. El numero de bytes retornados desde el dispositivo esclavo.
20
Librería WIRE
IntroducciónBUS I2C
Función Wire.write(value) Wire.write(string) Wire.write(data, length)
Descripción: Escribe los datos de un dispositivo esclavo en respuesta a una petición de un maestro, o colas de bytes para la transmisión de un maestro a esclavo del dispositivo (en-entre las llamadas a beginTransmission () y endTransmission ()).
Parámetros: value: un valor para enviar como un solo byte.string: una cadena para enviar como una serie de bytes.data: un conjunto de datos para enviar como bytes.length: el número de bytes a transmitir.
Retorno: bytewrite () devolverá el número de bytes escritos, aunque la lectura de ese número es opcional
21
Librería WIRE
IntroducciónBUS I2C
Función Wire.read()
Descripción: Lee un byte que se transmite de un dispositivo esclavo a un maestro después de una llamada a requestFrom () o se transmite de maestro a un esclavo. read () se hereda de la clase de utilidad Stream.
Parámetros: Nada
Retorno: El siguiente byte recibido.
Función Wire.available()
Descripción: Devuelve el número de bytes disponibles para la recuperación con read(). Esto debería ser llamado en un dispositivo master tras una llamada al requestFrom().
Parámetros: Nada
Retorno: El número disponible de bytes.
22
Librería WIRE
IntroducciónBUS I2C
Función Wire.endTransmission()Wire.endTransmission(stop)
Descripción: Finaliza una transmisión a un dispositivo esclavo que se inició por beginTransmission() y transmite los bytes que se pusieron en cola por write().
Parámetros: stop: boolean. true enviará un mensaje de detención, liberando el bus después de la transmisión. false enviará un reinicio, manteniendo la conexión activa.
Retorno: byte, el cual indica el estado de la transmission:0: éxito1: data demasiado grande para entrar en el buffer del transmisor.2: recibe NACK en transmission de dirección.3: recibe un NACK en transmission de datos.4: otro error.
IntroducciónAcelerómetro: ADXL345
23
IntroducciónAcelerómetro: ADXL345
24
Dirección SDO/ALT ADDRESS
Read Write
0x1D 1 0x3B 0x3A0x53 0 0xA7 0xA6
IntroducciónAcelerómetro: ADXL345
• Rate bits output data: 100 Hz• Output resolution: +/-2g• Sensibilidad: 256 LSB/g• Factor de escala: 3.9 mg/LSB
25
Gracias!!!
26