1-Wire 与 DS18B20:一根线搞定供电、寻址和数据
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**入门层(beginner)**数字逻辑基础第八十二篇。WS2812是单向单线,1-Wire 更进一步——同一根线要双向通信、还能给从机供电、总线上挂几十个器件。它把开漏线与和精确时隙用到了极致,是理解异步自定时物理层的好例子。
本文要回答的问题
- 一根线没有方向控制,主从怎么分时说话?为什么必须用开漏加上拉?
- 写 0、写 1、读时隙的电平宽度和采样点分别是什么?
- 主机怎么知道线上挂没挂器件(存在脉冲)?又怎么在多器件里寻址某一个?
- DS18B20 的一次测温要走哪些命令、温度值怎么编码、要等多久?
- 什么是寄生供电,为什么转换大电流时要「强上拉」?
一、物理层:开漏 + 上拉,所有器件线与
总线常态被电阻上拉为高。主机和从机的引脚都只主动拉低(开漏/开集,见三态与线与),任何器件拉低都能把总线拽成 0,释放后靠电阻回到 1——这保证不会出现「一个输出高、一个输出低」的短路。所有位都由「在规定的时间槽里谁把线拉低多久」定义,缺省位是 1,起始都是一次拉低,没有独立时钟,双方用各自的微秒定时对齐。
二、复位与存在脉冲:先确认线上有人
任何事务都以复位序列开始:
- 主机把总线拉低至少 480µs(复位脉冲)后释放;
- 上拉把线拉高,从机检测到上升沿后等待 15~60µs,再由从机把线拉低 60~240µs 作为存在脉冲(presence);
- 主机在释放后的约 60~240µs 窗口内若采到低电平,就知道至少有一个器件在线。
三、写时隙与读时隙:微秒级的默契
每个时隙约 60µs(加至少 1µs 恢复),所有位都从主机拉低开始:
- 写 1:主机拉低 1~15µs 后释放,时隙剩余时间总线为高;
- 写 0:主机持续拉低约 60µs,时隙末才释放;
- 读:主机先拉低 ≥1µs 再释放,从机若要发 0 就继续拉低、发 1 则保持释放为高;主机必须在时隙开始后的 约第 15µs采样——从机只在这个短窗口内驱动有效数据,之后释放。
写0: ┌______约60us______┐___ 写1: ┌_1~15us_┐____________________
读: ┌_1us_┐ 主机在≈15us 采样从机电平(从机发0则仍为低)由于窗口以微秒计,软件要靠硬件定时器精确定时、期间避免被中断打断,上拉电阻(常 4.7kΩ)决定上升沿速度,线越长容性越大越要减小电阻、放慢时序。
四、ROM 寻址与 DS18B20 测温流程
每个器件出厂有唯一 64bit ROM(8bit 家族码+48bit 序列号+8bit CRC),故一条总线可挂多个器件:
- ROM 命令:Search ROM(逐位仲裁扫描全部地址)、Match ROM(指定一个地址)、Skip ROM(只有单器件时跳过寻址);
- 功能命令(DS18B20):**Convert T(0x44)**启动一次温度转换,12bit 分辨率下最长约 750ms才完成(期间可读 DQ 电平判断是否忙),再发 **Read Scratchpad(0xBE)**读出温度寄存器。
温度为 16bit、12bit 分辨率时 1 LSB = 0.0625°C,负温度以二进制补码表示(软件读回做符号扩展、乘 0.0625)。读 scratchpad 和 ROM 都带 CRC-8,可用CRC/LFSR校验线路错误,温度系统里这条校验能挡住接触不良造成的野值。
五、寄生供电:从数据线「偷」电
从机可省掉 VCC(数据手册称 parasite power):平时经 DIO 上拉给内部电容充电储能,转换/测温需要较大电流时,主机必须在 Convert T 期间用一个强上拉管(MOSFET)把总线强行拉到电源,否则仅靠弱上拉会因压降导致转换失败。大多数设计直接接 VCC 更省心;无论哪种,都要算好线长、上拉和温度转换的长等待(期间可释放总线做别的事,靠 750ms 定时或查询忙信号回来读)。
与现有篇目的衔接
总结
一句话总结:1-Wire 用一根数据线加地完成双向通信(还可寄生供电),物理上所有主从引脚都只能主动拉低、靠上拉电阻恢复高电平,以开漏线与避免输出冲突,缺省为 1、每个约 60µs 的时隙都由一次拉低开始:写 1 只短拉低 1~15µs 就释放、写 0 持续拉低整个时隙,读时主机先拉低 1µs 再释放并必须在约第 15µs 采样从机在该窗口驱动的电平;任何事务都以主机拉低超过 480µs 的复位脉冲开始,从机随后用 60~240µs 的存在脉冲应答以表明在线;多器件靠每颗出厂唯一的 64bit ROM(家族码+48bit 序列号+CRC)经 Search/Match/Skip ROM 寻址;DS18B20 测温流程是复位、寻址、发 Convert T 启动转换(12bit 时最长约 750ms)、再 Read Scratchpad 读出 16bit 温度(1LSB=0.0625°C、负值为补码)并用 CRC-8 校验;微秒级窗口要求硬件定时器精确定时、发送段避免中断、按线长选合适上拉电阻,寄生供电时还必须在转换期间用 MOSFET 强上拉提供大电流。