tmp117驱动程序

/*
 *  ======== 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临床医疗级温度传感器有兴趣可以扫码了解谢谢大家支持。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值