一、DS18B20简介
1.DS18B20模块
1.1 序列号
1.2 高速暂存器
0,1字节温度数据;2字节温度报警高位,3字节,温度报警低位;4字节配置寄存器;5,6,7字节设备内部使用(保留位);8字节,CRC循环校验位。
1.2.1 温度传感器
DS18B20的核心模块是温度传感器,温度传感器用户可配置9,10,11,12位(分别对应的温度精度为0.5,0.25,0.125,0.0625),温度测量和AD转换命令[44h]。
温度数据以16位符号扩展的二进制补码形式存储在温度寄存器中。符号位(S)表示温度是正还是负:对于正数S = 0,对于负数S = 1;温度数据帧格式如下:
供电方式的确定,命令Skip ROM [CCh],确定是VDD还是寄生电源供电。
1.2.2 配置寄存器
通过R1和R0设置温度测量分辨率;其余位给设备内部使用,不能覆盖
1.2.3 CRC循环校验
高8位为CRC校验位
2.通信协议:1-wire/单总线
二、DS18B20命令
1.ROM指令
1.1 SKIP ROM [CCh] 跳出ROM
当总线上只有一个DS18B20时,可以不发送64bit数据,以节省时间,读指令(Read Scratchpad [BEh])会默认跟随跳出指令(SKIP ROM [CCh])发出。
2.DS18B20功能指令
三、DS18B20时序
1.初始化时隙
总线拉低480us -> 延时等待60us -> 采样存在脉冲(为1表示初始化失败跳回idle,为0表示初始化结束,开始配置ROM)
2.读写时隙
2.1 写时隙
主设备通过写时隙将命令写入 DS18B20 中,写时隙有两种情况:写“1”和写“0”时 隙。主设备通过写 1 时隙来向 DS18B20 中写入逻辑 1,通过写 0 时隙来向 DS18B20 中写入 逻辑 0。当主设备将总线从高电平拉至低电平时,启动写时隙,所有的写时隙持续时间最 少为 60us,每个写时隙间的恢复时间最少为 1us。 当总线(DQ)拉低后,DS18B20 在 15us 至 60us 之间对总线进行采样,如果采的 DQ 为高电平则发生写 1,如果为低电平则发生写 0,如上图所示(图中的总线控制器即为主设备)。 如果要产生写 1 时隙,必须先将总线拉至逻辑低电平然后释放总线,允许总线在写 隙开始后 15us 内上拉至高电平。若要产生写 0 时隙,必须将总线拉至逻辑低电平并保持不 变最少 60us。
2.2 读时隙
当我们发送完读取供电模式[B4h]或读高速缓存器[BEh]命令时,必须及时地生成读时隙,只有在读时隙 DS18B20 才能向主设备传送数据。每个读时隙最小必须有 60us 的持续 时间以及每个读时隙间至少要有 1us 的恢复时间。当主设备将总线从高电平拉至低电平超 过 1us,启动读时隙,如下图所示。当启动读时隙后,DS18B20 将会向主设备发送“0”或者“1”。DS18B20 通过将总线 拉高来发送 1,将总线拉低来发送 0 。当读时隙完成后,DQ 引脚将通过上拉电阻将总线拉高至高电平的闲置状态。从 DS18B20 中输出的数据在启动读时隙后的 15us 内有效,所以,主设备在读时隙开始后的 15us 内必须释放总线,并且对总线进行采样
四、工程实践
1.系统框图
2.程序设计
2.1 DS18B201驱动模块设计
2.1.1 DS18B20读取流程
1).初始化(IDLE)
2).ROM 配置,跳过ROM(ROM_SKIP)
3).发送温度转换命令,等待温度转换完成;
4).再次初始化,跳过ROM
5).发送温度读取命令,等待温度读取完成
2.1.2 状态机设计
2.1.3 驱动模块代码
module DS18B20_drive (
input clk ,
input rst_n ,
inout dq ,
output [21:0] temp_data ,
output sign ,
output reg temp_data_vld
);
//延时计数器最大值
parameter DELAY_480US = 15'd24_000,
DELAY_240US = 15'd12_000,
DELAY_1US = 15'd50,
DELAY_12US = 15'd600,
DELAY_20US = 15'd1_000 ,
DELAY_15US = 15'd1_500 ,
DELAY_60US = 15'd3_000 ,
DELAY_61US