linux内置了ds18b20的驱动,只需要启用驱动,再写好设备树就行
注意,ds18b20的数据引脚要加一个上拉电阻,如果没有会导致通信失败。
启用相关驱动
打开文件/etc/modules
,插入如下两行内容。linux系统里自带的驱动很多,但平时只会加载一些基本的。你想让linux系统在开机时自动加载哪个驱动,只要把驱动的名称写进这个文件即可。
w1_gpio
w1_therm
会在后续的每一次开机,都加载你想要的驱动出来运行。
写设备树插件
按照格式,写明你想把ds18b20连接到哪个引脚上。
- 首先在开发板上创建一个文件,这里命名为
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驱动使用。
- 编译为dtbo格式
运行以下命令,将ds18b20.dts
文件编译为一个sun50i-h616-ds18b20.dtbo
文件,注意有个固定前缀sun50i-h616-
dtc -@ -q -I dts -O dtb -o sun50i-h616-ds18b20.dtbo ds18b20.dts
- 放置设备树插件
首先把.dtbo那个文件复制到路径/boot/overlays/
下
sudo cp sun50i-h616-ds18b20.dtbo /boot/overlays/
- 启用设备树
这个set-device
命令是核桃派设计的,用于设置开机时加载哪些设备树插件
sudo set-device enable ds18b20
- 重启
读取ds18b20温度值
- 查看设备
驱动会自动定时对指定引脚进行扫描,然后自动在路径下/sys/bus/w1/devices
创建对应文件夹
ls /sys/bus/w1/devices
可以看到有两个28-
开头的文件夹,这两个就是扫描到的ds18b20
- 读取温度值
要查看温度值只需要输出里面的temperature
文件,如
cat /sys/bus/w1/devices/28-0312979468b4/temperature