在线时间48 小时
UID1860622
注册时间2016-10-24
NXP金币0
TA的每日心情 | 擦汗 2023-7-4 19:10 |
---|
签到天数: 92 天 [LV.6]常住居民II
高级会员
- 积分
- 640
- 最后登录
- 2023-8-6
|
1.首先先看原理图
和前面坛友说的一样 实际板子的丝印和原理图不一致的 实际地址应该为0x96>>1; 同样挂载在iic0 上面
2.led 用于显示报警的 两个管脚为报警触发 会拉低电平 使led亮 具体可在相关寄存器进行配置
3.上图显示了实际上电了逻辑 rcs lcs 会被设置成85度 等会们实际读取验证下 。
远端 和内部的led值 都有11bit 组成 所以读取一次温度要读取两次Iic 才能得到
前面坛友得到的只是高位 小数部分没有读取
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, ®[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, ®[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, ®[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, ®[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, ®[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, ®[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 实际效果如下:
远端用嘴加热 哈啊哈。。。。。。。。
|
|