名称:温度传感器LM75温度数码管显示I2C代码
软件:QuartusII
语言:Verilog
代码功能:
读取开发板上的温度传感器LM75的数值,并将温度显示在数码管上。IIC(I2C)接口,代码兼容LM75A,LM75BD,tmp1075
本代码已在开发板验证,开发板资料:
FPGA代码Verilog/VHDL代码资源下载网:www.hdlcode.com
代码下载:
部分代码展示
module LM75A_test(clk,rst_n,scl,sda,cs,seg); input clk,rst_n; //fu复位信号低电平有效,时钟50MHz; output scl; //I2C时钟,250KHz;时钟周期为4us; inout sda; //I2C数据端; output[3:0] cs; //数码管片选; output[7:0] seg; //数码管段选; wire done; // I2C读取一个数据完毕,更新数码管段选寄存器; wire[15:0] data;//温度数据; //LM75的I2C接口控制 I2C_READ I2C_READ( .clk(clk), .rst_n(rst_n), .scl(scl),//I2C时钟,250KHz;时钟周期为4us; .sda(sda),//I2C数据端; .data(data)//温度数据; ); //数码管显示 SEG_D SEG_D( .clk(clk), .rst_n(rst_n), .cs(cs),//数码管片选; .seg(seg),//数码管段选; .data(data)//温度数据显示 ); endmodule //LM75的I2C接口控制 module I2C_READ( clk, rst_n, scl,sda,data ); input clk;//总线时钟 50MHz input rst_n;//异步复位,低电平有效 output scl;//SCL 时钟 inout sda;// SDA 数据总线 output [15:0] data;//温度数据 reg [15:0]data_r;//温度数据寄存器 reg scl;//SCL 总线寄存器 reg sda_r;//SDA 总线寄存器 reg sda_link;//SDA 总线数据方向标志 reg [7:0]scl_cnt;//SCL 时钟产生计数器 reg [2:0]cnt;//用来标记SCL时钟计数器 reg [25:0]timer_cnt;//定时器,每隔2s 读取一次温度数据 reg [3:0]data_cnt;//数据串并转换寄存器 reg [7:0]address_reg;//器件地址寄存器 reg [8:0]state;//状态寄存器 // //进程1、2、3:产生SCL 总线时钟 always@(posedge clk or negedge rst_n) begin if(!rst_n) scl_cnt <= 8'd0; else if(scl_cnt == 8'd199) scl_cnt <= 8'd0; else scl_cnt <= scl_cnt + 1'b1; end always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 3'd5; else case(scl_cnt) 8'd49: cnt <= 3'd1;//高电平中间 8'd99: cnt <= 3'd2;//下降沿 8'd149:cnt <= 3'd3;//低电平中间 8'd199:cnt <= 3'd0;//上升沿 default: cnt <= 3'd5; endcase
设计文档:
1.LM75A简介:
LM75A 是一个使用了内置带隙温度传感器和Σ-△模数转换技术的温度-数字转换器。它也是一个温度检测器,可提供一个过热检测输出。
LM75A 包含许多数据寄存器:配置寄存器(Conf),用来存储器件的
某些配置,如器件的工作模式、OS 工作模式、OS 极性和OS 故障队列等(在功能描述一节中有详细描述);
温度寄存器(Temp),用来存储读取的数字温度;设定点寄存器(Tos & Thyst),用来存储可编程的过热关断和滞后限制,器件通过2 线的串行I2C 总线接口与控制器通信。LM75A 还包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效。LM75A 有3 个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。
LM75A 可配置成不同的工作条件。它可设置成在正常工作模式下周期性地对环境温度进行监控或进入关断模式来将器件功耗降至最低。OS 输出有2 种可选的工作模式:OS 比较器模式和OS 中断模式。OS 输出可选择高电平或低电平有效。故障队列和设定点限制可编程,为了激活OS 输出,故障队列定义了许多连续的故障。
温度寄存器通常存放着一个11 位的二进制数的补码,用来实现0.125℃的精度。这个高精度在需要精确地测量温度偏移或超出限制范围的应用中非常有用。
正常工作模式下,当器件上电时,OS 工作在比较器模式,温度阈值为80℃,滞后75℃,这时,LM75A就可用作一个具有以上预定义温度设定点的独立的温度控制器。
2.LM75A规格:
读出温度数据。
3.实现原理
LM75A时钟频率入下图所示:
由于系统时钟为50Mhz,为了分频方便,此处选用50Khz的频率作为LM75A时钟频率。
50Mhz/50Khz = 50000000/50000 = 1000
LM75A读温度数据时序如下图所示:
0 0 0 1 1 1 1 0 1 0 0
总共28个时钟周期完成一次读操作,所以计数器宽度设置为8位宽。
使用SCL的四倍频率来控制计数器,使用计数器控制SDA相对于SCL的相位关系。
本程序还增加了上电初始化关断LM75操作,因为器件上电一般需要有一个初始化时间,本程序初始化延时大概在几十秒左右,故将程序下进去后几十秒后才显示温度数据。
I2C总线数据通信协议规范(必须遵守):
主机和LM75A 之间的通信必须严格遵循I2C 总线管理定义的规则。LM75A 寄存器读/写操作的协议通
过下列描述之后的各个图来说明:
1. 通信开始之前,I2C 总线必须空闲或者不忙。这就意味着总线上的所有器件都必须释放SCL 和
SDA 线,SCL 和SDA 线被总线的上拉电阻拉高。
2. 由主机来提供通信所需的SCL 时钟脉冲。在连续的9 个SCL 时钟脉冲作用下,数据(8 位的
数据字节以及紧跟其后的1 个应答状态位)被传输。
3. 在数据传输过程中,除起始和停止信号外,SDA 信号必须保持稳定,而SCL 信号必须为高。
这就表明SDA 信号只能在SCL 为低时改变。
4. S:起始信号,主机启动一次通信的信号,SCL 为高电平,SDA 从高电平变成低电平。
5. RS:重复起始信号,与起始信号相同,用来启动一个写命令后的读命令。
6. P:停止信号,主机停止一次通信的信号,SCL 为高电平,SDA 从低电平变成高电平。然后总
线变成空闲状态。
7. W:写位,在写命令中写/读位=0。
8. R:读位,在读命令中写/读位=1。
9. A:器件应答位,由LM75A 返回。当器件正确工作时该位为0,否则为1。为了使器件获得SDA 的控制权,这段时间内主机必须释放SDA 线。
10. A’:主机应答位,不是由器件返回,而是在读2 字节的数据时由主控器或主机设置的。在这个
时钟周期内,为了告知器件的第一个字节已经读走并要求器件将第二个字节放到总线上,主机
必须将SDA 线设为低电平。
11. NA:非应答位。在这个时钟周期内,数据传输结束时器件和主机都必须释放SDA 线,然后由
主机产生停止信号。
12. 在写操作协议中,数据从主机发送到器件,由主机控制SDA 线,但在器件将应答信号发送到
总线的时钟周期内除外。
13. 在读操作协议中,数据由器件发送到总线上,在器件正在将数据发送到总线和控制SDA 线的
这段时间内,主机必须释放SDA 线,但在主器件将应答信号发送到总线的时间周期内除外。