stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据

撑腰会儿:I2C通信协议介绍​zhuanlan.zhihu.com

上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息。

首先,为了使用I2C读取传感器测量数据,需要先通过传感器数据手册来确定从机地址和所需寄存器地址。

stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据_第1张图片

模块中A2,A1,A0均接地,所以设备从机地址为0x48。由于I2C协议中地址为七位,地址后一位位读/写标志位,因此在使用地址时需要将其左移一位即0x90。

对于它内部寄存器,有以下寄存器表。在初始化阶段,需要将其Conf寄存器置零表示传感器在默认模式下进行工作。在读取传感器数据时(温度数据),读取Temp寄存器值,注意,这里Conf寄存器有16位,在读取需要连续读取两个字节数据。

stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据_第2张图片

在读取传感器数据时,参考以下Temp寄存器,LSB的0~4位无数据,所以真实数据需要右移五位。得到寄存器的值乘0.125即为当前温度值。

stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据_第3张图片

下面来进行实际操作,使用STM32CubeMX进行初始化配置。

使用I2C1来进行传感器数据的接收,首先配置复用GPIO口,然后配置I2C参数(速率,地址位数等),接着配置时钟为外部时钟,生成MDK工程即可。

stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据_第4张图片

stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据_第5张图片

stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据_第6张图片

编写传感器函数,包括写一个字节,读两个字节数据,初始化和计算温度,下面是头文件和源文件。

LM75A.h

#ifndef _LM75A_H
#define _LM75A_H

#include "main.h"
 
#define LM75A_SLAVE_ADDR (0x48 << 1)
#define LM75A_TEMP_REG 0x00
#define LM75A_CONF_REG 0x01
 
void lm75a_init(void);
float lm75a_get_temp(void);
 
#endif

LM75A.c

#include "LM75A.h"
#include "i2c.h"
#include 
 
static int lm75a_write_byte(uint8_t addr, uint8_t data)
{
    HAL_StatusTypeDef status;
    status = HAL_I2C_Mem_Write(&hi2c1,LM75A_SLAVE_ADDR,
             addr,I2C_MEMADD_SIZE_8BIT,&data,1,100);
    if(status != HAL_OK) {
        printf("%s: failed to write registerrn", __func__);
        return -1;
    }
    return 0;
}
 
static int lm75a_read_word(uint8_t addr)
{
    HAL_StatusTypeDef status;
    uint8_t byte_data[2];
    status = HAL_I2C_Mem_Read(&hi2c1,LM75A_SLAVE_ADDR,
             addr,I2C_MEMADD_SIZE_8BIT,byte_data,2,100);
    if(status != HAL_OK) {
        printf("%s: failed to read registerrn", __func__);
        return -1;
    }
    return (byte_data[0] << 8 | byte_data[1]);
}
 
void lm75a_init(void)
{
 lm75a_write_byte(LM75A_CONF_REG,0x00);
}
 
float lm75a_get_temp(void)
{
 float temperature;
 int temp;
 temp = lm75a_read_word(LM75A_TEMP_REG) & 0xffff;
 //printf("%s temp = %xrn",__func__,temp);
 temp = temp >> 5;
 temperature = temp * 0.125;
 //printf("%s temp = %frn",__func__,temperature);
 return temperature;
}

在主函数中,将读出传感器数据一秒钟进行一次打印,用手指压住温度传感器芯片,观察打印温度变化。

stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据_第7张图片

你可能感兴趣的:(stm32使用801s振动传感器_基于STM32使用I2C读取传感器数据)