查看: 1637|回复: 2

[原创] 【IRD-LPC1768-DEV】6 iic_温度传感器

[复制链接]
  • TA的每日心情
    擦汗
    2023-7-4 19:10
  • 签到天数: 92 天

    [LV.6]常住居民II

    15

    主题

    222

    帖子

    23

    高级会员

    Rank: 4

    积分
    640
    最后登录
    2023-8-6
    发表于 2019-3-15 23:10:52 | 显示全部楼层 |阅读模式
    1.首先先看原理图
    和前面坛友说的一样 实际板子的丝印和原理图不一致的 实际地址应该为0x96>>1; 同样挂载在iic0 上面

    1.png

    2.led 用于显示报警的   两个管脚为报警触发  会拉低电平 使led亮   具体可在相关寄存器进行配置

    1111.png

    3.上图显示了实际上电了逻辑  rcs  lcs 会被设置成85度  等会们实际读取验证下 。
    远端 和内部的led值 都有11bit 组成  所以读取一次温度要读取两次Iic 才能得到
    前面坛友得到的只是高位 小数部分没有读取
    2222.png
    datasheet这里应该是笔误 下面写的都是11bit  这里应该是3bit msb

    4.实际代码实现


    //获取温度
    void Get_Temp(float *temp){
            uint8_t reg[2];
            uint8_t swap[2]={0,0};

           
            //读取本地温度
            reg[0]=Local_Temp_High;
            I2Cdrv->MasterTransmit (Temper_I2C_ADDR, reg, 1, true);  //发送按键状态寄存器地址
            while (I2Cdrv->GetStatus().busy);
            I2Cdrv->MasterReceive (Temper_I2C_ADDR, &reg[1], 1, false);  //获取按键状态
            while (I2Cdrv->GetStatus().busy);
            swap[0]=reg[1];
           
            reg[0]=Local_Temp_Low;
            I2Cdrv->MasterTransmit (Temper_I2C_ADDR, reg, 1, true);  //发送按键状态寄存器地址
            while (I2Cdrv->GetStatus().busy);
            I2Cdrv->MasterReceive (Temper_I2C_ADDR, &reg[1], 1, false);  //获取按键状态
            while (I2Cdrv->GetStatus().busy);
            swap[1]=reg[1];
           
            if(swap[0]&&8==1)//是负数
                    {
                            swap[0] =~swap[0];
                            swap[1] = ~swap[1];
                            temp[0]=-1*(swap[0]+((swap[1]>>5)+1)*0.125f);//只有高三位有效
                    }
            else//是正数
                    {
                            temp[0]=swap[0]+(swap[1]>>5)*0.125f;//只有高三位有效
                    }
                   
                   
                    //读取远端温度
            reg[0]=Remote_Temp_High;
            I2Cdrv->MasterTransmit (Temper_I2C_ADDR, reg, 1, true);  //发送按键状态寄存器地址
            while (I2Cdrv->GetStatus().busy);
            I2Cdrv->MasterReceive (Temper_I2C_ADDR, &reg[1], 1, false);  //获取按键状态
            while (I2Cdrv->GetStatus().busy);
            swap[0]=reg[1];
           
            reg[0]=Remote_Temp_Low;
            I2Cdrv->MasterTransmit (Temper_I2C_ADDR, reg, 1, true);  //发送按键状态寄存器地址
            while (I2Cdrv->GetStatus().busy);
            I2Cdrv->MasterReceive (Temper_I2C_ADDR, &reg[1], 1, false);  //获取按键状态
            while (I2Cdrv->GetStatus().busy);
            swap[1]=reg[1];
           
           
                    if(swap[0]&&8==1)//是负数
                    {
                            swap[0] =~swap[0];
                            swap[1] = ~swap[1];
                            temp[1]=-1*(swap[0]+((swap[1]>>5) +1)*0.125f);//只有高三位有效
                    }
            else//是正数
                    {
                            temp[1]=swap[0]+(swap[1]>>5)*0.125f;//只有高三位有效
                    }
                   
                   
            //读取LCS
            reg[0]=Temper_LCS;
            I2Cdrv->MasterTransmit (Temper_I2C_ADDR, reg, 1, true);  //发送按键状态寄存器地址
            while (I2Cdrv->GetStatus().busy);
            I2Cdrv->MasterReceive (Temper_I2C_ADDR, &reg[1], 1, false);  //获取按键状态
            while (I2Cdrv->GetStatus().busy);
            swap[0]=reg[1];
           
            if(swap[0]&&8==1)//是负数
                    {
                            swap[0] =~swap[0];

                            temp[2]=-1*(swap[0]+1);
                    }
            else//是正数
                    {
                            temp[2]=swap[0];
                    }
                   
                   
                    //读取RCS
            reg[0]=Temper_RCS;
            I2Cdrv->MasterTransmit (Temper_I2C_ADDR, reg, 1, true);  //发送按键状态寄存器地址
            while (I2Cdrv->GetStatus().busy);
            I2Cdrv->MasterReceive (Temper_I2C_ADDR, &reg[1], 1, false);  //获取按键状态
            while (I2Cdrv->GetStatus().busy);
            swap[0]=reg[1];
           
            if(swap[0]&&8==1)//是负数
                    {
                            swap[0] =~swap[0];
                            temp[3]=-1*(swap[0]+1);
                    }
            else//是正数
                    {
                            temp[3]=swap[0];
                    }
                   
            return ;
    }



    (1)注意实际读取的数据是有符号的,要做符号位判定  。
    (2)小数部分只有高三位有效,进行5次右移
      (3)读取rcs lcs 进行上电验证

    5 实际效果如下:

      远端用嘴加热 哈啊哈。。。。。。。。
    3.gif











    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-7-4 19:10
  • 签到天数: 92 天

    [LV.6]常住居民II

    15

    主题

    222

    帖子

    23

    高级会员

    Rank: 4

    积分
    640
    最后登录
    2023-8-6
     楼主| 发表于 2019-3-15 23:12:13 | 显示全部楼层
    忘了贴 宏定义
    #define Temper_I2C_ADDR                     0x96>>1

    #define Local_Temp_High        0x00                //LTHB
    #define Local_Temp_Low                                 0x22   //LTLB         MSB(3)有效

    #define Remote_Temp_High       0x01                //RTHB
    #define Remote_Temp_Low        0x10   //RTLB        MSB(3)有效


    #define Temper_RCS             0x19    //8位
    #define Temper_LCS             0x20                //8位
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32024
    最后登录
    2024-4-25
    发表于 2019-3-16 11:21:34 | 显示全部楼层
    谢谢分享
    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 05:57 , Processed in 0.119121 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表