一. 基础知识(DS18B20):
1.单总线(VCC DQ GND三个引脚)(所有的数据和指令的传递都是从最低有效位开始传输)
2.温度寄存器(2字节)温度报警阈值寄存器(TH TL ,1字节,ROM掉电不丢失)配置寄存器(1字节,配置温度分辨率9/10/11/12位,ROM掉电不丢失)
Q:什么是温度分辨率??(上电默认12位)
A:DS18B20 的温度分辨率是指它能检测到的最小温度变化量,核心范围为 9~12 位(对应 0.5℃、0.25℃、0.125℃、0.0625℃)
3.如何测温:
芯片在上电状态下默认的精度为12位。 DS18B20启动后保持低功耗等待状态;当需要执行温度测量和AD转换时,总线控制器必须发出[44h]命令。在那之后,产生的温度数据以两个字节的形式被存储到温度寄存器中, DS18B20继续保持等待状态。 DS18B20由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”(见单总线系统节), DS18B20正在温度转换中返回0,转换结束返回1。
温度寄存器数据格式:

1>. 高4位表示数据“正负”:+为0000,-为1111;
2>. 后面8位表示数据:(以12位分辨率为例)
比如:
(1)125°C :
125➗0.0625=2000
2000(十进制)转化成 0111_1101_0000(二进制)
因此 +125°C在12位分辨率下,就是0000_0111_1101_0000
(2)-55°C
55➗0.0625=880
880(十进制)
0011_0111_0000(二进制)
1100_1000_1111(反码)
1100_1001_0000(补码(反码+1))
因此在最终12位分辨率下,-55就是1111_1100_1001_0000

注意:
![]()
4.报警操作(TH和TL寄存器,共8bit)
DS18B20完成一次温度转换后,就用该温度值与存储在TH和TL寄存器(如图3所示)中的一个字节的用户自定义的报警阈值进行比较。标志位(S)指示温度值的正负:正数S=0,负数S=1。 TH和TL寄存器是非易失性的(EEPROM) , 所以在掉电后数据仍然保持。

当TH和TL为8位寄存器时,在与TH和TL的比较中仅适用温度寄存器的4到11位。如果测得的温度高于TH或低于TL,报警条件成立, DS18B20内部就会置位一个报警标识。每进行一次测温就对这个标识进行一个更新。因此,如果报警状态消失,则在下一个温度转换后,该标识将被关闭。
5. 64位只读存储器:(每个DS18B20唯一的64位编码)
每颗DS18B20都有一个全球唯一的存储在ROM中的64位编码。最前面8位是单线系列编码: 28h。接着的48位是一个唯一的序列号。最后8位是以上56位的CRC编码。

6. 存储器:

7. 配置寄存器(配置精度)
用户可以通过表2所示设置R0和R1位来设定DS18B20的精度。上电默认设置: R0=1, R1=1(12位精度)。注意:精度和转换时间之间有直接的关系。配置寄存器的位7和位0到4被器件保留,禁止写入;在读数据时,它们全部表现为逻辑1。


![]()
8.CRC发生器(可以关掉吗?)
单总线信号类型:复位脉冲(拉低)、存在脉冲(拉低)、写0、写1、读0和读1;(它的时序是怎样的?)
二. 对于我们是主机(FPGA)来说DS18B20如何使用?
首先明确,总线空闲时,被上拉电阻拉高!!!
1.初始化(发送复位脉冲,接收存在脉冲)(表明DS18B20已经准备好发送和接受)
时序:控制器发送复位脉冲(480us)—>上拉进入高电平 —> 等待(15-60us)—> DS18B20发送存在脉冲(60-240us)

2.发送ROM命令(用于确定与主设备通信的是哪颗DS18B20设备,初学者只接入一颗DS18B20,可以直接发送“忽略ROM指令”(SKIP ROM [CCh]))
3.发送DS18B20功能指令(用于控制读写DS18B20的寄存器)
4.发送写的数据/接收读的数据
(1)写时序:必须把数据线拉到低电平然后释放,且需在15us内释放总线。当总线被释放后,上拉电阻将总线拉高。此时数据线从逻辑高电平拉到低电平时,写时序开始。写时序必须最少持续60us,包括两个写周期之间至少1us的恢复时间。
(2)读时序:

在之后的文章我会具体写出,使用EGO1读取温度的基本时序逻辑,以及驱动代码~~





