单总线通讯协议 · DHT22温湿度传感器

单总线通信

如果你玩过单片机,那你一定对串口通讯不陌生。串口通讯需要TXRX两根线,它们分别用来读入数据和写出数据。

而当你拿到一个DHT22DHT11模块的时候,发现它竟然只引出了3个口:VCCGNDDATA。顾名思义,发现其中传输数据的引脚只有DATA一个,那么这种“单总线”的设备是怎么通讯的呢?

其实很简单,单总线通讯协议一共包括了4种操作:写1写0重置,其操作方法如下表所示。(站在host的角度看)

操作 实现
写1 拉低6μs,释放64μs
写0 拉低60μs,释放10μs
拉低6μs,释放9μs,读电平,再延迟55μs
重置 延迟0μs,拉低480μs,释放70μs,读电平,延迟410μs

如果是高速模式的话延迟时间要缩短:

操作 实现
写1 拉低1.0μs,释放7.5μs
写0 拉低7.5μs,释放2.5μs
拉低1.0μs,释放1.0μs,读电平,再延迟7μs
重置 延迟2.5μs,拉低70μs,释放8.5μs,读电平,延迟40μs

其中重置的时候有一个读总线电平的操作,从设备此时应当拉低,若主机读出来的是高电平,则说明从设备未响应或不存在。

DHT22温湿度传感器

了解了单总线通信协议之后,要读取DHT22的数据就很容易了。它采用了简化的单总线通信协议,只保留了重置两个功能(做为温湿度传感器确实够用了)。

名称 定义
起始信号 主机拉低1ms,通知传感器准备数据(重置操作)
响应信号 传感器拉低80μs,再拉高80μs
输出数据 传感器一次性输出40bit(主机要读40次)

输出的数据为40位,数据都是大端序。其中前16bit为湿度,再16bit为温度,最后8bit为校验位(都有8位了干脆叫校验字节吧!)。

校验字节的计算方法是湿度高8位+湿度低8位+温度高8位+温度低8位

关于DHT22详细的说明还是看手册吧。但是不要疑惑,因为DHT22也称AM2302。


JunDao

CEmbedded

777 Words

2020-02-03 21:49 +0800