Comunicación con sensores y periféricos
Comenzar arrow_downwardInter-Integrated Circuit: protocolo de comunicación serie síncrono de 2 hilos.
Desarrollado por Philips (ahora NXP) en 1982. Muy utilizado para conectar sensores, memorias EEPROM, displays y otros periféricos de baja velocidad.
Todos los dispositivos comparten las mismas dos líneas de comunicación.
Línea de reloj que sincroniza la transferencia de datos. El Controller genera la señal de reloj; los Targets la siguen.
Línea de datos bidireccional. Tanto el Controller como los Targets pueden transmitir y recibir datos por esta línea.
Cada dispositivo en el bus tiene una dirección única de 7 bits.
Dirección 0x4A + bit de escritura = 0x94
0x76 / 0x77
0x68 / 0x69
0x3C / 0x3D
0x50 - 0x57
La comunicación I2C sigue un patrón específico de inicio, datos y parada.
SDA baja mientras SCL está alto. Indica el inicio de una transacción.
El receptor pone SDA en bajo para confirmar la recepción correcta del byte.
SDA sube mientras SCL está alto. Indica el fin de la transacción.
0x4A seguida de un byte de datos 0x8C.
Configuración y uso del driver I2C en el nRF Connect SDK.
i2c_dt_spec contiene el puntero al dispositivo del bus y la dirección del target.
I2C_DT_SPEC_GET(node_id)
device_is_ready(dev_i2c.bus)
i2c_write_dt(&dev, buf, len)
i2c_read_dt(&dev, buf, len)
i2c_write_read_dt(&dev, wr, wr_len, rd, rd_len)
Los dispositivos I2C se declaran como nodos hijos del controlador I2C.
@4a en el nombre del nodo indica la dirección I2C en hexadecimal. Debe coincidir con el valor de reg.
compatible
Tipo de dispositivo (usar driver genérico o específico)
reg
Dirección I2C del dispositivo (7 bits)
label
Etiqueta legible (opcional)
Obtener la referencia al dispositivo y verificar que está disponible.
device_is_ready() antes de usar el dispositivo. Puede fallar si el DeviceTree no está configurado correctamente.
Escribir datos en registros del dispositivo I2C.
Envia un buffer de bytes al dispositivo. El primer byte suele ser la dirección del registro a escribir.
Diferentes métodos para leer datos de dispositivos I2C.
i2c_read_dt(&dev, buf, len)
Lectura simple. El dispositivo envia datos inmediatamente después del byte de dirección.
i2c_burst_read_dt(&dev, start_addr, buf, len)
Lectura en ráfaga. Primero escribe la dirección del registro inicial, luego lee múltiples bytes consecutivos.
i2c_write_read_dt(&dev, wr, wr_len, rd, rd_len)
Escritura seguida de lectura sin condición de Stop intermedia. Muy útil para leer registros específicos.
i2c_write_read_dt() para leer registros. Es el método más común y evita condiciones de carrera.
Leer el Chip ID y datos de temperatura de un sensor BME280.
0xD0
0xF4
0xFA
0xFB
Inicializacion, lectura de Chip ID y datos de temperatura.
"I2C es el protocolo estandar para conectar sensores en sistemas embebidos."
Con solo 2 hilos puedes comunicarte con multiples dispositivos en el mismo bus.
I2C_DT_SPEC_GET(node_id)
device_is_ready(dev.bus)
i2c_write_dt(&dev, buf, len)
i2c_read_dt(&dev, buf, len)
i2c_burst_read_dt(&dev, addr, buf, len)
i2c_write_read_dt(&dev, wr, wr_len, rd, rd_len)
Aprenderemos a crear y gestionar multiples hilos de ejecucion en nuestras aplicaciones.