【NCS随笔】nRF54L15初始化一个I2C外设
nRF54L15初始化一个I2C外设
本文章主要是讲解如何使用nRF54L15初始化一个I2C
一、如何初始化
1、添加宏
CONFIG_I2C=y
2、添加overlay
工程目录下新建一个nrf54l15dk_nrf54l15app.overlay文件,在编译选型添加此overlay
在这个overlay里面添加I2C的节点
&pinctrl {i2c22_default: i2c22_default {group1 {psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,<NRF_PSEL(TWIM_SDA, 1, 12)>;bias-pull-up;};};i2c22_sleep: i2c22_sleep {group1 {psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,<NRF_PSEL(TWIM_SDA, 1, 12)>;low-power-enable;};};
};&i2c22 {status = "okay";clock-frequency = <I2C_BITRATE_STANDARD>;pinctrl-0 = <&i2c22_default>;pinctrl-1 = <&i2c22_sleep>;pinctrl-names = "default", "sleep";mysensor: mysensor@77 {compatible = "i2c-device";status = "okay";reg = <0x77>;};
};
3、添加代码
3.1
添加代码
#include <zephyr/kernel.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/sys/printk.h>#define I2C_NODE DT_NODELABEL(mysensor)//main函数里面添加printf("Hello World! %s\n", CONFIG_BOARD_TARGET);static const struct i2c_dt_spec dev_i2c = I2C_DT_SPEC_GET(I2C_NODE);if (!device_is_ready(dev_i2c.bus)) {printk("I2C bus %s is not ready!\n\r",dev_i2c.bus->name);return -1;
}printk("I2C bus %s is ready. \n");// 写寄存器 0x03,写入 0x8Cuint8_t config[2] = {0x03, 0x8C};int ret = i2c_write_dt(&dev_i2c, config, sizeof(config));if (ret != 0) {printk("Failed to write to I2C device address %x at reg. %x\n", dev_i2c.addr, config[0]);return ret;}// 读寄存器 0x03// 先写寄存器地址,再读数据uint8_t reg_addr = 0x03;uint8_t data = 0;ret = i2c_write_read_dt(&dev_i2c, ®_addr, 1, &data, 1);if (ret != 0) {printk("Failed to read from I2C device address %x at reg. %x\n", dev_i2c.addr, reg_addr);return;}//printk("Read from I2C device address %x at reg. %x the value %x\n", dev_i2c.addr, reg_addr, data);return 0;
可以看到I2C准备好了,不过我没有外挂I2C设备,所以写数据失败了