单总线通讯协议 · DHT22温湿度传感器
单总线通信
如果你玩过单片机,那你一定对串口通讯不陌生。串口通讯需要TX和RX两根线,它们分别用来读入数据和写出数据。
而当你拿到一个DHT22或DHT11模块的时候,发现它竟然只引出了3个口:VCC、GND和DATA。顾名思义,发现其中传输数据的引脚只有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。