Antes de continuar con este artículo, por favor refierase a la instalación previa del kit Nordic nRF54L15-DK. A continuación, se describe el proceso para interconectar el kit nRF54L15-DK a el sensor IoT LSM6DSO I2C disponible en Digikey. A continuacion se muestran las conecciones necesarias,
El primer paso es crear el siguiente conjunto de archivos relacionados a Zephyr OS en esta estructura de directorios,
|-- CMakeLists.txt
|-- nrf54l15dk_nrf54l15.overlay
|-- prj.conf
`-- src
`-- main.c
El siguiente archivo llamado CMakeLists.txt,
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(blinky)
target_sources(app PRIVATE src/main.c)
El archivo del projecto nombrado proj.conf,
CONFIG_GPIO=y
CONFIG_I2C=y
CONFIG_CBPRINTF_FP_SUPPORT=y
y más importante aún, el archivo overlay que permite que el sensor LSM6DSO vía la interfaz I2C se puede usar dentro del programa main.c usando las apropiadas funciones Interfaze de Programación de la Aplicación (API de Zephyr “RTOS” siglas en inglés) y los apropiados mácros (macrobáticos) de Zephyr “RTOS” dentro del Nordic nRF54L15-DK disponible en Digikey. En este archivo overlay se configuró la frecuencia de la interfaz I2C a 100 KHz con una dirección I2C de esclavo de 0x6B,
&i2c22 {
status = "okay";
pinctrl-0 = <&i2c22_default>;
pinctrl-1 = <&i2c22_sleep>;
clock-frequency = <100000>;
pinctrl-names = "default", "sleep";
mysensor: mysensor@6b{
compatible = "i2c-device";
status = "okay";
reg = < 0x6b >;
};
};
&pinctrl {
/omit-if-no-ref/ i2c22_default: i2c22_default {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,
<NRF_PSEL(TWIM_SDA, 1, 12)>;
};
};
/omit-if-no-ref/ i2c22_sleep: i2c22_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,
<NRF_PSEL(TWIM_SDA, 1, 12)>;
low-power-enable;
};
};
};
El archivo main.c es el siguiente,
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/sys/printk.h>
#define I2C_NODE DT_NODELABEL(mysensor)
static const struct i2c_dt_spec dev_i2c = I2C_DT_SPEC_GET(I2C_NODE);
#define WHOAMI 0x0F
/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS 1000
/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
int main(void)
{
if (!device_is_ready(dev_i2c.bus)) {
printk("I2C bus %s is not ready!\n\r",dev_i2c.bus->name);
return -1;
}
int ret;
bool led_state = true;
if (!gpio_is_ready_dt(&led)) {
return 0;
}
ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
return 0;
}
while (1) {
uint8_t id = 0;
uint8_t regs[] = {WHOAMI};
int ret = i2c_write_read_dt(&dev_i2c, regs, 1, &id, 1);
if (ret != 0) {
printk("Failed to read register %x \n", regs[0]);
return -1;
}
if (id != 0x6C) {
printk("Invalid chip id! %x \n", id);
return -1;
}
else {
printk("Found WHOAMI = %x\n", id);
}
ret = gpio_pin_toggle_dt(&led);
if (ret < 0) {
return 0;
}
led_state = !led_state;
printf("LED state: %s\n", led_state ? "ON" : "OFF");
k_msleep(SLEEP_TIME_MS);
//Read and print values
uint8_t values[65];
ret = i2c_burst_read_dt(&dev_i2c, 0x00, values, 64);
if (ret != 0) {
printk("Failed to read registers %x \n", 0x00);
return;
}
int i = 0;
while(i < 64)
{
printk("Register %x = %x\n", i, values[i]);
i = i + 1;
}
}
return 0;
}
Este archivo main.c parpadea el LED a medida que lee el registro WHOAMI
int ret = i2c_write_read_dt(&dev_i2c, regs, 1, &id, 1);
y realiza una lectura de autoincremento (burst) de 65 bytes dentro del ASIC del sensor,
ret = i2c_burst_read_dt(&dev_i2c, 0x00, values, 64);
Para compilar (construir) el projecto lleve a cabo el siguiente paso,
(venv) $ west build -p always -b nrf54l15dk/nrf54l15/cpuapp -- -DEXTRA_DTC_OVERLAY_FILE=nrf54l15dk_nrf54l15.overlay
entonces se programa el Nordic nRF54L15-DK como sigue,
(venv) $ west flash
Una vez completado este paso, aquí se ve el “setup” usado para demonstrar esta función de comunicación vía la interfaz I2C con el sensor SparkFun 6 Grados de Libertad LSM6DSO .
Este video muestra el LED parpadeando a medida que la interfaz del Nordic kit I2C está comunicandose con el sensor LSM6DSO mientras que el Sparkfun 8-channel USB Logic Analyzer previamente descrito en el articulo Techforum esta capturando la comunicación vía el interfaz I2C.
El kit nRF54L15-DK para IoT disponible en Digikey está conectado vía USB. El Sparkfun 8-channel USB Logic Analyzer captura las transacciones de I2C de forma apropiada,
Ahora se abre un términal de minicom usando este comando,
minicom -D /dev/ttyACM1
el mismo se utiliza para monitorear la comunicación del interfaz I2C con el SparkFun 6 Grados de Libertad - LSM6DSO del registro WHOAMI como se muestra a continuación,
Found WHOAMI = 6c
LED state: ON
Register 0 = 0
Register 1 = 0
Register 2 = 3f
Register 3 = 0
Register 4 = 0
Register 5 = 0
Register 6 = 0
Register 7 = 0
Register 8 = 0
Register 9 = 0
Register a = 0
Register b = 0
Register c = 0
Register d = 0
Register e = 0
Register f = 6c
Register 10 = 0
Register 11 = 0
Register 12 = 4
Register 13 = 0
Register 14 = 0
Register 15 = 0
Register 16 = 0
Register 17 = 0
Register 18 = e0
Register 19 = 0
Register 1a = 0
Register 1b = 0
Register 1c = 0
Register 1d = 0
Register 1e = 0
Register 1f = 28
Register 20 = 0
Register 21 = 0
Register 22 = 0
Register 23 = 0
Register 24 = 0
Register 25 = 0
Register 26 = 0
Register 27 = 0
Register 28 = 0
Register 29 = 0
Register 2a = 0
Register 2b = 0
Register 2c = 0
Register 2d = 0
Register 2e = 0
Register 2f = 0
Register 30 = 0
Register 31 = 0
Register 32 = 0
Register 33 = 0
Register 34 = 0
Register 35 = 0
Register 36 = 0
Register 37 = 0
Register 38 = 0
Register 39 = 0
Register 3a = 0
Register 3b = 0
Register 3c = 0
Register 3d = 0
Register 3e = 0
Register 3f = 0
Found WHOAMI = 6c
LED state: OFF
Este artículo describe como se conecta el sensor vía la interfaz de I2C a el kit Nordic nRF54L15-DK disponible en Digikey. Digikey tiene mucnos sensores I2C que se pueden conectar al kit IoT Nordic nRF54L15-DK para muchos projectos IoT usando los pasos aquí descritos. Que tenga un buen día.
This article is available in english here.
Este artículo esta disponible en lenguaje inglés aquí.

