一: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

三:配置如下所示:
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;
}四:串口读取数据如下所示:
轮询模式:程序不断读取状态寄存器,检查数据是否更新。代码简单,适合对功耗不敏感的场景。
中断模式(推荐):将DRDY引脚连接到MCU的外部中断引脚。当新数据准备好时,引脚会产生跳变信号(可配置高电平或低电平),触发MCU读取。这种方式能极大节省MCU资源并降低系统功耗。
我要赚赏金
