这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STEVAL-STWINKT1B】:结合STMcubeMX读取STTS751温

共1条 1/1 1 跳转至

【STEVAL-STWINKT1B】:结合STMcubeMX读取STTS751温度

高工
2026-03-29 10:41:02     打赏

一:STTS751温度基础知识

    STTS751是一款数字温度传感器,可通过兼容2线式SMBus2.0总线进行通信。该传感器能够以用户可配置的分辨率进行温度测量,分辨率范围介于9至12比特之间。在9比特模式下,最小步长为0.5°C,而在12比特模式下则为0.0625°C。在默认分辨率(10比特,0.25°C/LSB)下,转换时间大约为21毫秒。

    这种开漏式EVENT输出功能用于指示一种报警状态,即所测量的温度已超出用户预设的高限或跌至低限以下。当EVENT引脚被激活时,主机可通过使用SMBus警报响应地址(ARA)协议进行响应,而STTS751则会通过发送其从机地址来做出回应。

    STTS751是一款6针设备,支持用户可配置的从站地址。通过位于Addr/Therm引脚上的上拉电阻器,可以指定四种不同的从站地址之一。两个订货号(STTS751-0和STTS751-1)提供了两套不同的从站地址,使总可用数量增至八种。如此一来,最多可达八种设备可共享同一根2线SMBus信号线而不会产生歧义,从而便于对应用中的多个温度区域进行监测。两线接口可支持高达400kHz的传输速率。

二:STM32cube MX软件配置IIC

04-02 STTS751原理图.png

可见,模块通过IIC的方式与cpu相连,同样挂载在IIC2上面,只是模块地址不同,这样就可以和其他IIC设备共用一个IIC接口了。

三:配置如下所示:

    STTS751 的内部有一个寄存器指针,指向要操作的寄存器。读取温度前,必须先设置这个指针。

3.1:初始化与设置

  通信接口:使用 I2C 总线,速率可达 400kHz。

  从机地址:STTS751 的 7 位 I2C 地址取决于其 ADD0 引脚的连接方式,通常有两个可选地址(例如 0x39 和 0x38,具体需参考数据手册)。

3.2:设置寄存器指针 (SEND Byte 协议)

  这是读取数据前必不可少的一步,目的是告诉传感器接下来要读取哪个寄存器。

  起始条件:主控发起 I2C 通信开始。

  发送从机地址 + 写位:发送 STTS751 的 7 位地址,并将第 8 位(读/写位)设为 0,表示要进行写操作。

  发送寄存器地址:发送你想要读取的寄存器地址。温度寄存器的地址通常是 0x00。

  停止条件:主控发送停止信号。

3.3:读取温度数据 (RECEIVE Byte 协议)

  在完成寄存器指针设置后,即可读取温度值。

  起始条件:主控再次发起 I2C 通信。

  发送从机地址 + 读位:再次发送从机地址,但这次将读/写位设为 1,表示接下来要读取数据。

  读取数据

    主控读取第一个字节(高 8 位数据),读取完成后发送 应答 (ACK) 信号,请求更多数据。

    主控读取第二个字节(低 8 位数据),读取完成后发送 非应答 (NACK) 信号,表示不再需要数据。

  停止条件:主控发送停止信号,结束通信。

3.4:温度数据转换

  STTS751 的温度数据是以 11 位分辨率的二进制补码形式存储在两个字节中,其中高 8 位是整数部分,低 3 位是小数部分

   计算公式:温度 (℃) = 高8位数据 + (低8位数据 >> 5) * 0.125

   示例:如果读取到的两个字节数据为 0x19 和 0xC0:

     高8位 0x19 = 25℃

     低8位 0xC0 >> 5 = 0x06 = 6

     小数部分 = 6 * 0.125 = 0.75℃

     最终温度 = 25 + 0.75 = 25.75℃

3.5 IIC 写入寄存器函数:

使用HAL库进行操作

/**
 * @brief 向STTS751写入一个字节数据
 * @param hi2c     I2C句柄
 * @param reg      寄存器地址
 * @param data     要写入的数据
 * @return HAL状态
 */
HAL_StatusTypeDef STTS751_WriteReg(I2C_HandleTypeDef *hi2c, uint8_t reg, uint8_t data)
{
    return HAL_I2C_Mem_Write(hi2c, STTS751_ADDR << 1, reg,
                             I2C_MEMADD_SIZE_8BIT, &data, 1, 1000);
}

3.6 IIC读取寄存器函数:

/**
 * @brief 从STTS751读取一个字节数据
 * @param hi2c     I2C句柄
 * @param reg      寄存器地址
 * @param data     存储读取数据的指针
 * @return HAL状态
 */
HAL_StatusTypeDef STTS751_ReadReg(I2C_HandleTypeDef *hi2c, uint8_t reg, uint8_t *data)
{
    return HAL_I2C_Mem_Read(hi2c, STTS751_ADDR << 1, reg,
                            I2C_MEMADD_SIZE_8BIT, data, 1, 1000);
}
3.7 数据处理函数:

/**
 * @brief 读取STTS751温度值(带防数据撕裂处理)
 * @param hi2c        I2C句柄
 * @param temperature 存储温度值的指针(单位:摄氏度)
 * @return HAL状态
 */
HAL_StatusTypeDef STTS751_ReadTemp(I2C_HandleTypeDef *hi2c, float *temperature)
{
    uint8_t temp_h, temp_l, temp_h2;
    int16_t raw_temp;   
    // 防止转换过程中数据更新的处理:读高字节->读低字节->再次读高字节验证[citation:3]
    if (HAL_I2C_Mem_Read(hi2c, STTS751_ADDR << 1, STTS751_REG_TEMP_H,
                         I2C_MEMADD_SIZE_8BIT, &temp_h, 1, 1000) != HAL_OK) {
        return HAL_ERROR;
    }
   
    if (HAL_I2C_Mem_Read(hi2c, STTS751_ADDR << 1, STTS751_REG_TEMP_L,
                         I2C_MEMADD_SIZE_8BIT, &temp_l, 1, 1000) != HAL_OK) {
        return HAL_ERROR;
    }    
    if (HAL_I2C_Mem_Read(hi2c, STTS751_ADDR << 1, STTS751_REG_TEMP_H,
                         I2C_MEMADD_SIZE_8BIT, &temp_h2, 1, 1000) != HAL_OK) {
        return HAL_ERROR;
    }    
    // 如果两次读出的高字节不一致,说明转换发生在两次读取之间,需要重新读取低字节[citation:3]
    if (temp_h != temp_h2) {
        if (HAL_I2C_Mem_Read(hi2c, STTS751_ADDR << 1, STTS751_REG_TEMP_L,
                             I2C_MEMADD_SIZE_8BIT, &temp_l, 1, 1000) != HAL_OK) {
            return HAL_ERROR;
        }
        temp_h = temp_h2;  // 使用第二次读取的高字节
    }
    // 组合原始数据(12位分辨率,低字节的高5位有效)
    raw_temp = (temp_h << 8) | temp_l;
    
    // 转换为摄氏度:分辨率0.0625°C/LSB,公式:温度 = 原始值 × 0.0625[citation:3][citation:5]
    *temperature = (float)raw_temp * 0.0625f;
    
    return HAL_OK;
}
四:串口读取数据如下所示:

04 STTS751 串口数据.png

后记:  传感器支持两种数据就绪模式:

  轮询模式:程序不断读取状态寄存器,检查数据是否更新。代码简单,适合对功耗不敏感的场景。

  中断模式(推荐):将DRDY引脚连接到MCU的外部中断引脚。当新数据准备好时,引脚会产生跳变信号(可配置高电平或低电平),触发MCU读取。这种方式能极大节省MCU资源并降低系统功耗。




关键词: STTS751     温度    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]