[004] [蓝桥杯物联网] STS3x-DIS温度传感器IIC读取

蓝桥杯
Contents
IIC通信数据帧
设备地址
通信数据帧
温度换算
HAL库硬件IIC编程
CubeMX配置
读取温度

MCU型号:STM32L071KBU
SDK:HAL库
工具:CubeMX + MDK

1 IIC通信数据帧

image-20220402114600761

温度传感器模块采用Sensirion STS3-DIS-B 温度传感器,I2C 接口,温度测量精度±0.2℃。

  • STS3x-DIS支持I2C快速模式(频率最高可达1000khz)
  • 在向传感器发送命令后,传感器需要最小的1ms等待时间才能接收到另一个命令。
  • 方向上,必须发送校验和,因为STS3x-DIS只接受后面跟着正确校验和的数据。在读取方向上,校验和的读取和处理由主机完成。

1.1 设备地址

image-20220402114813937

ADDR引脚拉低时,设备地址为0x4A,LoRa竞赛板ADDR引脚也是拉低的:

image-20220402114948441

但是在IIC通信时,这7位设备地址要左移一位(0x4a<<1 = 0x94),因为LSB要用来表示R/W,因此通信时:

  • 设备写地址(LSB=0):0x94
  • 设备读地址(LSB=1):0x95

1.2 通信数据帧

image-20220402115613670

选择测量条件:

  • Repeatability 可重复性测量精度:低、中、高(可重复性设置影响测量持续时间,从而影响传感器的总能耗)

  • Clock stretching 时钟拉伸:使能/失能。(当发出带有时钟拉伸的命令时,传感器会用ACK响应读头,然后拉下SCL线。标准刻度线向下拉,直到测量完成。一旦测量完成,传感器释放SCL线并发送测量结果)

    image-20220402120121286

白框为主机控制(MCU),灰框为从机控制(温度传感器),SCL free块表示最小等待时间为1ms。

1.2.1 使用时钟拉伸

  • IIC主机发送数据
I2CStart2();
I2CSendByte2(0x94);				// 设备写地址
I2CWaitAck2();
I2CSendByte2(0x2C);				// 使用时钟拉伸
I2CWaitAck2();
I2CSendByte2(0x0D);				// 中可重复性测量精度
I2CWaitAck2();
I2CStop2();

HAL_Delay(1);					// 延时等待SCL free
  • IIC主机接收数据
I2CStart2();
I2CSendByte2(0x95);				// 设备读地址
I2CWaitAck2();
HAL_Delay(5);					// 等待测量完成
data[0] = I2CReceiveByte2();	// 温度高8位
I2CSendAck2();
data[1] = I2CReceiveByte2();	// 温度低8位
I2CSendAck2();
data[2] = I2CReceiveByte2();	// CRC校验位
I2CSendNotAck2();
I2CStop2();

1.2.2 不使用时钟拉伸

  • IIC主机发送数据
I2CStart2();
I2CSendByte2(0x94);				// 设备写地址
I2CWaitAck2();
I2CSendByte2(0x24);				// 不使用时钟拉伸
I2CWaitAck2();
I2CSendByte2(0x0B);				// 中可重复性测量精度
I2CWaitAck2();
I2CStop2();

HAL_Delay(5);           		// 至少等待5ms
  • IIC主机接收数据
I2CStart2();
I2CSendByte2(0x95);				// 设备读地址
I2CWaitAck2();
data[0] = I2CReceiveByte2();	// 温度高8位
I2CSendAck2();
data[1] = I2CReceiveByte2();	// 温度低8位
I2CSendAck2();
data[2] = I2CReceiveByte2();	// CRC校验位
I2CSendNotAck2();
I2CStop2();

1.3 温度换算

image-20220402144526136

(float)((data[0] << 8 | data[1]) * 175.0 / 65535 - 45);

在这里插入图片描述

2 HAL库硬件IIC编程

image-20220402115742831

报警引脚Alert一般用于连接MCU的中断引脚。引脚的输出取决于可编程限制的温度读数值。当满足报警条件时,引脚拉高,竞赛暂不使用。

2.1 CubeMX配置

使能IIC1默认使用PA9/10硬件,因此需要手动配置PB6/7为IIC1引脚,其他参数默认即可:

image-20220402145223075

2.2 读取温度

float temp_read(void)
{
    
    
    uint8_t data[3] = {
    
    0x24, 0x0B};
    
    HAL_I2C_Master_Transmit(&hi2c1, 0x94, data, 2, 10);
    HAL_Delay(5);
    HAL_I2C_Master_Receive(&hi2c1, 0x95, data, 3, 10);

    return (float)((data[0] << 8 | data[1]) * 175.0 / 65535 - 45);
}

在这里插入图片描述

END

猜你喜欢

转载自blog.csdn.net/kouxi1/article/details/123920458
004