Semestre 2015-1 - MC Jorge Eduardo Ibarra Esquer

Universidad Autónoma de Baja California
Facultad de Ingeniería Mexicali
Inter-Integrated Circuit – Two Wire
Interface
Microprocesadores y Microcontroladores
M.C. Jorge Eduardo Ibarra Esquer
Semestre 2015-1
I2C/I2C/IIC/TWI
• Bus desarrollado por Philips
Semiconductors (hoy NXP
Semiconductors).
• Permite la comunicación entre dispositivos
utilizando un bus bidireccional de dos
líneas:
– Datos SDA
– Reloj SCL
I2C/I2C/IIC/TWI
• A cada dispositivo en el bus se le asigna
una dirección.
• Distintas implementaciones permiten
transferencias a 100 kbit/s, 400 kbit/s, 3.4
Mbit/s y un modo unidireccional de hasta 5
Mbit/s
I2C/I2C/IIC/TWI
I2C en Arduino
Modelo
SDA
SCL
Uno
A4
A5
Leonardo
2
3
Librería Wire
• Permite la comunicación con dispositivos
I2C/TWI, utilizando las siguientes funciones:
–
–
–
–
–
–
–
–
–
begin()
requestFrom()
beginTransmission()
endTransmission()
write()
available()
Read()
onReceive()
onRequest()
begin()
• Se utiliza para inicializar la librería y unirse
al bus ya sea como maestro o esclavo.
• Sintaxis:
– Wire.begin() – Maestro
– Wire.begin(address) – Esclavo
• El parámetro address se refiere a una
dirección de 7 bits con la que se
identificará al esclavo.
beginTransmission()
• Inicia la transmisión con el esclavo que se
seleccione.
• Sintaxis:
– Wire.beginTransmission(address)
write()
• Escribe datos a un esclavo seleccionado
por el maestro mediante la función
beginTransmission()
• Sintaxis:
– Wire.write(value)
– Wire.write(string)
– Wire.write(data,length) //Arreglo y cantidad
• La función regresa el número de bytes
transmitidos.
endTransmission()
• Termina la transmisión de datos hacia un
esclavo.
• Sintaxis:
– Wire.endTransmission()
– Wire.endTransmission(stop) // boolean
• Regresa un byte que indica el estado de la
transmisión:
– “0” indica que se realizó con éxito.
Ejemplo de escritura
// Transmite al dispositivo #44 (0x2c)
Wire.beginTransmission(44);
// Se envía un byte
Wire.write(val);
// Termina la transmisión
Wire.endTransmission();
requestFrom()
• Se utiliza por el dispositivo maestro para
solicitar datos a un esclavo.
• Sintaxis:
– Wire.requestFrom(address,quantity)
– Wire.requestFrom(address,quantity,stop)
available()
• Regresa el número de bytes que se
encuentran disponibles para leer desde un
esclavo.
• En un maestro, se llama después de la
función requestFrom()
• En un esclavo, se utiliza dentro del
método onReceive()
read()
• Lee un byte que fue transmitido desde un
esclavo.
• Sintaxis:
– Wire.read()
• Regresa el siguiente byte disponible.
Ejemplo de lectura
// Solicita 6 bytes al dispositivo #44 (0x2c)
Wire.requestFrom(44,6);
// Se leen los bytes enviados por el esclavo
while(Wire.available())
{
char c=Wire.read();
Serial.print(c);
}
onRequest()
• Registra una función que se llamará
cuando un maestro solicite datos al
esclavo.
• En este caso, el microcontrolador está
configurado como esclavo.
• Sintaxis:
– Wire.onRequest(handler)
onReceive()
• Registra una función que se llamará
cuando un esclavo recibe datos desde un
maestro.
• En este caso, el microcontrolador está
configurado como esclavo.
• Sintaxis:
– Wire.onReceive(handler)
– void handler(int numBytes) // Número de
bytes recibidos