1. 单总线协议基础解析
单总线协议(1-Wire Protocol)是达拉斯半导体(现被Maxim Integrated收购)开发的一种独特通信协议。作为一名嵌入式开发者,我在多个温湿度监测项目中深度使用过这种协议,它的最大魅力在于仅用一根数据线就能实现双向通信。
1.1 硬件连接拓扑
典型的单总线系统由三部分组成:
- 主控制器(MCU):负责发起和控制通信
- 从设备(如DS18B20):响应主控指令
- 上拉电阻:4.7kΩ是经过验证的最佳值
实际接线时要注意:
- 数据线(DQ)必须接4.7kΩ上拉电阻到VCC
- 当使用寄生供电模式时,VCC引脚可悬空
- 总线长度不宜超过30米(实测超过10米就需要考虑信号质量)
关键提示:上拉电阻的阻值选择很讲究。我曾试过用10kΩ电阻,结果在长距离传输时出现通信失败。4.7kΩ能在信号质量和功耗间取得最佳平衡。
1.2 电气特性详解
单总线采用开漏输出设计,这意味着:
- 所有设备只能将总线拉低,不能主动拉高
- 总线空闲时由上拉电阻维持高电平
- 冲突检测机制:当多个设备同时拉低时,总线呈现"线与"特性
通信速率方面,标准模式下最高可达16.3kbps。我在STM32F103上实测,使用硬件定时器精确控制时序时,可以稳定达到15.6kbps的通信速率。
2. 核心时序实现细节
2.1 复位与应答时序
复位脉冲是通信的起点,必须严格满足:
c复制// 典型复位信号生成代码
void reset_pulse(void) {
set_pin_output(); // 配置为输出
pull_low(); // 拉低DQ
delay_us(480); // 保持480μs以上
set_pin_input(); // 释放总线
}
应答检测的关键点:
- 主控释放总线后,应在15-60μs内检测应答
- 有效的存在脉冲宽度为60-240μs
- 无应答的可能原因排查:
- 接线错误(最常见)
- 上拉电阻缺失
- 设备供电不足(寄生供电时特别注意)
2.2 读写时序实现
写时序有两种变体:
- 写0:持续拉低60-120μs
- 写1:短暂拉低1-15μs后立即释放
读时序的黄金法则:
- 主控先拉低1-5μs(我通常用2μs)
- 立即切换为输入模式
- 在15μs内采样总线状态
- 整个读周期至少维持60μs
实战技巧:在STM32上,我使用硬件定时器捕获功能来实现高精度时序控制,比软件延时更可靠。特别是当系统中有中断干扰时,硬件定时器能保证时序的准确性。
3. DS18B20温度传感器实战
3.1 完整通信流程分解
以读取温度值为例,标准流程如下:
- 初始化复位脉冲
- 发送跳过ROM命令(0xCC)
- 发送温度转换命令(0x44)
- 等待转换完成(典型750ms@12位分辨率)
- 再次复位
- 发送跳过ROM命令(0xCC)
- 发送读取暂存器命令(0xBE)
- 连续读取9字节数据
- 计算CRC校验
- 解析温度值
c复制// 温度值解析示例代码
float parse_temperature(uint8_t *data) {
int16_t raw = (data[1] << 8) | data[0];
if (raw & 0x8000) { // 负温度处理
raw = -(raw & 0x7FFF);
}
return raw * 0.0625f; // 12位分辨率
}
3.2 分辨率设置技巧
DS18B20支持9-12位分辨率设置:
c复制void set_resolution(uint8_t res) {
uint8_t config = (res - 9) << 5 | 0x1F;
write_scratchpad(0, 0, config); // 写入配置寄存器
}
不同分辨率对应的转换时间:
- 9位:93.75ms
- 10位:187.5ms
- 11位:375ms
- 12位:750ms
经验分享:在电池供电项目中,我通常使用11位分辨率,在精度和功耗间取得良好平衡。只有当需要检测快速温度变化时,才会使用12位模式。
4. 高级应用与故障排查
4.1 多设备组网技术
当总线上有多个DS18B20时,需要:
- 使用搜索ROM算法(0xF0)枚举所有设备
- 记录每个设备的64位ROM码
- 通过匹配ROM命令(0x55)选择特定设备
搜索ROM算法实现较复杂,建议参考Maxim官方提供的示例代码。我在一个农业大棚项目中成功管理了多达15个DS18B20传感器。
4.2 常见故障排查指南
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无应答信号 | 接线错误/设备损坏 | 检查连线,更换设备测试 |
| CRC校验失败 | 时序不准确/电磁干扰 | 优化时序代码,添加屏蔽线 |
| 温度值异常 | 寄生供电不足 | 增加强上拉(转换期间) |
| 通信不稳定 | 总线过长/负载过多 | 缩短总线,减少设备数量 |
4.3 寄生供电优化方案
当使用寄生供电时,特别注意:
- 温度转换期间需要强上拉(通过MOSFET控制)
- 总线负载电容不超过800pF
- 转换完成前不要进行其他通信
我常用的强上拉电路设计:
code复制VCC ---[MOSFET]--- DQ
|
GPIO控制
在启动温度转换后,通过GPIO控制MOSFET将DQ直接拉到VCC,提供足够的工作电流。
5. 协议对比与选型建议
5.1 主流串行协议对比
| 特性 | 单总线 | I2C | SPI |
|---|---|---|---|
| 信号线数量 | 1(+GND) | 2 | 3-4 |
| 最大速率 | 16kbps | 400kbps | 10Mbps+ |
| 寻址能力 | ROM码 | 7/10位地址 | 片选信号 |
| 适用场景 | 简单传感器 | 中速设备 | 高速外设 |
5.2 工程选型考量
选择单总线的最佳场景:
- 布线空间极其有限
- 设备数量较少(建议不超过10个)
- 对速率要求不高
- 需要长距离传输(配合适当驱动电路)
在最近的一个冷链监控项目中,我选择单总线方案正是因为需要在狭窄的冷藏车空间内布置多个温度监测点,单总线的布线优势非常明显。
对于需要更高速度或更复杂交互的场景,我会建议采用I2C或SPI协议。比如在一个工业烤箱控制系统中,由于需要频繁读取多个传感器的数据,最终选择了I2C接口的TMP117传感器。
单总线协议虽然简单,但时序要求极为严格。经过多个项目的实践验证,我总结出几个确保稳定通信的关键点:精确的延时控制、可靠的上拉电路、严谨的错误处理。当这些条件都满足时,单总线方案能够提供令人满意的稳定性和性价比。