本帖最后由 stm1024 于 2024-3-19 11:28 编辑
单总线(1-wire)是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同,它采用单根信号线传输。 这种协议由一个总线主节点、或多个从节点组成系统,通过根信号线对从芯片进行数据的读取。每一个符合单总线协议的从芯片都有一个唯一的地址,包括48位的序列号、8位的家族代码和8位的CRC代码。主芯片根据64位寻址对各个芯片进行双向通信,因此其协议对时序的要求较严格,初始化、写bit或读bit都有严格的时序要求,但是位于位之间没有严格要求。单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。主设备I/O口可直接驱动200m范围内的从设备,经过扩展后可达1km范围。这种传输方式信号线上既传输时钟又传输数据,而且数据传输是双向的,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点,但是对于总线的位定时要求比较高。
树莓派的将该协议集成到了系统中,我们使用的时候将会非常方便,设备树上实现了很多芯片模块的解析工作,我们使用起来会很方便,这里我本来打算是使用经典的DS18B20温度传感器的,但是不想翻箱倒柜的找模块,手边找到了一个DHT11,所以就以它为例,介绍在树莓派环境下使用单总线协议。
首先是配置打开该外设,图形化的方式如下:
当然,也可以在终端中使用命令:
两者的效果是一样的。
然后配置config.txt文件:
- sudo nano /boot/firmware/config.txt
复制代码 在最后一行加上如下内容:
- dtoverlay=dht11,gpiopin=4
复制代码 注意,这里GPIO的通道要与线路连接保持一致。
然后reboot重启系统。
重启以后,使用 lsmod | grep dht11检查系统是否已经自动加载一线协议的驱动模块。
在Linux中,一切皆文件,对应额功能,可以进入/sys/bus/iio/devices/iio:device0,可以看到所加载的模块,通过访问该目录下的一些数据,就可以获取到节点名称,温度和湿度:
注意,温度和湿度都是1000的整数倍,因此,上图中看到的19000和38000,分别表示温度为19℃和相对湿度为38%。
通过使用上述的设备树,可以省去了很多硬代码模拟时序的操作,可以非常方便的实现对外设的访问,更多受支持的芯片等,可以查看打开 /boot/overlays/README文件,包含了很多芯片外设的设备树,需要用到的时候就可以用上面的方式来加载,当然了,如果不用的时候,最好把config.txt文档中的相关dtoverlay也要注释掉,不然GPIO针脚会乱套。
|