/*
* ======== TMP117.h ========
* TMP117 C Interface
*/
#ifndef ti_sensors_TMP117__include
#define ti_sensors_TMP117__include 1
#include <stdint.h>
/* support C++ sources */
#ifdef __cplusplus
extern "C" {
#endif
#define TMP117_TEMP 0x00U //register。温度寄存器地址。
//只读寄存器,用于存储最近一次转换的输出。一个LSB等于7.8125m℃,二进制补码格式表示。
#define TMP117_CONFIG 0x01U //register。配置寄存器地址。
#define TMP117_CONFIG_ALERT_HIGH_ENABLE 0x8000U //配置寄存器,bit15,开启上限警报。
#define TMP117_CONFIG_ALERT_HIGH_DISABLE 0x0000U //配置寄存器,bit15,关闭上限警报。
#define TMP117_CONFIG_ALERT_LOW_ENABLE 0x4000U //配置寄存器,bit14,开启下限警报。
#define TMP117_CONFIG_ALERT_LOW_DISABLE 0x0000U //配置寄存器,bit14,关闭下限警报,热模式下始终设为0。
#define TMP117_CONFIG_CONV_RDY_ENABLE 0x2000U //配置寄存器,bit13,数据转换完毕。
#define TMP117_CONFIG_CONV_RDY_DISABLE 0x0000U //配置寄存器,bit13,读取完毕清零/未转换完,已就绪。
#define TMP117_CONFIG_EEPROM_BUSY_ENABLE 0x1000U //配置寄存器,bit12,eeprom忙碌中。
#define TMP117_CONFIG_EEPROM_BUSY_DISABLE 0x0000U //配置寄存器,bit12,eeprom空闲中。
#define TMP117_CONFIG_CONV_MODE_CC 0x0000U //配置寄存器,bit11:10,连续转换模式。
#define TMP117_CONFIG_CONV_MODE_SD 0x0400U //配置寄存器,bit11:10,关断模式,进入低功耗。
#define TMP117_OS_ENABLE 0x0C00U //配置寄存器,bit11:10:设置转换模式为单稳态转换(OS)
#define TMP117_CONFIG_CONV_CYCLE_15p5ms 0x0000U //配置寄存器,bit9:7,转换周期位。15.5ms/125ms/500ms/1S转换周期,具体时间还与转换均值计算模式有关。
#define TMP117_CONFIG_CONV_CYCLE_125ms 0x0080U //配置寄存器,bit9:7,转换周期位,125ms/500ms/1S转换周期,具体时间还与转换均值计算模式有关。
#define TMP117_CONFIG_CONV_CYCLE_250ms 0x0100U //配置寄存器,bit9:7,转换周期位,250ms/500ms/1S转换周期,具体时间还与转换均值计算模式有关。
#define TMP117_CONFIG_CONV_CYCLE_500ms 0x0180U //配置寄存器,bit9:7,转换周期位,500ms/1S转换周期,具体时间还与转换均值计算模式有关。
#define TMP117_CONFIG_CONV_CYCLE_1s 0x0200U //配置寄存器,bit9:7,转换周期位,1S转换周期。
#define TMP117_CONFIG_CONV_CYCLE_4s 0x0280U //配置寄存器,bit9:7,转换周期位,4S转换周期。
#define TMP117_CONFIG_CONV_CYCLE_8s 0x0300U //配置寄存器,bit9:7,转换周期位,8S转换周期。
#define TMP117_CONFIG_CONV_CYCLE_16s 0x0380U //配置寄存器,bit9:7,转换周期位,16S转换周期。
#define TMP117_CONFIG_AVG_MODE_NONE 0x0000U //配置寄存器,bit6:5,转换均值计算模式。不进行均值计算。
#define TMP117_CONFIG_AVG_MODE_8AVG 0x0020U //配置寄存器,bit6:5,转换均值计算模式。8次转换取平均值输出到温度寄存器。建议值。
#define TMP117_CONFIG_AVG_MODE_32AVG 0x0040U //配置寄存器,bit6:5,转换均值计算模式。32次转换取平均值输出到温度寄存器。
#define TMP117_CONFIG_AVG_MODE_64AVG 0x0060U //配置寄存器,bit6:5,转换均值计算模式。64次转换取平均值输出到温度寄存器。
#define TMP117_CONFIG_TnA_ALERT 0x0000U //配置寄存器,bit4,热/警报模式选择,警报模式。开启高低温警报。
#define TMP117_CONFIG_TnA_THERM 0x0010U //配置寄存器,bit4,热/警报模式选择,热模式。仅开启高温警报。
#define TMP117_CONFIG_ALERT_POL_LOW 0x0000U //配置寄存器,bit3,alert引脚极性位,设置为低电平有效。
#define TMP117_CONFIG_ALERT_POL_HIGH 0x0008U //配置寄存器,bit3,alert引脚极性位,设置为高电平有效。
#define TMP117_CONFIG_CRDY_EN_ALERT 0x0000U //配置寄存器,bit2,alert引脚选择位,设置为alert引脚反映警报标志的状态。
#define TMP117_CONFIG_CRDY_EN_DRDY 0x0004U //配置寄存器,bit2,alert引脚选择位,位置为alert引脚反映数据就绪标志的状态。
#define TMP117_CONFIG_SOFT_RESET_ENABLE 0x0002U //配置寄存器,bit1,软件复位位,设置为1,它会触发持续2ms的软件复位,此为讲始终读回0。
#define TMP117_CONFIG_SOFT_RESET_DISABLE 0x0000U //配置寄存器,bit1,禁止复位/已完成复位。
#define TMP117_CONFIG_Reserved_ENABLE 0x0001U //配置寄存器,bit0,reserved。
#define TMP117_CONFIG_Reserved_DISABLE 0x0000U //配置寄存器,bit0,reserved。
#define TMP117_THIGH 0x02U //register.alert上限寄存器地址。用于存储与温度结果相比较的上限。
//负数用二进制补码表示,上电后,上限寄存器会加载来自EEPROM的存储值。出厂默认复位值为6000H。
#define TMP117_TLOW 0x03U //register.alert下限寄存器地址。用于存储与温度结果相比较的下限。
//负数用二进制补码表示,上电后,上限寄存器会加载来自EEPROM的存储值。出厂默认复位值为8000H。
#define TMP117_EEPROM 0x04U //register.eeprom解锁寄存器地址。
#define TMP117_EEPROM_EUN_ENABLE 0x8000U //register.bit15,eeprom已就绪,eeprom已解锁,可以编程。
#define TMP117_EEPROM_EUN_DISABLE 0x0000U //register.bit15,eeprom未就绪,eeprom已锁定,禁止编程。
#define TMP117_EEPROM_EEPROM_BUSY_ENABLE 0x4000U //register.bit14,eeprom忙碌中。
#define TMP117_EEPROM_EEPROM_BUSY_DISABLE 0x0000U //register.bit14,eeprom空闲中,已就绪,可以随时接收新命令。
#define TMP117_EEPROM1 0x05U //register.eeprom1寄存器地址。这个 16 位寄存器可用作暂存区,
//为支持 NIST 可追溯性,请勿删除此寄存器或对其进行重新编程。
#define TMP117_EEPROM2 0x06U //register.eeprom2寄存器地址。这个 16 位寄存器可用作暂存区。
#define TMP117_EEPROM3 0x08U //register.eeprom3寄存器地址。这个 16 位寄存器可用作暂存区,
//为支持 NIST 可追溯性,请勿删除此寄存器或对其进行重新编程。
#define TMP117_OFFSET_TEMP 0x07U //register.offset温度寄存器地址。来自系统校准的温度偏移数据。
#define TMP117_ID 0x0FU //register.id寄存器地址。只读寄存器。temp117 ID。
#define TMP117_ADD0_TO_GND 0x48U//不包含读写位(低电平写),实际使用中,地址左移一位,然后最低位用于指示读写位。
#define TMP117_ADD1_TO_VCC 0x49U
#define TMP117_ADD2_TO_SDA 0x4AU
#define TMP117_ADD3_TO_SCL 0x4BU
/*
* ======== TMP117_State ========
* Initial configuration state for a TMP117 sensor
*/
typedef struct TMP117_State {
uint16_t config; /* CONFIG register */
uint16_t thigh; /* THIGH and TLOW limit registers */
uint16_t tlow;
uint16_t offsetTemp; /* OFFSET_TEMP register */
uint16_t eeprom1; /* EEPROMx registers */
uint16_t eeprom2;
uint16_t eeprom3;
uint8_t busId; /* I2C bus id */
uint8_t devAddr; /* TMP117 sensor address on the I2C bus */
uint8_t nvmCommit; /* 1 => save settings to EEPROM, 0 => don't */
uint8_t preserveNIST; /* 1 => don't overwrite NIST date, 0 => allow overwrite */
uint32_t osWait; /* One shot conversion time (in ms) */
uint16_t device_id; /*register value*/
int32_t raw_temperature; /*register value*/
int32_t temperature; /*convert value,Data amplification 10,000,000 times*/
} TMP117_State;
/*
* ======== TMP117_Handle ========
* First argument to all TMP117 methods
*/
typedef TMP117_State *TMP117_Handle;
static inline uint8_t TMP17_READ_OPERATE(uint8_t devAddr)
{
return ((devAddr << 1)|0x01);
}
static inline uint8_t TMP17_WRITE_OPERATE(uint8_t devAddr)
{
return ((devAddr << 1)&0xfe);
}
/**
* @brief 配置tmp11x
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
extern uint8_t tmp11x_config(TMP117_Handle sensor);
/**
* @brief 如果配置是单次测量,调用此函数触发单次测量。
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
extern uint8_t tmp11x_one_shot_measure_temperature(TMP117_Handle sensor);
/**
* @brief 读取测量温度结果。
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
extern uint8_t tmp11x_read_current_temperature(TMP117_Handle sensor);
/**
* @brief 读取设备id和版本。
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
extern uint8_t tmp11x_read_device_id(TMP117_Handle sensor);
/*
* ======== TMP117_toIntCelsius ========
* Convert raw temperature register value to whole degrees Celsius
*
* This function rounds values to the nearest integer.
*
* @param raw 32-bit sign extended temperature value read from the
* sensor's read function: TMP117_read()
* @returns signed 32-bit integer representation of temperature in
* degrees Celsius, rounded to the nearest whole number
* @see TMP117_read
*/
extern int32_t TMP117_toIntCelsius(int32_t raw);
/*
* ======== TMP117_toMilliCelsius ========
* Convert raw field temperature to whole milli-degrees Celsius
*
* This function truncates rather than rounds values.
*
* @param raw 32-bit sign extended temperature value read from the
* sensor's read function: TMP117_read()
* @returns signed 32-bit integer representation of temperature in
* milli-degrees Celsius
* @see TMP117_read
*/
extern int32_t TMP117_toMilliCelsius(int32_t raw);
/*
* ======== TMP117_toFloatCelsius ========
* Convert raw temperature value to fractional degrees Celsius
*
* @param raw 32-bit sign extended temperature value read from the
* sensor's read function: TMP117_read()
* @returns floating point representation of temperature in degrees
* Celsius
* @see TMP117_read
*/
extern float TMP117_toFloatCelsius(int32_t raw);
/* support C++ sources */
#ifdef __cplusplus
}
#endif
#endif
/*
* ======== TMP117.c ========
* TMP117 APIs for initialization and use of the TMP117 peripheral
*
* DO NOT EDIT - This file is generated by the SysConfig tool for
* the TI Sensors in this application.
*/
//feature:
//temperature Accuracy:
// -20 Celsius to 50 Celsius range with ±0.1 degree Celsius(maximum).
// -40 Celsius to 70 Celsius range with ±0.15 degree Celsius(maximum).
// -40 Celsius to 100 Celsius range with ±0.2 degree Celsius(maximum).
// -55 Celsius to 125 Celsius range with ±0.25 degree Celsius(maximum).
// -55 Celsius to 150 Celsius range with ±0.3 degree Celsius(maximum).
//
//temreapture 16bit resolution: 0.0078125 degree Celsius (1LSB).
//
//
#include "temp117.h"
#include "../IIC/user_IIC.h"
#define MSB(u16) (((u16) & 0xFF00U) >> 8)
#define LSB(u16) ((u16) & 0xFFU)
/*
* @brief lock EEPROM, disable write eeprom。
* @create April 1,2024
* @parameter sensor: TMP117 config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
static uint8_t tmp11x_lock(TMP117_Handle sensor)
{
uint8_t txBuf[3];
/* EEPROM_Unlock Register Write to Lock the NVM */
txBuf[0] = TMP117_EEPROM; //解锁寄存器地址。
txBuf[1] = MSB(TMP117_EEPROM_EUN_DISABLE);//数据高8位。禁止写EEPROM。
txBuf[2] = LSB(TMP117_EEPROM_EUN_DISABLE);//数据低8位。禁止写EEPROM。
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_WRITE_OPERATE(sensor->devAddr));//写入地址访问目标设备。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(txBuf);i++)
{
IIC_Write_Byte(txBuf[i]);
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 2;
}
}
IIC_Stop();//停止信号。
return 0;
}
/*
* @brief unlock eeprom。
* @create April 1,2024
* @parameter sensor:TMP117 config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
static uint8_t tmp11x_unlock(TMP117_Handle sensor)
{
uint8_t txBuf[3];
txBuf[0] = TMP117_EEPROM;//解锁寄存器地址。
txBuf[1] = MSB(TMP117_EEPROM_EUN_ENABLE);//EEPROM解锁,数据高8位。
txBuf[2] = LSB(TMP117_EEPROM_EUN_ENABLE);//EEPROM解锁,数据低八位。
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_WRITE_OPERATE(sensor->devAddr));//写入地址访问目标设备。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(txBuf);i++)
{
IIC_Write_Byte(txBuf[i]);
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 2;
}
}
IIC_Stop();//停止信号。
return 0;
}
/*
* @brief tmp11x is busy?
* @create April 1,2024
* @parameter sensor: TMP117 config
* @return 0:idel.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
* TMP117_EEPROM_EEPROM_BUSY_ENABLE:busy.
*/
static uint8_t tmp11x_busy(TMP117_Handle sensor)
{
uint8_t txBuf[1];//解锁寄存器地址。
uint8_t rxBuf[2];//从解锁寄存器读取数据。
rxBuf[0] = MSB(TMP117_EEPROM_EEPROM_BUSY_ENABLE);
txBuf[0] = TMP117_EEPROM;//把需要操作的寄存器放入指针寄存器,以便稍后读取该寄存器存储的数据。
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_WRITE_OPERATE(sensor->devAddr));//写入地址访问目标设备,写操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(txBuf);i++)
{
IIC_Write_Byte(txBuf[i]);
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 2;
}
}
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_READ_OPERATE(sensor->devAddr));//写入地址访问目标设备,读操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(rxBuf);)
{
rxBuf[i]=IIC_Read_Byte();
i++;
if(i < sizeof(rxBuf))
{
IIC_Send_Respons(IIC_ACK);
}
else
{
IIC_Send_Respons(IIC_NACK);
}
}
IIC_Stop();//停止信号。
return rxBuf[0]&MSB(TMP117_EEPROM_EEPROM_BUSY_ENABLE);
}
/**
* @brief 写tmp11x 寄存器。
* @create April 2,2024
* @parameter sensor: tmp117 config
* @parameter register_address
* @parameter write value for register.
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
static uint8_t tmp11x_write_register(TMP117_Handle sensor,
uint8_t register_address,
uint16_t value)
{
uint8_t txBuf[3];
txBuf[0] = register_address;
txBuf[1] = MSB(value);
txBuf[2] = LSB(value);
IIC_Start();
IIC_Write_Byte(TMP17_WRITE_OPERATE(sensor->devAddr));//写入地址访问目标设备,写操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(txBuf);i++)
{
IIC_Write_Byte(txBuf[i]);
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 2;
}
}
IIC_Stop();//停止信号。
return 0;
}
/**
* @brief software reset tmp11x sensor
* @create April 2,2024
* @parameter sensor : tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
static uint8_t tmp11x_software_reset(TMP117_Handle sensor)
{
uint8_t txBuf[3];
txBuf[0] = TMP117_CONFIG;
txBuf[1] = MSB(TMP117_CONFIG_SOFT_RESET_ENABLE);
txBuf[2] = LSB(TMP117_CONFIG_SOFT_RESET_ENABLE);
IIC_Start();
IIC_Write_Byte(TMP17_WRITE_OPERATE(sensor->devAddr));//写入地址访问目标设备,写操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(txBuf);i++)
{
IIC_Write_Byte(txBuf[i]);
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 2;
}
}
IIC_Stop();//停止信号。
return 0;
}
/**
* @brief 配置tmp11x
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
uint8_t tmp11x_config(TMP117_Handle sensor)
{
uint8_t state = 0;
sensor->raw_temperature = 0;
sensor->temperature = 0;
Initialize_IIC_BUS();
state = tmp11x_busy(sensor);
if(state)
{
return state;
}
if(sensor->nvmCommit)
{
state = tmp11x_unlock(sensor);
}
if(state)
{
return state;
}
/* High Limit Register Write */
state = tmp11x_write_register(sensor, TMP117_THIGH, sensor->thigh);
if(state)
{
return state;
}
/* Low Limit Register Write */
state = tmp11x_write_register(sensor, TMP117_TLOW, sensor->tlow);
if(state)
{
return state;
}
/* Temperature Offset Register Write */
state = tmp11x_write_register(sensor, TMP117_OFFSET_TEMP, sensor->offsetTemp);
if(state)
{
return state;
}
if(!sensor->preserveNIST)
{
/* EEPROMx Registers Write */
state = tmp11x_write_register(sensor, TMP117_EEPROM1, sensor->eeprom1);
if(state)
{
return state;
}
state = tmp11x_write_register(sensor, TMP117_EEPROM2, sensor->eeprom2);
if(state)
{
return state;
}
state = tmp11x_write_register(sensor, TMP117_EEPROM3, sensor->eeprom3);
if(state)
{
return state;
}
}
/* Configuration Register Write */
/* Ensure SOFT_RESET isn't set - otherwise CONFIG setting won't work */
state = tmp11x_write_register(sensor, TMP117_CONFIG, sensor->config & (~TMP117_CONFIG_SOFT_RESET_ENABLE));
if(state)
{
return state;
}
/* lock EEPROM to ensure it's no longer writeable */
if (sensor->config & TMP117_CONFIG_SOFT_RESET_ENABLE)
{
state = tmp11x_software_reset(sensor); /* reset also locks EEPROM */
}
else
{
state = tmp11x_lock(sensor);
}
return state;
}
/**
* @brief 如果配置是单次测量,调用此函数触发单次测量。
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
uint8_t tmp11x_one_shot_measure_temperature(TMP117_Handle sensor)
{
//uint8_t txBuf[3];
uint8_t state = 0;
/* If needed, trigger one shot measurement */
if (sensor->config & TMP117_CONFIG_CONV_MODE_SD)
{
/* Reset one-shot enable */
//txBuf[0] = TMP117_CONFIG;
//txBuf[1] = MSB(sensor->config | TMP117_OS_ENABLE);
//txBuf[2] = LSB(sensor->config);
uint16_t value = sensor->config | TMP117_OS_ENABLE;
state = tmp11x_write_register(sensor,TMP117_CONFIG,value);
return state;
}
return 0xff;
}
/**
* @brief 读取测量温度结果。
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
uint8_t tmp11x_read_current_temperature(TMP117_Handle sensor)
{
uint8_t txBuf[1];
uint8_t rxBuf[2] = {0};
/* Temperature Register Read */
txBuf[0] = TMP117_TEMP;
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_WRITE_OPERATE(sensor->devAddr));//写入地址访问目标设备,写操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(txBuf);i++)
{
IIC_Write_Byte(txBuf[i]);
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 2;
}
}
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_READ_OPERATE(sensor->devAddr));//写入地址访问目标设备,读操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(rxBuf);)
{
rxBuf[i]=IIC_Read_Byte();
i++;
if(i < sizeof(rxBuf))
{
IIC_Send_Respons(IIC_ACK);
}
else
{
IIC_Send_Respons(IIC_NACK);
}
}
IIC_Stop();//停止信号。
/* Sign extend and combine */
sensor->raw_temperature = (((int32_t)(int8_t)rxBuf[0]) << 8) | rxBuf[1];
sensor->temperature = sensor->raw_temperature*78125;/*convert value,Data amplification 10,000,000 times*/
return 0;
}
/**
* @brief 读取设备id和版本。
* @create April 2,2024
* @parameter sensor: tmp11x config
* @return 0:success.
* 1:fail, nack for write devices address.
* 2:fail, nack for write data.
*/
uint8_t tmp11x_read_device_id(TMP117_Handle sensor)
{
uint8_t txBuf[1];
uint8_t rxBuf[2] = {0};
/* Temperature Register Read */
txBuf[0] = TMP117_ID;
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_WRITE_OPERATE(sensor->devAddr));//写入地址访问目标设备,写操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(txBuf);i++)
{
IIC_Write_Byte(txBuf[i]);
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 2;
}
}
IIC_Start();//起始信号。
IIC_Write_Byte(TMP17_READ_OPERATE(sensor->devAddr));//写入地址访问目标设备,读操作。
if(IIC_Receive_Respons())
{//如果没有应答信号,退出。
return 1;
}
for(uint8_t i=0;i<sizeof(rxBuf);)
{
rxBuf[i]=IIC_Read_Byte();
i++;
if(i < sizeof(rxBuf))
{
IIC_Send_Respons(IIC_ACK);
}
else
{
IIC_Send_Respons(IIC_NACK);
}
}
IIC_Stop();//停止信号。
/* Sign extend and combine */
sensor->device_id = (((uint16_t)rxBuf[0]) << 8) | rxBuf[1];
return 0;
}
/*
* ======== TMP117_toIntCelsius ========
* Convert raw temperature register value to degrees Celsius rounded to the
* nearest integer
*/
int32_t TMP117_toIntCelsius(int32_t x)
{
/* Optional: Add bias to round before the final truncation */
x += (x >= 0) ? (1 << 6) : -(1 << 6);
/* Convert Q7 value to whole number */
x /= 1 << 7; /* use division so small negative values round to 0 */
return x;
}
/*
* ======== TMP117_toMilliCelsius ========
* Convert raw temperature register value to milli-degrees Celsius
*/
int32_t TMP117_toMilliCelsius(int32_t x)
{
/* Scale to milli-degrees, convert Q7 value to a whole number */
return ((1000 * x) >> 7);
}
/*
* ======== TMP117_toFloatCelsius ========
* Convert raw temperature register value to degrees Celsius
*/
float TMP117_toFloatCelsius(int32_t x)
{
/* Convert Q7 value to a float */
return ((float)x * 0.0078125f);
}
//app.c
/*
* ======== TMP117_0 ========
* TMP117 Sensor configuration settings
*/
_attribute_data_retention_ static TMP117_State TMP117_0_state = {
.config = (TMP117_CONFIG_CONV_MODE_CC | /*连续转换模式*/ \
TMP117_CONFIG_CONV_CYCLE_1s | /*转换周期1S*/ \
TMP117_CONFIG_AVG_MODE_8AVG | /*8次转换取平均值*/ \
TMP117_CONFIG_TnA_ALERT | /*热模式,仅开启高温警报。*/ \
TMP117_CONFIG_ALERT_POL_LOW | /*alert引脚极性位,设置为低电平有效*/ \
TMP117_CONFIG_CRDY_EN_ALERT | /*设置为alert引脚反映警报标志的状态*/ \
TMP117_CONFIG_SOFT_RESET_DISABLE),//禁止复位/已完成复位
.thigh = 0x6000U, /* Alert High Limit is 192 Celsius */
.tlow = 0x8000U, /* Alert Low Limit is -256 Celsius */
.eeprom1 = 0x0000U,
.eeprom2 = 0x0000U,
.eeprom3 = 0x0000U,
.offsetTemp = 0x0000U,
/* Sensor's I2C bus ID and address */
.busId = 0,
.devAddr = TMP117_ADD0_TO_GND,
/* nonvolatile save mode for TMP117_0 registers */
.nvmCommit = 0, /* don't save registers to EEPROM */
/* preserve factory EEPROM NIST traceability data */
.preserveNIST = 1, /* 1 => never overwrite NIST data, 0 => allow overwrite */
.device_id = 0,
/* one-shot delay time (ms) */
.osWait = 125
};
const TMP117_Handle TMP117_0 = &TMP117_0_state;
/*
* ======== TMP117_1 ========
* TMP117 Sensor configuration settings
*/
_attribute_data_retention_ static TMP117_State TMP117_1_state = {
.config = (TMP117_CONFIG_CONV_MODE_CC | /*连续转换模式*/ \
TMP117_CONFIG_CONV_CYCLE_1s | /*转换周期1S*/ \
TMP117_CONFIG_AVG_MODE_8AVG | /*8次转换取平均值*/ \
TMP117_CONFIG_TnA_ALERT | /*热模式,仅开启高温警报。*/ \
TMP117_CONFIG_ALERT_POL_LOW | /*alert引脚极性位,设置为低电平有效*/ \
TMP117_CONFIG_CRDY_EN_ALERT | /*设置为alert引脚反映警报标志的状态*/ \
TMP117_CONFIG_SOFT_RESET_DISABLE),//禁止复位/已完成复位
.thigh = 0x6000U, /* Alert High Limit is 192 Celsius */
.tlow = 0x8000U, /* Alert Low Limit is -256 Celsius */
.eeprom1 = 0x0000U,
.eeprom2 = 0x0000U,
.eeprom3 = 0x0000U,
.offsetTemp = 0x0000U,
/* Sensor's I2C bus ID and address */
.busId = 0,
.devAddr = TMP117_ADD1_TO_VCC,
/* nonvolatile save mode for TMP117_0 registers */
.nvmCommit = 0, /* don't save registers to EEPROM */
/* preserve factory EEPROM NIST traceability data */
.preserveNIST = 1, /* 1 => never overwrite NIST data, 0 => allow overwrite */
.device_id = 0,
/* one-shot delay time (ms) */
.osWait = 125
};
const TMP117_Handle TMP117_1 = &TMP117_1_state;
_attribute_data_retention_ static uint32_t printf_tick = 0;
_attribute_data_retention_ static uint32_t read_tick = 0;
_attribute_data_retention_ static uint32_t config_flag = 0;
_attribute_data_retention_ static int32_t sensor0_previous_temperature = 0x8000000;
_attribute_data_retention_ static int32_t sensor1_previous_temperature = 0x8000000;
if(clock_time_exceed(printf_tick, 1000000)&&(config_flag<1))
{1S初始化。
printf_tick = clock_time();
config_flag++;
uint8_t state = 0;
state = tmp11x_config(TMP117_0);
if(!state)
{
printf("SenSor0:InitializeSucceed,");
state = tmp11x_read_device_id(TMP117_0);
if(!state)
{
printf("ReadDeviceIdSuccess,Id:%x\n",TMP117_0->device_id);
}
else
{
printf("InitializeFailed,State:%x\n",state);
}
}
else
{
printf("SenSor0InitializeFailed,State:%x\n",state);
}
state = tmp11x_config(TMP117_1);
if(!state)
{
printf("SenSor1:InitializeSucceed,");
state = tmp11x_read_device_id(TMP117_1);
if(!state)
{
printf("ReadDeviceIdSuccess,Id:%x\n",TMP117_1->device_id);
}
else
{
printf("InitializeFailed,State:%x\n",state);
}
}
else
{
printf("SenSor1InitializeFailed,State:%x\n",state);
}
}
if(clock_time_exceed(read_tick, 1100000)&&(config_flag>=1))
{//读取间隔1.1S
read_tick = clock_time();
uint8_t state = 0;
if(TMP117_0->device_id)
{//如果设备完成初始化。
state = tmp11x_read_current_temperature(TMP117_0);
if(state == 0)
{//如果数据读取ok。
int32_t difference_value = 100;
if( sensor0_previous_temperature != 0x8000000)
{
TMP117_0->temperature = ((int64_t)sensor0_previous_temperature + TMP117_0->temperature)>>1;
if(TMP117_0->temperature >= sensor0_previous_temperature)
{//如果变化趋势是更高温度或者不变。
difference_value = TMP117_0->temperature - sensor0_previous_temperature;
if(difference_value/100000)
{//如果温度变化超过+0.01
printf("ST0:Reg:%d,State:%x,%d.%d%d%d%d%d%d%dCelsius,Change:%d.%d%d%d%d%d%d%d\n",
TMP117_0->raw_temperature,state,
TMP117_0->temperature/10000000,
TMP117_0->temperature/1000000%10,
TMP117_0->temperature/100000%10,
TMP117_0->temperature/10000%10,
TMP117_0->temperature/1000%10,
TMP117_0->temperature/100%10,
TMP117_0->temperature/10%10,
TMP117_0->temperature%10,
difference_value/10000000,
difference_value/1000000%10,
difference_value/100000%10,
difference_value/10000%10,
difference_value/1000%10,
difference_value/100%10,
difference_value/10%10,
difference_value%10
);
#if(DEBUG_INTERFACE_TO_GATT)
server_send_debug_test_temperature_to_client(TMP117_0->temperature/100000);
#endif
}
}
else
{//如果温度是下降的趋势。
difference_value = sensor0_previous_temperature - TMP117_0->temperature;
if(difference_value/100000)
{//如果温度变化超过0.01
printf("ST0:Reg:%d,State:%x,%d.%d%d%d%d%d%d%dCelsius,Change:-%d.%d%d%d%d%d%d%d\n",
TMP117_0->raw_temperature,state,
TMP117_0->temperature/10000000,
TMP117_0->temperature/1000000%10,
TMP117_0->temperature/100000%10,
TMP117_0->temperature/10000%10,
TMP117_0->temperature/1000%10,
TMP117_0->temperature/100%10,
TMP117_0->temperature/10%10,
TMP117_0->temperature%10,
difference_value/10000000,
difference_value/1000000%10,
difference_value/100000%10,
difference_value/10000%10,
difference_value/1000%10,
difference_value/100%10,
difference_value/10%10,
difference_value%10
);
#if(DEBUG_INTERFACE_TO_GATT)
server_send_debug_test_temperature_to_client(TMP117_0->temperature/100000);
#endif
}
}//endl else
}//endl if(TMP117_0->temperature >= sensor0_previous_temperature)
else
{
#if(DEBUG_INTERFACE_TO_GATT)
server_send_debug_test_temperature_to_client(TMP117_0->temperature/100000);
#endif
}
sensor0_previous_temperature = TMP117_0->temperature;
}
else
{
printf("ST0:get temperature failed:%x\n",state);
}
}
if(TMP117_1->device_id)
{
state = tmp11x_read_current_temperature(TMP117_1);
if(state == 0)
{
int32_t difference_value = 100;
if( sensor1_previous_temperature != 0x8000000)
{
TMP117_0->temperature = ((int64_t)sensor0_previous_temperature + TMP117_0->temperature)>>1;
if(TMP117_1->temperature >= sensor1_previous_temperature)
{//如果变化趋势是更高温度或者不变。
difference_value = TMP117_1->temperature - sensor1_previous_temperature;
if(difference_value/100000)
{//如果温度变化超过+0.01
printf("ST1:Reg:%d,State:%x,%d.%d%d%d%d%d%d%dCelsius,Change:%d.%d%d%d%d%d%d%d%d\n",
TMP117_1->raw_temperature,state,
TMP117_1->temperature/10000000,
TMP117_1->temperature/1000000%10,
TMP117_1->temperature/100000%10,
TMP117_1->temperature/10000%10,
TMP117_1->temperature/1000%10,
TMP117_1->temperature/100%10,
TMP117_1->temperature/10%10,
TMP117_1->temperature%10,
difference_value/10000000,
difference_value/1000000%10,
difference_value/100000%10,
difference_value/10000%10,
difference_value/1000%10,
difference_value/100%10,
difference_value/10%10,
difference_value%10
);
#if(DEBUG_INTERFACE_TO_GATT)
server_send_debug_test_temperature2_to_client(TMP117_1->temperature/100000);
#endif
}
}
else
{//如果温度是下降的趋势。
difference_value = sensor1_previous_temperature - TMP117_1->temperature;
if(difference_value/100000)
{//如果温度变化超过0.01
printf("ST1:Reg:%d,State:%x,%d.%d%d%d%d%d%d%dCelsius,Change:-%d.%d%d%d%d%d%d%d\n",
TMP117_1->raw_temperature,state,
TMP117_1->temperature/10000000,
TMP117_1->temperature/1000000%10,
TMP117_1->temperature/100000%10,
TMP117_1->temperature/10000%10,
TMP117_1->temperature/1000%10,
TMP117_1->temperature/100%10,
TMP117_1->temperature/10%10,
TMP117_1->temperature%10,
difference_value/10000000,
difference_value/1000000%10,
difference_value/100000%10,
difference_value/10000%10,
difference_value/1000%10,
difference_value/100%10,
difference_value/10%10,
difference_value%10
);
#if(DEBUG_INTERFACE_TO_GATT)
server_send_debug_test_temperature2_to_client(TMP117_1->temperature/100000);
#endif
}
}//endl else
}//endl if(TMP117_0->temperature >= sensor0_previous_temperature)
else
{
#if(DEBUG_INTERFACE_TO_GATT)
server_send_debug_test_temperature2_to_client(TMP117_1->temperature/100000);
#endif
}
sensor1_previous_temperature = TMP117_1->temperature;
}
else
{
printf("ST1:get temperature failed:%x\n",state);
}
}
如果对tmp117临床医疗级温度传感器有兴趣可以扫码了解谢谢大家支持。