黑金开发板逻辑编写学习——IIC温度读取模块

一、项目介绍

使用温度传感器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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱多多小姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值