在核桃派上读取DS18b20温度传感器,使用linux自带的驱动

linux内置了ds18b20的驱动,只需要启用驱动,再写好设备树就行

注意,ds18b20的数据引脚要加一个上拉电阻,如果没有会导致通信失败。

启用相关驱动

打开文件/etc/modules,插入如下两行内容。linux系统里自带的驱动很多,但平时只会加载一些基本的。你想让linux系统在开机时自动加载哪个驱动,只要把驱动的名称写进这个文件即可。

w1_gpio
w1_therm

会在后续的每一次开机,都加载你想要的驱动出来运行。

写设备树插件

按照格式,写明你想把ds18b20连接到哪个引脚上。

  1. 首先在开发板上创建一个文件,这里命名为ds18b20.dts,填入以下内容。

我所使用的PI-HAT拓展板上带了一个ds18b20连接到PC9引脚,还有一个连接到PC10引脚的拓展插口也插了一个ds18b20,所以这里我声明了两个引脚。

/dts-v1/;
/plugin/;


/ {
    compatible = "allwinner,sun50i-h616";

    fragment@0 {
        target-path = "/";
        __overlay__ {
            onewire@0 {
                compatible = "w1-gpio";
                gpios = <&pio 2 9 0>; /* PC9 */
                status = "okay";
            };
            onewire@1 {
                compatible = "w1-gpio";
                gpios = <&pio 2 10 0>; /* PC10 */
                status = "okay";
            };
        };
    };
};

图片中用红色框框起来的部分是固定格式,意思是插入到原有设备树的根下面。两个黄色框的部分,是声明了两个要使用ds18b20驱动的引脚。最核心的部分是下面这一行

gpios = <&pio 2 9 0>; /* PC9 */
  • 其中数字2表示这个是哪一组IO。A是0,B是1,C是2,以此类推按顺序往后排。
  • 其中数字9表示是该组IO中的具体编号

因为单总线是靠软件模拟的而不是硬件外设,所以所有引脚都可以作为单总线接口。

注意一个引脚同时只能被一个驱动占用,例如某个引脚已经分配给了spi驱动,那就不能再被ds18b20驱动使用。

  1. 编译为dtbo格式

运行以下命令,将ds18b20.dts文件编译为一个sun50i-h616-ds18b20.dtbo文件,注意有个固定前缀sun50i-h616-

dtc -@ -q -I dts -O dtb -o sun50i-h616-ds18b20.dtbo ds18b20.dts
  1. 放置设备树插件

首先把.dtbo那个文件复制到路径/boot/overlays/

sudo cp sun50i-h616-ds18b20.dtbo  /boot/overlays/
  1. 启用设备树

这个set-device命令是核桃派设计的,用于设置开机时加载哪些设备树插件

sudo set-device enable ds18b20
  1. 重启

读取ds18b20温度值

  1. 查看设备

驱动会自动定时对指定引脚进行扫描,然后自动在路径下/sys/bus/w1/devices创建对应文件夹

ls /sys/bus/w1/devices

扫描ds18b20

可以看到有两个28-开头的文件夹,这两个就是扫描到的ds18b20

  1. 读取温度值

要查看温度值只需要输出里面的temperature文件,如

cat /sys/bus/w1/devices/28-0312979468b4/temperature

查看温度值

2 Likes