【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,写入 0x8C
uint8_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设备,所以写数据失败了


浙公网安备 33010602011771号