【前言】
在FRDM_RW612开发板上,板载了一颗温度传感P3T1755。本次使用Zephyr的Sensor模块来驱动他,获取温度值。
【温度传感器】
在开发板的靠近MCULINK接口

在开发板原理图上有注明为U2

通过原理图得知他的器件地址为0x90。接到了GPIO_16与GPIO_17上。
【zephyr工程组织】
创建工程文件目录结构如下:
app/RW612_p3t1755/ ├── CMakeLists.txt # 标准 Zephyr 应用骨架 ├── prj.conf # CONFIG_SENSOR=y └── src/main.c # 每秒读一次温度并 printk
【代码前期验证】
1、通过设备树查找,FRDM-RW612 的板级设备树 frdm_rw612_common.dtsi:345 已经帮你做好了硬件描述:
&flexcomm2 { // I2C 控制器(arduino_i2c)
compatible = "nxp,lpc-i2c";
status = "okay";
p3t1755: p3t1755@48 { // 板载传感器,7位地址 0x48
compatible = "nxp,p3t1755";
reg = <0x48>;
status = "okay";
};
};2、Zephyr 自带驱动 zephyr/drivers/sensor/nxp/p3t1755/,只要设备树节点是 okay,CONFIG_P3T1755 就默认 y,I2C 驱动也会自动选中。所以应用层只需 CONFIG_SENSOR=y,然后走标准 sensor API 即可,不需要任何 overlay。
【代码实现】
1、通过上面的验证,我们只需要在prj.conf中打开sensor配置即可
prj.conf文件内容如下:
# 使能 Zephyr 传感器子系统(P3T1755 驱动在设备树节点 enabled 时默认编译) CONFIG_SENSOR=y
2、CMakeLists.txt
在这里我们也只需要编写常规即可,指定加入编译的文件也就只有src/main.c即可
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(RW612_p3t1755)
target_sources(app PRIVATE src/main.c)3、main.c
在main.c中,我们的核心三步:
DEVICE_DT_GET(DT_NODELABEL(p3t1755)) — 按节点标签拿到设备指针
sensor_sample_fetch(dev) — 触发一次转换并读回原始值
sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp) — 换算成摄氏度,val1 是整数部分,val2 是小数部分(微度)
源码全文如下:
/*
* FRDM-RW612 板载 P3T1755 温度传感器轮询示例
*
* P3T1755 挂在 flexcomm2 (arduino_i2c) 上,地址 0x48,
* 设备树节点标签为 p3t1755(板级 dtsi 已定义并启用)。
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
int main(void)
{
const struct device *const dev = DEVICE_DT_GET(DT_NODELABEL(p3t1755));
struct sensor_value temp;
int ret;
if (!device_is_ready(dev)) {
printk("P3T1755 device %s is not ready\n", dev->name);
return 0;
}
printk("P3T1755 (%s) ready, polling every 1s...\n", dev->name);
while (1) {
ret = sensor_sample_fetch(dev);
if (ret) {
printk("sensor_sample_fetch failed: %d\n", ret);
goto wait;
}
ret = sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp);
if (ret) {
printk("sensor_channel_get failed: %d\n", ret);
goto wait;
}
/* sensor_value_to_double 也可,这里用整数+小数打印避免浮点 printf 开销 */
printk("Temperature: %d.%06d C\n", temp.val1, temp.val2);
wait:
k_sleep(K_SECONDS(1));
}
return 0;
}【编译与下载】
由于我们app在zephyr的目录下面,就不需要配置zephyr sdk的路径了,直接west build -b frdm_rw613即可以编译,如果在其他的环境中,需要配置环境。
export ZEPHYR_SDK_INSTALL_DIR="D:\\luglZephyrproject\\zephyr-sdk-1.0.1\\zephyr-sdk-1.0.1" export ZEPHYR_TOOLCHAIN_VARIANT=zephyr west build -b frdm_rw612 app/RW612_p3t1755 -p # 已验证通过 west flash # 需装好 LinkServer,板子 USB 接 CMSIS-DAP 口
【效果观察】
打开串口终端 波特率为115200

【想改硬件配置时】
换 I2C 地址/总线:在应用目录加 boards/frdm_rw612.overlay,覆写 &p3t1755 的 reg 或把节点挪到别的 flexcomm。
读更高精度:驱动返回的 val2 本身分辨率是 0.0625°C(1/16),已完整打印。
想走 shell 交互调试:prj.conf 加 CONFIG_SENSOR_SHELL=y,串口里直接敲 sensor get p3t1755@48。
【总结】
在zephyr下,我们驱动P3t1755非常方便,用户不需要去观察底层,只需要少量的代码就完成即定功能!
我要赚赏金
