一、项目介绍
使用温度传感器LM75进行温度读取。
二、LM75芯片介绍
温度测量范围-55~+125℃,分辨率为0.125°C。
芯片具有两种工作模式,一种比较模式一种中断模式。
设置上限温度Tos与下限温度Thyst。
比较模式,温度高于上限温度Tos,OS引脚输出active,温度低于下限温度Thyst,OS引脚输出重置,该模式下适合控制外部设备冷却风扇或热敏开关。
中断模式,在温度高于上限温度Tos或低于下限温度Thyst时OS引脚active。
工作状态图
数据寄存器
数据计算公式
三、数据读取模块编写
input sys_clk,
input rst_n,
output scl,
inout sda,
output reg[16:0] data
模块输入输出数据
`define SCL_POS (cnt==3'd0)
`define SCL_HIG (cnt==3'd1)
`define SCL_NEG (cnt==3'd2)
`define SCL_LOW (cnt==3'd3)
`define DEVICE_READ 8'b1001_0001 //read device addr
//************************************************************/
reg[2:0] cnt;
reg[7:0] cnt_delay;
reg scl_r;
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n) cnt_delay <= 8'd0;
else if(cnt_delay == 8'd199) cnt_delay <= 8'd0;
else cnt_delay <= cnt_delay+1'b1;
always @ (posedge sys_clk or negedge rst_n)
begin
if(!rst_n) cnt <= 3'd5;
else begin
case (cnt_delay)
9'd49: cnt <= 3'd1;
9'd99: cnt <= 3'd2;
9'd149: cnt <= 3'd3;
9'd199: cnt <= 3'd0;
default: cnt <= 3'd5;
endcase
end
end
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n) scl_r <= 1'b0;
else if(cnt==3'd0) scl_r <= 1'b1;
else if(cnt==3'd2) scl_r <= 1'b0;
assign scl = scl_r;
//---------------------------------------------
将scl信号分为上升、高电平、下降、低电平四种状态。
使用系统时钟生成scl信号,每一百个系统时钟周期scl信号电平翻转一次。
定义八位设备地址1001_0001。
上图为IIC数据传输状态机。
数据处理部分重点有:
sda=sda_link?sda_r:1'bz;
这里使用sda_link信号控制sda引脚是输入还是输出。
sda_link==1,sda=sda_r此时sda引脚做输出,向外传输数据,用于IIC总线向外传输设备地址。
sda_link==0,sda=1'bz此时sda引脚高阻,用于外部数据输入。
data_conv、data_conv1、data_conv2用于数据转换与拼接。
data_conv=read_data[15]?~read_data[15:0]+1'b1:read_data[15:0];
read_data[15]==1,最高位为1,设备读取温度为负值,数据进行~read_data[15:0]+1'b1处理获得温度数值;最高位为0,设备读取温度为正值,数据无需处理。
data_conv1=data_conv*125;
data_conv2=data_conv1/100/32;
数据乘于精度0.125获得当前温度值,除32不清除是为什么。
data={read_data[15],data_conv2[15:0]}
将处理好的数据进行拼接。
模块代码链接:https://pan.baidu.com/s/1QerC_-sgUL8ktOcjgHa2IQ
提取码:kjzx