工程师 你们好!
最近在使用stm32单片机驱动tmp102温度传感器芯片,使用模拟I2C进行通信,获取的数据不对。以下是我的操作,请工程师们帮忙看下 我哪里配置不对。
1、主函数中1s循环获取温度数据
while(1)
{
tmp102_val = ReadTemp();
tmp102 = tmp102_val * 0.0625;
// tmp102_val = TMP112_CHANGE(tmp102_val);
printf("adc value: 0x%x\r\n",tmp102_val);
printf("tmprature: %.2f\r\n",tmp102);
WriteTmp102(0xE1); //触发温度采集中断
delay_ms(1000);
}
2、温度读写函数
#define TMP102_ADDR 0x90
#define TMP102_READ 0x00
#define TMP102_WRITE 0x01
#define TMP102_T_LOW 0x02
#define TMP102_T_HIGH 0x03
uint16_t ReadTemp(void)
{
uint8_t valh=0;
uint8_t vall=0;
uint16_t sum=0;
IIC_Start(); //启动I2C总线
IIC_Send_Byte(TMP102_ADDR); //发送器件从地址(写)
delay_us(1);
IIC_Send_Byte(TMP102_READ); //发送器件温度寄存器子地址
delay_us(1);
IIC_Stop();
IIC_Start();
IIC_Send_Byte(TMP102_ADDR+1); //发送器件从地址(读)
valh = IIC_Read_Byte(1); //读温度高位
vall = IIC_Read_Byte(0); //读温度低位
IIC_Stop();
sum |= valh;
sum <<= 8;
sum |= vall;
// sum >>= 4;
return sum;
}
//config:配置参数 0x61-常规 0xE1-唤醒单次转换
uint8_t WriteTmp102(unsigned char config)
{
IIC_Start();
IIC_Send_Byte(TMP102_ADDR); //发送器件从地址(写)
IIC_Send_Byte(TMP102_WRITE); //发送器件寄存器(配置)地址
IIC_Send_Byte(config); //配置寄存器的值 OS(0) R1(1) R0(1) F1(0) F0(0) POL(0) TM(0) SD(1)
// 比较模式,低保持
IIC_Send_Byte(0xA0); // CR1(1) CR0(0) AL(1) EM(0) 0 0 0 0 //4Hz
IIC_Stop();
return 0;
}
3、串口打印的数据 【此数据为原始数据,没有经过右移】
[22:17:44.496] tmprature: 223.94
[22:17:44.496]
[22:17:45.499] adc value: 0xdff
[22:17:45.499] tmprature: 223.94
[22:17:45.499]
[22:17:46.504] adc value: 0xdff
[22:17:46.504] tmprature: 223.94
[22:17:46.504]
[22:17:47.509] adc value: 0xdff
[22:17:47.509] tmprature: 223.94
[22:17:47.509]
[22:17:48.513] adc value: 0xdff
[22:17:48.513] tmprature: 223.94
[22:17:48.513]
[22:17:49.518] adc value: 0xdff
[22:17:49.518] tmprature: 223.94
[22:17:49.518]
Amy Luo:
回复 Dany W:
您好,
很高兴您的问题已经解决。