TMP117 STM32 HAL 硬件IIC驱动。

STM32CUBEMX IIC配置,麻烦自行网上查找资料,IIC CLK速率:400KHZ
发出来,方便大家使用。减少造轮子工作。

C文件

#define TMP117_IIC_ADDR_R  0x91 ///TM117的地址
#define TMP117_IIC_ADDR_W  0x90  ///写

#define TMP117_REG_SIZE  2  //16BIT=2X8BYE

#define TMP117_IIC_PORT  hi2c1
#define TMP117_RESOLUTION       (float)0.0078125  ///TM117的分辨率

/* pointer registers ----- */
// name			 										address		description
#define TMP117_TEMP_RES_REG 		0x00			// temperature result register		    R	
#define TMP117_CONFIG_REG		    0x01			// configuration register				R/W		
#define TMP117_THIGH_LIM_REG		0x02			// temperature high limit register		R/W                
#define TMP117_TLOW_LIM_REG			0x03			// temperature low limit register		R/W    
#define TMP117_EEPROM_UL_REG		0x04			// EEPROM unlock register	    R/W    
#define TMP117_EEPROM1_REG			0x05			// EEPROM1 register				R/W            
#define TMP117_EEPROM2_REG			0x06			// EEPROM2 register				R/W    
#define TMP117_TEMP_OFFSET_REG	    0x07			// temperature offset register	R/W                 
#define TMP117_EEPROM3_REG			0x08			// EEPROM3 register	
#define TMP117_DEVICE_ID_REG		0x0F			// device ID register		R   

///每个寄存器都是2个字节
bool Tm117_Write_2byte( uint8_t reg_addr, uint16_t cmd )
{
    HAL_StatusTypeDef ret;

    uint8_t temp[TMP117_REG_SIZE + 1] = {0X00, 0X00};

    temp[2] = ( uint8_t )cmd;
    temp[1] = ( uint8_t )( cmd >> 8 );
    temp[0] = reg_addr;

    ret = HAL_I2C_Master_Transmit( &TMP117_IIC_PORT, TMP117_IIC_ADDR_W, temp, 3, HAL_MAX_DELAY );
    if ( ret != HAL_OK )
    {
        DBG_PRINTF( "Error Tx I2C\r\n" );
        return false;
    }
    return true;
}


bool Tm117_Read_2byte( uint8_t reg_addr, uint16_t* reg_value )
{
    HAL_StatusTypeDef ret;																			// return status of i2c

    uint8_t buffer[2];

    buffer[0] = reg_addr;

    ///
    ret = HAL_I2C_Master_Transmit( &TMP117_IIC_PORT, TMP117_IIC_ADDR_W, buffer, 1, HAL_MAX_DELAY );
    if ( ret != HAL_OK )
    {
        DBG_PRINTF( "Error Tx I2C\r\n" );
        return false;
    }

    ///
    ret = HAL_I2C_Master_Receive( &TMP117_IIC_PORT, TMP117_IIC_ADDR_R, buffer, 2, HAL_MAX_DELAY );
    if ( ret != HAL_OK )
    {
        DBG_PRINTF( "Error Rx I2C\r\n" );
        return false;
    }

    ///转换成温度数据
    *reg_value = ( buffer[0] << 8 ) | buffer[1];
    return true;

}

///TMP117返回直接是补码形式,直接定义一个有符号的整形数量int16_t
bool Tm117_Read_Temp_Reg_Value( int16_t* reg_value )
{
    HAL_StatusTypeDef ret;																			// return status of i2c

    uint8_t buffer[2];

    buffer[0] = TMP117_TEMP_RES_REG;

    ///先写要读取的寄存器地址
    ret = HAL_I2C_Master_Transmit( &TMP117_IIC_PORT, TMP117_IIC_ADDR_W, buffer, 1, HAL_MAX_DELAY );
    if ( ret != HAL_OK )
    {
        DBG_PRINTF( "Error Tx I2C\r\n" );
        return false;
    }

    ///
    ret = HAL_I2C_Master_Receive( &TMP117_IIC_PORT, TMP117_IIC_ADDR_R, buffer, 2, HAL_MAX_DELAY );
    if ( ret != HAL_OK )
    {
        DBG_PRINTF( "Error Rx I2C\r\n" );
        return false;
    }

    ///转换成温度数据
    *reg_value = ( buffer[0] << 8 ) | buffer[1];
    return true;

}




void Tmp117_Init( void )
{
    Tm117_Write_2byte( TMP117_CONFIG_REG, 0x0220 );     //设置
    Tm117_Write_2byte( TMP117_TEMP_OFFSET_REG, 0x0000 ); //设置温度偏移量
    ///Tm117_Write_2byte(0x00, 0x00);   //设置解锁EEPROM
}

///NJSG
void Code_Junction_Temperature_Measurement( void )
{
    ///uint16_t val;
    int16_t temp_reg_val=0;
    int16_t temp_int16;
    float tempe_float=0.0;

    Tm117_Read_Temp_Reg_Value(&temp_reg_val ); ///到得带符号的整形数量
    
    tempe_float=(float)temp_reg_val; ///强制转换成浮点数 
    tempe_float=10*tempe_float*TMP117_RESOLUTION; ///只要小数点1位 得到环境温度 X10倍
    temp_int16=(int16_t)(tempe_float);  ///只保留整数,不要小数
    
    tempe_float=(float)(temp_int16); ///重新转为浮点数
    SensorData.code_temperature=(tempe_float/10);  ///转成真实浮点温度,只有一位小数点
    
//    sprintf ( string_temp, "TMP117 temper:%f\r\n", WorkPamData.code_temperature ); //和软件保持一致,显示为0.01精度
//    DBG_PRINTF( string_temp );
}

运行效果,得到温度数据。
在这里插入图片描述

使用时更换TMP117_IIC_PORT 对应 的IIC端口即可。调用 Code_Junction_Temperature_Measurement读取。sprintf DBG_PRINTF 函数可以换成用户自己的UART打印功能函数。
不用怀疑代码,如果没有数据,请先查硬件。还是那句话,如果硬件是正常的,代码运行不了,来汇智科技园扇我脸。
南京栖霞区附近周边的 也可以带硬件来查问题。(下班后来,QQ:449038848) 也接外包。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值