RTL8710读温湿度传感器SHT21

连接RTL8710与SHT21模块

  - I2C1 SDA (PC_4) to extended board's SDA 

  - I2C1 SCL (PC_5) to extended board's SCL 

程序

直接复制到SDK里面工程中,替换


#include "device.h"
#include "PinNames.h"

#include "basic_types.h"
#include "diag.h" 
#include "osdep_api.h"

#include "i2c_api.h"
#include "pinmap.h"
#include "rtl_lib.h"
#include <stdbool.h>

#define NO_ERROR            0x00
#define ACK_ERROR           0x01
#define CHECKSUM_ERROR      0x02
#define NULL_ERROR          0x03

#define MBED_I2C_MTR_SDA    PC_4
#define MBED_I2C_MTR_SCL    PC_5

#define MBED_I2C_SLAVE_ADDR0    0x40
#define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001

#define MBED_I2C_BUS_CLK        100000  //hz
#define I2C_DATA_MAX_LENGTH     16

uint8_t i2cdata_write[I2C_DATA_MAX_LENGTH];
uint8_t i2cdata_read[I2C_DATA_MAX_LENGTH];
int i2cdata_read_pos;

volatile i2c_t   i2cmaster;

// Sensor Commands
typedef enum{
    TRIG_T_MEASUREMENT_HM    = 0xE3, // command trig. temp meas. hold master
    TRIG_RH_MEASUREMENT_HM   = 0xE5, // command trig. humidity meas. hold master
    TRIG_T_MEASUREMENT_POLL  = 0xF3, // command trig. temp meas. no hold master
    TRIG_RH_MEASUREMENT_POLL = 0xF5, // command trig. humidity meas. no hold master
    USER_REG_W               = 0xE6, // command writing user register
    USER_REG_R               = 0xE7, // command reading user register
    SOFT_RESET               = 0xFE, // command soft reset
    SerialNumber_location_1  = 0xFA0F,
    SerialNumber_location_2  = 0xFCC9
}etSHT2xCommand;

typedef enum {
    SHT2x_RES_12_14BIT       = 0x00, // RH=12bit, T=14bit
    SHT2x_RES_8_12BIT        = 0x01, // RH= 8bit, T=12bit
    SHT2x_RES_10_13BIT       = 0x80, // RH=10bit, T=13bit
    SHT2x_RES_11_11BIT       = 0x81, // RH=11bit, T=11bit
    SHT2x_RES_MASK           = 0x81  // Mask for res. bits (7,0) in user reg.
} etSHT2xResolution;

typedef enum {
    SHT2x_EOB_ON             = 0x40, // end of battery
    SHT2x_EOB_MASK           = 0x40, // Mask for EOB bit(6) in user reg.
} etSHT2xEob;

static int SHT2x_GetSerialNumber(uint8_t u8SerialNumber[]);
static int SHT2x_WriteCommand8(uint8_t cmd);
static int SHT2x_WriteCommand16(uint16_t cmd);
static int SHT2x_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum);
static float SHT2x_CalcTemperature(uint16_t rawValue);
static float SHT2x_CalcHumidity(uint16_t rawValue);
int SHT2x_ReadUserRegister(uint8_t *pRegisterValue);
int SHT2x_WriteUserRegister(uint8_t *pRegisterValue);

int SHT2x_Init(uint8_t u8SerialNumber[])
{
    uint8_t userRegister;           //variable for user register
    int error = NO_ERROR;
    
    DiagPrintf("SHT2x_Init \r\n");
    
    i2c_init((i2c_t*)&i2cmaster, MBED_I2C_MTR_SDA ,MBED_I2C_MTR_SCL);
    i2c_frequency((i2c_t*)&i2cmaster,MBED_I2C_BUS_CLK);
    
    if (u8SerialNumber == NULL ) 
        return NULL_ERROR;
    // --- Reset sensor by command ---
    error |= SHT2x_SoftReset();
    // --- Read the sensors serial number (64bit) ---
    error |= SHT2x_GetSerialNumber(u8SerialNumber);
    // --- Set Resolution e.g. RH 10bit, Temp 13bit ---
    error |= SHT2x_ReadUserRegister(&userRegister);  //get actual user reg
    userRegister = (userRegister & ~SHT2x_RES_MASK) | SHT2x_RES_10_13BIT;
    error |= SHT2x_WriteUserRegister(&userRegister); //write changed user reg
    
    return error;
}

static int SHT2x_GetSerialNumber(uint8_t u8SerialNumber[])
{
    int error = NO_ERROR;
    
    SHT2x_WriteCommand16(SerialNumber_location_1);  
    if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 8, 1) != 8)
        error |= NULL_ERROR;
    u8SerialNumber[5] = i2cdata_read[0];//SNB_3
    u8SerialNumber[4] = i2cdata_read[2];//SNB_2
    u8SerialNumber[3] = i2cdata_read[4];//SNB_1
    u8SerialNumber[2] = i2cdata_read[6];//SNB_0
    
    SHT2x_WriteCommand16(SerialNumber_location_2);  
    if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 6, 1) != 6)
        error |= NULL_ERROR;
    u8SerialNumber[1] = i2cdata_read[0];//SNC_1
    u8SerialNumber[0] = i2cdata_read[1];//SNC_0
    u8SerialNumber[7] = i2cdata_read[3];//SNA_1
    u8SerialNumber[6] = i2cdata_read[4];//SNA_0
    
    return error;
}

static int SHT2x_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
{
    uint8_t crc = 0;	
    uint8_t byteCtr;
    int error = NO_ERROR;
    //calculates 8-Bit checksum with given polynomial
    for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
    { 
        crc ^= (data[byteCtr]);
        for (uint8_t bit = 8; bit > 0; --bit)
        { 
            if (crc & 0x80) 
                crc = (crc << 1) ^ POLYNOMIAL;
            else 
                crc = (crc << 1);
        }
        }
    if (crc != checksum) 
        error |= CHECKSUM_ERROR;
    
    return error;
}

//===========================================================================
int SHT2x_SoftReset()
//===========================================================================
{
    int error = NO_ERROR;
    
    SHT2x_WriteCommand8(SOFT_RESET);  
    Mdelay(15); // wait till sensor has restarted
    
    return error;
}

//===========================================================================
int SHT2x_ReadUserRegister(uint8_t *pRegisterValue)
//===========================================================================
{
    int error = NO_ERROR;
    
    SHT2x_WriteCommand8(USER_REG_R);
    if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 2, 1) != 2)
        error |= NULL_ERROR;
    error |= SHT2x_CheckCrc (i2cdata_read,1,i2cdata_read[1]);
    
    return error;
}

//===========================================================================
int SHT2x_WriteUserRegister(uint8_t *pRegisterValue)
//===========================================================================
{
    int error = NO_ERROR;
    
    SHT2x_WriteCommand8(USER_REG_W);
    if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)pRegisterValue, 1, 1) != 1)
        error |= NULL_ERROR;
    return error;
}

static int SHT2x_WriteCommand8(uint8_t cmd)
{
    int error = NO_ERROR;
    
	i2cdata_write[0] = (uint8_t)(cmd&0xFF);
  	if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, &i2cdata_write[0], 1, 0) != 1)
        error |= NULL_ERROR;
    return error;
}

static int SHT2x_WriteCommand16(uint16_t cmd)
{
    int error = NO_ERROR;
    
	i2cdata_write[0] = (uint8_t)(cmd >>8);
	i2cdata_write[1] = (uint8_t)(cmd&0xFF);
  	if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, &i2cdata_write[0], 2, 0) != 2)
        error |= NULL_ERROR;
    return error;
}

static float SHT2x_CalcTemperature(uint16_t rawValue)
{
    rawValue &= ~0x0003;           // clear bits [1..0] (status bits)
    return -46.85 + 175.72/65536 *(float)rawValue; //T= -46.85 + 175.72 * ST/2^16
}

static float SHT2x_CalcHumidity(uint16_t rawValue)
{
    rawValue &= ~0x0003;          // clear bits [1..0] (status bits)
    return -6.0 + 125.0/65536 * (float)rawValue; // RH= -6 + 125 * SRH/2^16
}

int SHT2x_GetTempAndHumi(float *temp, float *humi)
{
    int error = NO_ERROR;
    uint16_t rawValueTemp;
    uint16_t rawValueHumi;
    
    SHT2x_WriteCommand8(TRIG_T_MEASUREMENT_HM);  
    //-- read two data bytes and one checksum byte --
    if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 3, 1) != 3)
        error |= NULL_ERROR;
    //-- verify checksum --
    error |= SHT2x_CheckCrc (i2cdata_read,2,i2cdata_read[2]);
    rawValueTemp = i2cdata_read[0] << 8 | i2cdata_read[1];
    
    SHT2x_WriteCommand8(TRIG_RH_MEASUREMENT_HM);  
    //-- read two data bytes and one checksum byte --
    if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 3, 1) != 3)
        error |= NULL_ERROR;
    //-- verify checksum --
    error |= SHT2x_CheckCrc (i2cdata_read,2,i2cdata_read[2]);
    rawValueHumi = i2cdata_read[0] << 8 | i2cdata_read[1];
    
    //diag_printf("raw temp=0x%x, raw humidity=0x%x, error=%d\n", 
    //          rawValueTemp, rawValueHumi, error);
    
    //-- calculate humidity and temperature --
    if ( error == NO_ERROR ) {
        *temp = SHT2x_CalcTemperature(rawValueTemp);
        *humi = SHT2x_CalcHumidity(rawValueHumi);
    }
    
    return error;
}

void main(void)
{
    gpio_t gpio_led;
	int led_status;
	int i2clocalcnt;
	int error;
    uint8_t userRegister;           //variable for user register
    int endOfBattery;           //variable for end of battery
	uint8_t sht2x_serialnumber[8];
	
	float temperature = 1.123f;
	float humidity = 2.456f;
    
    DBG_8195A("sleep 10 sec. to wait for UART console\n");
	Mdelay(10000);
    
    DBG_8195A("start i2c example - SHT2x\n");
    
	error = SHT2x_Init(sht2x_serialnumber);
	if ( error == NO_ERROR ) {
        DiagPrintf("SHT2x init ok, Serial Number = 0x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", 
                   sht2x_serialnumber[7],sht2x_serialnumber[6],sht2x_serialnumber[5],sht2x_serialnumber[4],
                   sht2x_serialnumber[3],sht2x_serialnumber[2],sht2x_serialnumber[1],sht2x_serialnumber[0]);
	} else {
        DiagPrintf("SHT2x init FAILED! \r\n");
        for(;;);
	}
	
	while(1){
		error |= SHT2x_GetTempAndHumi(&temperature, &humidity);
        
        // --- check end of battery status (eob)---
        // note: a RH / Temp. measurement must be executed to update the status of eob
        error |= SHT2x_ReadUserRegister(&userRegister);  //get actual user reg
        if( (userRegister & SHT2x_EOB_MASK) == SHT2x_EOB_ON ) 
            endOfBattery = true;
        else 
            endOfBattery = false;
        
		rtl_printf("temp=%f, humidity=%f, error=%d\n", 
                   temperature, humidity, error);
		
		Mdelay(1000);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值