Explorar el Código

First commit.

guanwenliang hace 7 años
padre
commit
16b2f4c0da
Se han modificado 6 ficheros con 804 adiciones y 2 borrados
  1. 99 2
      README.md
  2. 10 0
      SConscript
  3. 180 0
      sensor_goer_spl0601.c
  4. 8 0
      sensor_goer_spl0601.h
  5. 461 0
      spl06_01.c
  6. 46 0
      spl06_01.h

+ 99 - 2
README.md

@@ -1,2 +1,99 @@
-# spl0601
-The Digital Air Pressure Sensor SPL06-01 driver package.
+# SPL0601
+
+## 简介
+
+本软件包是 RT-Thread 开发团队为 Goer SPL0601 气压传感器提供的通用传感器驱动包。通过使用此软件包,开发者可以快速的利用 RT-Thread 将此传感器驱动起来。
+
+本篇文档主要内容如下:
+
+- 传感器介绍
+- 支持情况
+- 使用说明
+
+## 传感器介绍
+
+SPL0601 是 Goer(歌尔)公司专为可穿戴设备和 IOT 市场开发的一款超低功耗加气压传感器,尺寸小巧且内置温度传感器。
+
+## 支持情况
+
+| 包含设备         | 气压计 | 温度计 |
+| ---------------- | -------- | ------ |
+| **通讯接口**     |          |        |
+| IIC              | √        | √      |
+| SPI              |          |        |
+| **工作模式**     |          |        |
+| 轮询             | √        | √      |
+| 中断             |          |        |
+| FIFO             |          |        |
+| **电源模式**     |          |        |
+| 掉电             |          |        |
+| 低功耗           |          |        |
+| 普通             | √        | √      |
+| 高功耗           |          |        |
+| **数据输出速率** | √        | √      |
+| **测量范围**     |          |        |
+| **自检**         |          |        |
+| **多实例**       | √        | √      |
+
+## 使用说明
+
+### 依赖
+
+- RT-Thread 4.0.0+
+- Sensor 组件
+- IIC 驱动:SPL0601 设备使用 IIC 进行数据通讯,需要系统 IIC 驱动框架支持;
+
+### 获取软件包
+
+使用 BMA400 软件包需要在 RT-Thread 的包管理中选中它,具体路径如下:
+
+```
+SPL0601: SPL0601 Digital pressure sensor
+    [*]   Enable SPL0601 pressure
+    [*]   Enable SPL0601 temperature
+        Version (latest)  --->
+```
+
+**Enable SPL0601 pressure**: 配置开启大气压强测量功能
+
+**Enable SPL0601 temperature**:配置开启温度测量功能
+
+**Version**:软件包版本选择
+
+### 使用软件包
+
+BMA400 软件包初始化函数如下所示:
+
+```
+int rt_hw_spl0601_init(const char *name, struct rt_sensor_config *cfg);
+```
+
+该函数需要由用户调用,函数主要完成的功能有,
+
+- 设备配置和初始化(根据传入的配置信息,配置接口设备和中断引脚);
+- 注册相应的传感器设备,完成 SPL0601 设备的注册;
+
+#### 初始化示例
+
+```
+#include "sensor_goer_spl0601.h"
+
+int spl0601_port(void)
+{
+    struct rt_sensor_config cfg;
+    cfg.intf.dev_name = "i2c1";
+    rt_hw_spl0601_init("spl0601", &cfg);
+    return 0;
+}
+INIT_APP_EXPORT(spl0601_port);
+```
+
+## 注意事项
+
+暂无
+
+## 联系人信息
+
+维护人:
+
+- [gztss](https://github.com/gztss)

+ 10 - 0
SConscript

@@ -0,0 +1,10 @@
+from building import *
+Import('rtconfig')
+
+cwd     = GetCurrentDir()
+src	= Glob('*.c')
+path = [cwd]
+
+group = DefineGroup('spl0601', src, depend = ['PKG_USING_SPL0601'], CPPPATH = path)
+
+Return('group')

+ 180 - 0
sensor_goer_spl0601.c

@@ -0,0 +1,180 @@
+#include "sensor_goer_spl0601.h"
+#include "spl06_01.h"
+
+#define DBG_ENABLE
+#define DBG_LEVEL DBG_LOG
+#define DBG_SECTION_NAME  "sensor.goer.spl0601"
+#define DBG_COLOR
+#include <rtdbg.h>
+
+#if defined(SPL0601_USING_TEMP) || defined(SPL0601_USING_BARO)
+
+static spl0601_t * _spl0601_create(struct rt_sensor_intf *intf)
+{
+    spl0601_t *hdev = rt_malloc(sizeof(spl0601_t));
+    if (hdev == RT_NULL)
+    {
+        return RT_NULL;
+    }
+    spl0601_init(hdev, intf->dev_name);
+    spl0601_rateset(hdev, PRESSURE_SENSOR, 32, 8);
+    spl0601_rateset(hdev, TEMPERATURE_SENSOR, 32, 8);
+    spl0601_start_continuous(hdev, CONTINUOUS_P_AND_T);
+    return hdev;
+}
+
+static rt_size_t spl0601_fetch_data(struct rt_sensor_device *sensor, void *buf, rt_size_t len)
+{
+    spl0601_t *hdev = sensor->parent.user_data;
+    struct rt_sensor_data *data = (struct rt_sensor_data *)buf;
+    
+    if (sensor->info.type == RT_SENSOR_CLASS_TEMP)
+    {
+        float temp_value;
+
+        spl0601_get_raw_temp(hdev);
+        temp_value = spl0601_get_temperature(hdev);
+
+        data->type = RT_SENSOR_CLASS_TEMP;
+        data->data.temp = temp_value * 10;
+        data->timestamp = rt_sensor_get_ts();
+    }
+    else if (sensor->info.type == RT_SENSOR_CLASS_BARO)
+    {
+        float pres_value;
+
+		spl0601_get_raw_pressure(hdev);
+        pres_value = spl0601_get_pressure(hdev);
+
+        data->type = RT_SENSOR_CLASS_BARO;
+        data->data.baro = pres_value;
+        data->timestamp = rt_sensor_get_ts();
+    }
+
+    return 1;
+}
+
+static rt_err_t spl0601_control(struct rt_sensor_device *sensor, int cmd, void *args)
+{
+    rt_err_t result = RT_EOK;
+    spl0601_t *hdev = sensor->parent.user_data;
+
+    switch (cmd)
+    {
+    case RT_SENSOR_CTRL_SET_ODR:
+        if ((rt_uint32_t)args <= 128)
+        {
+            rt_uint32_t odr = (rt_uint32_t)args;
+            if (sensor->info.type == RT_SENSOR_CLASS_TEMP)
+                spl0601_rateset(hdev, TEMPERATURE_SENSOR, odr, 8);
+            else if(sensor->info.type == RT_SENSOR_CLASS_BARO)
+                spl0601_rateset(hdev, PRESSURE_SENSOR, odr, 8);
+        }
+        break;
+    case RT_SENSOR_CTRL_SELF_TEST:
+        result =  -RT_EINVAL;
+        break;
+    default:
+        return -RT_ERROR;
+    }
+    return result;
+}
+
+static struct rt_sensor_ops sensor_ops =
+{
+    spl0601_fetch_data,
+    spl0601_control
+};
+
+#endif
+
+#ifdef SPL0601_USING_TEMP
+static int rt_hw_spl0601_temp_init(const char *name, struct rt_sensor_config *cfg, spl0601_t *hdev)
+{
+    rt_int8_t result;
+    rt_sensor_t sensor = RT_NULL;
+
+    sensor = rt_calloc(1, sizeof(struct rt_sensor_device));
+    if (sensor == RT_NULL)
+        return -1;
+
+    sensor->info.type       = RT_SENSOR_CLASS_TEMP;
+    sensor->info.vendor     = RT_SENSOR_VENDOR_STM;
+    sensor->info.model      = "spl0601_temp";
+    sensor->info.unit       = RT_SENSOR_UNIT_DCELSIUS;
+    sensor->info.intf_type  = RT_SENSOR_INTF_I2C;
+    sensor->info.range_max  = 120;
+    sensor->info.range_min  = -40;
+    sensor->info.period_min = 80;
+    sensor->info.fifo_max   = 0;
+
+    rt_memcpy(&sensor->config, cfg, sizeof(struct rt_sensor_config));
+    sensor->ops = &sensor_ops;
+    
+    result = rt_hw_sensor_register(sensor, name, RT_DEVICE_FLAG_RDWR, hdev);
+    if (result != RT_EOK)
+    {
+        LOG_E("device register err code: %d", result);
+        rt_free(sensor);
+        return -RT_ERROR;
+    }
+
+    LOG_I("temp sensor init success");
+    return RT_EOK;
+}
+#endif
+
+#ifdef SPL0601_USING_BARO
+static int rt_hw_spl0601_baro_init(const char *name, struct rt_sensor_config *cfg, spl0601_t *hdev)
+{
+    rt_int8_t result;
+    rt_sensor_t sensor = RT_NULL;
+
+    sensor = rt_calloc(1, sizeof(struct rt_sensor_device));
+    if (sensor == RT_NULL)
+        return -1;
+
+    sensor->info.type       = RT_SENSOR_CLASS_BARO;
+    sensor->info.vendor     = RT_SENSOR_VENDOR_STM;
+    sensor->info.model      = "spl0601_baro";
+    sensor->info.unit       = RT_SENSOR_UNIT_PERMILLAGE;
+    sensor->info.intf_type  = RT_SENSOR_INTF_I2C;
+    sensor->info.range_max  = 1000;
+    sensor->info.range_min  = 0;
+    sensor->info.period_min = 80;
+    sensor->info.fifo_max   = 0;
+
+    rt_memcpy(&sensor->config, cfg, sizeof(struct rt_sensor_config));
+    sensor->ops = &sensor_ops;
+    
+    result = rt_hw_sensor_register(sensor, name, RT_DEVICE_FLAG_RDWR, hdev);
+    if (result != RT_EOK)
+    {
+        LOG_E("device register err code: %d", result);
+        rt_free(sensor);
+        return -RT_ERROR;
+    }
+
+    LOG_I("baro sensor init success");
+    return RT_EOK;
+}
+#endif
+
+int rt_hw_spl0601_init(const char *name, struct rt_sensor_config *cfg)
+{
+#if defined(SPL0601_USING_TEMP) || defined(SPL0601_USING_BARO)
+    spl0601_t *hdev = _spl0601_create(&cfg->intf);
+    
+    if (hdev)
+    {
+#ifdef SPL0601_USING_TEMP
+        rt_hw_spl0601_temp_init(name, cfg, hdev);
+#endif
+#ifdef SPL0601_USING_BARO
+        rt_hw_spl0601_baro_init(name, cfg, hdev);
+#endif
+        return 0;
+    }
+#endif
+    return -1;
+}

+ 8 - 0
sensor_goer_spl0601.h

@@ -0,0 +1,8 @@
+#ifndef SENSOR_GOER_SPL0601_H__
+#define SENSOR_GOER_SPL0601_H__
+
+#include <sensor.h>
+
+int rt_hw_spl0601_init(const char *name, struct rt_sensor_config *cfg);
+
+#endif

+ 461 - 0
spl06_01.c

@@ -0,0 +1,461 @@
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#include "spl06_01.h"
+
+#define HW_ADR 0x77
+
+static void spl0601_get_calib_param(spl0601_t *hdev);
+
+/*****************************************************************************
+ 函 数 名  : spl0601_write
+ 功能描述  : I2C 寄存器写入子函数
+ 输入参数  : uint8_t hwadr   硬件地址
+             uint8_t regadr  寄存器地址
+             uint8_t val     值
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+static void spl0601_write(spl0601_t *hdev, uint8_t hwadr, uint8_t regadr, uint8_t val)
+{
+    uint8_t buf[2] = { regadr, val };
+    struct rt_i2c_msg msg;
+    msg.addr = hwadr;
+    msg.buf = buf;
+    msg.len = 2;
+    msg.flags = RT_I2C_WR;
+    rt_i2c_transfer(hdev->bus, &msg, 1);
+}
+
+
+/*****************************************************************************
+ 函 数 名  : spl0601_read
+ 功能描述  : I2C 寄存器读取子函数
+ 输入参数  : uint8_t hwadr   硬件地址
+             uint8_t regadr  寄存器地址
+ 输出参数  : 
+ 返 回 值  : uint8_t 读出值
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+static uint8_t spl0601_read(spl0601_t *hdev, uint8_t hwadr, uint8_t regadr)
+{
+    struct rt_i2c_msg msg;
+    msg.addr = hwadr;
+    msg.buf = &regadr;
+    msg.len = 1;
+    msg.flags = RT_I2C_WR;
+    rt_i2c_transfer(hdev->bus, &msg, 1);
+    msg.flags = RT_I2C_RD;
+    rt_i2c_transfer(hdev->bus, &msg, 1);
+    return regadr;
+}
+
+/*****************************************************************************
+ 函 数 名  : spl0601_init
+ 功能描述  : SPL06-01 初始化函数
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+int spl0601_init(spl0601_t *hdev, const char *busname)
+{
+    hdev->bus = rt_i2c_bus_device_find(busname);
+    if (hdev->bus == RT_NULL)
+    {
+        return -1;
+    }
+    hdev->i32rawPressure = 0;
+    hdev->i32rawTemperature = 0;
+    hdev->chip_id = 0x34; /* read Chip Id */
+    spl0601_get_calib_param(hdev);
+    // sampling rate = 1Hz; Pressure oversample = 2;
+    spl0601_rateset(hdev, PRESSURE_SENSOR, 32, 8);   
+    // sampling rate = 1Hz; Temperature oversample = 1; 
+    spl0601_rateset(hdev, TEMPERATURE_SENSOR, 32, 8);
+    //Start background measurement
+    return 0;
+}
+
+/*****************************************************************************
+ 函 数 名  : spl0601_rateset
+ 功能描述  :  设置温度传感器的每秒采样次数以及过采样率
+ 输入参数  : uint8_t u8OverSmpl  过采样率         Maximal = 128
+             uint8_t u8SmplRate  每秒采样次数(Hz) Maximal = 128
+             uint8_t iSensor     0: Pressure; 1: Temperature
+ 输出参数  : 无
+ 返 回 值  : 无
+ 调用函数  :
+ 被调函数  :
+
+ 修改历史      :
+  1.日    期   : 2015年11月24日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+void spl0601_rateset(spl0601_t *hdev, uint8_t iSensor, uint8_t u8SmplRate, uint8_t u8OverSmpl)
+{
+    uint8_t reg = 0;
+    int32_t i32kPkT = 0;
+    switch(u8SmplRate)
+    {
+        case 2:
+            reg |= (1<<4);
+            break;
+        case 4:
+            reg |= (2<<4);
+            break;
+        case 8:
+            reg |= (3<<4);
+            break;
+        case 16:
+            reg |= (4<<4);
+            break;
+        case 32:
+            reg |= (5<<4);
+            break;
+        case 64:
+            reg |= (6<<4);
+            break;
+        case 128:
+            reg |= (7<<4);
+            break;
+        case 1:
+        default:
+            break;
+    }
+    switch(u8OverSmpl)
+    {
+        case 2:
+            reg |= 1;
+            i32kPkT = 1572864;
+            break;
+        case 4:
+            reg |= 2;
+            i32kPkT = 3670016;
+            break;
+        case 8:
+            reg |= 3;
+            i32kPkT = 7864320;
+            break;
+        case 16:
+            i32kPkT = 253952;
+            reg |= 4;
+            break;
+        case 32:
+            i32kPkT = 516096;
+            reg |= 5;
+            break;
+        case 64:
+            i32kPkT = 1040384;
+            reg |= 6;
+            break;
+        case 128:
+            i32kPkT = 2088960;
+            reg |= 7;
+            break;
+        case 1:
+        default:
+            i32kPkT = 524288;
+            break;
+    }
+
+    if(iSensor == PRESSURE_SENSOR)
+    {
+        hdev->i32kP = i32kPkT;
+        spl0601_write(hdev, HW_ADR, 0x06, reg);
+        if(u8OverSmpl > 8)
+        {
+            reg = spl0601_read(hdev, HW_ADR, 0x09);
+            spl0601_write(hdev, HW_ADR, 0x09, reg | 0x04);
+        }
+        else
+        {
+            reg = spl0601_read(hdev, HW_ADR, 0x09);
+            spl0601_write(hdev, HW_ADR, 0x09, reg & (~0x04));
+        }
+    }
+    if(iSensor == TEMPERATURE_SENSOR)
+    {
+        hdev->i32kT = i32kPkT;
+        spl0601_write(hdev, HW_ADR, 0x07, reg|0x80);  //Using mems temperature
+        if(u8OverSmpl > 8)
+        {
+            reg = spl0601_read(hdev, HW_ADR, 0x09);
+            spl0601_write(hdev, HW_ADR, 0x09, reg | 0x08);
+        }
+        else
+        {
+            reg = spl0601_read(hdev, HW_ADR, 0x09);
+            spl0601_write(hdev, HW_ADR, 0x09, reg & (~0x08));
+        }
+    }
+
+}
+
+/*****************************************************************************
+ 函 数 名  : spl0601_get_calib_param
+ 功能描述  : 获取校准参数
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+static void spl0601_get_calib_param(spl0601_t *hdev)
+{
+    uint32_t h;
+    uint32_t m;
+    uint32_t l;
+    h =  spl0601_read(hdev, HW_ADR, 0x10);
+    l  =  spl0601_read(hdev, HW_ADR, 0x11);
+    hdev->calib_param.c0 = (uint32_t)h<<4 | l>>4;
+    hdev->calib_param.c0 = (hdev->calib_param.c0&0x0800)?(0xF000|hdev->calib_param.c0):hdev->calib_param.c0;
+    h =  spl0601_read(hdev, HW_ADR, 0x11);
+    l  =  spl0601_read(hdev, HW_ADR, 0x12);
+    hdev->calib_param.c1 = (uint32_t)(h&0x0F)<<8 | l;
+    hdev->calib_param.c1 = (hdev->calib_param.c1&0x0800)?(0xF000|hdev->calib_param.c1):hdev->calib_param.c1;
+    h =  spl0601_read(hdev, HW_ADR, 0x13);
+    m =  spl0601_read(hdev, HW_ADR, 0x14);
+    l =  spl0601_read(hdev, HW_ADR, 0x15);
+    hdev->calib_param.c00 = (int32_t)h<<12 | (int32_t)m<<4 | (int32_t)l>>4;
+    hdev->calib_param.c00 = (hdev->calib_param.c00&0x080000)?(0xFFF00000|hdev->calib_param.c00):hdev->calib_param.c00;
+    h =  spl0601_read(hdev, HW_ADR, 0x15);
+    m =  spl0601_read(hdev, HW_ADR, 0x16);
+    l =  spl0601_read(hdev, HW_ADR, 0x17);
+    hdev->calib_param.c10 = (int32_t)(h & 0x0F) << 16 | (int32_t)m << 8 | l;
+    hdev->calib_param.c10 = (hdev->calib_param.c10&0x080000)?(0xFFF00000|hdev->calib_param.c10):hdev->calib_param.c10;
+    h =  spl0601_read(hdev, HW_ADR, 0x18);
+    l  =  spl0601_read(hdev, HW_ADR, 0x19);
+    hdev->calib_param.c01 = (uint32_t)h<<8 | l;
+    h =  spl0601_read(hdev, HW_ADR, 0x1A);
+    l  =  spl0601_read(hdev, HW_ADR, 0x1B);
+    hdev->calib_param.c11 = (uint32_t)h<<8 | l;
+    h =  spl0601_read(hdev, HW_ADR, 0x1C);
+    l  =  spl0601_read(hdev, HW_ADR, 0x1D);
+    hdev->calib_param.c20 = (uint32_t)h<<8 | l;
+    h =  spl0601_read(hdev, HW_ADR, 0x1E);
+    l  =  spl0601_read(hdev, HW_ADR, 0x1F);
+    hdev->calib_param.c21 = (uint32_t)h<<8 | l;
+    h =  spl0601_read(hdev, HW_ADR, 0x20);
+    l  =  spl0601_read(hdev, HW_ADR, 0x21);
+    hdev->calib_param.c30 = (uint32_t)h<<8 | l;
+}
+
+
+/*****************************************************************************
+ 函 数 名  : spl0601_start_temperature
+ 功能描述  : 发起一次温度测量
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+void spl0601_start_temperature(spl0601_t *hdev)
+{
+    spl0601_write(hdev, HW_ADR, 0x08, 0x02);
+}
+
+/*****************************************************************************
+ 函 数 名  : spl0601_start_pressure
+ 功能描述  : 发起一次压力值测量
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+void spl0601_start_pressure(spl0601_t *hdev)
+{
+    spl0601_write(hdev, HW_ADR, 0x08, 0x01);
+}
+
+/*****************************************************************************
+ 函 数 名  : spl0601_start_continuous
+ 功能描述  : Select node for the continuously measurement
+ 输入参数  : uint8_t mode  1: pressure; 2: temperature; 3: pressure and temperature
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月25日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+void spl0601_start_continuous(spl0601_t *hdev, uint8_t mode)
+{
+    spl0601_write(hdev, HW_ADR, 0x08, mode+4);
+}
+
+void spl0601_stop(spl0601_t *hdev)
+{
+    spl0601_write(hdev, HW_ADR, 0x08, 0);
+}
+
+
+/*****************************************************************************
+ 函 数 名  : spl0601_get_raw_temp
+ 功能描述  : 获取温度的原始值,并转换成32Bits整数
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+void spl0601_get_raw_temp(spl0601_t *hdev)
+{
+    uint8_t buf[3], reg = 0x03;
+    struct rt_i2c_msg msg;
+    msg.addr = HW_ADR;
+    msg.buf = &reg;
+    msg.len = 1;
+    msg.flags = RT_I2C_WR;
+    rt_i2c_transfer(hdev->bus, &msg, 1);
+    msg.buf = buf;
+    msg.len = 3;
+    msg.flags = RT_I2C_RD;
+    rt_i2c_transfer(hdev->bus, &msg, 1);
+    
+    hdev->i32rawTemperature = (int32_t)buf[0]<<16 | (int32_t)buf[1]<<8 | (int32_t)buf[2];
+    hdev->i32rawTemperature= (hdev->i32rawTemperature&0x800000) ? (0xFF000000|hdev->i32rawTemperature) : hdev->i32rawTemperature;
+}
+
+/*****************************************************************************
+ 函 数 名  : spl0601_get_raw_pressure
+ 功能描述  : 获取压力原始值,并转换成32bits整数
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+void spl0601_get_raw_pressure(spl0601_t *hdev)
+{
+    uint8_t buf[3], reg = 0x00;
+    struct rt_i2c_msg msg;
+    msg.addr = HW_ADR;
+    msg.buf = &reg;
+    msg.len = 1;
+    msg.flags = RT_I2C_WR;
+    rt_i2c_transfer(hdev->bus, &msg, 1);
+    msg.buf = buf;
+    msg.len = 3;
+    msg.flags = RT_I2C_RD;
+    rt_i2c_transfer(hdev->bus, &msg, 1);
+    
+    hdev->i32rawPressure = (int32_t)buf[0]<<16 | (int32_t)buf[1]<<8 | (int32_t)buf[2];
+    hdev->i32rawPressure= (hdev->i32rawPressure&0x800000) ? (0xFF000000|hdev->i32rawPressure) : hdev->i32rawPressure;
+}
+
+
+/*****************************************************************************
+ 函 数 名  : spl0601_get_temperature
+ 功能描述  : 在获取原始值的基础上,返回浮点校准后的温度值
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+float spl0601_get_temperature(spl0601_t *hdev)
+{
+    float fTCompensate;
+    float fTsc;
+
+    fTsc = hdev->i32rawTemperature / (float)hdev->i32kT;
+    fTCompensate =  hdev->calib_param.c0 * 0.5 + hdev->calib_param.c1 * fTsc;
+    return fTCompensate;
+}
+
+/*****************************************************************************
+ 函 数 名  : spl0601_get_pressure
+ 功能描述  : 在获取原始值的基础上,返回浮点校准后的压力值
+ 输入参数  : void  
+ 输出参数  : 无
+ 返 回 值  : 
+ 调用函数  : 
+ 被调函数  : 
+ 
+ 修改历史      :
+  1.日    期   : 2015年11月30日
+    作    者   : WL
+    修改内容   : 新生成函数
+
+*****************************************************************************/
+float spl0601_get_pressure(spl0601_t *hdev)
+{
+    float fTsc, fPsc;
+    float qua2, qua3;
+    float fPCompensate;
+
+    fTsc = hdev->i32rawTemperature / (float)hdev->i32kT;
+    fPsc = hdev->i32rawPressure / (float)hdev->i32kP;
+    qua2 = hdev->calib_param.c10 + fPsc * (hdev->calib_param.c20 + fPsc* hdev->calib_param.c30);
+    qua3 = fTsc * fPsc * (hdev->calib_param.c11 + fPsc * hdev->calib_param.c21);
+
+    fPCompensate = hdev->calib_param.c00 + fPsc * qua2 + fTsc * hdev->calib_param.c01 + qua3;
+    return fPCompensate;
+}

+ 46 - 0
spl06_01.h

@@ -0,0 +1,46 @@
+#ifndef SPL06_01_H
+#define SPL06_01_H
+
+#define CONTINUOUS_PRESSURE     1
+#define CONTINUOUS_TEMPERATURE  2
+#define CONTINUOUS_P_AND_T      3
+#define PRESSURE_SENSOR     0
+#define TEMPERATURE_SENSOR  1
+
+#include <stdint.h>
+
+struct spl0601_calib_param_t {	
+    int16_t c0;
+    int16_t c1;
+    int32_t c00;
+    int32_t c10;
+    int16_t c01;
+    int16_t c11;
+    int16_t c20;
+    int16_t c21;
+    int16_t c30;       
+};
+
+typedef struct spl0601_t {	
+    struct spl0601_calib_param_t calib_param;/**<calibration data*/	
+    uint8_t chip_id; /**<chip id*/	
+    int32_t i32rawPressure;
+    int32_t i32rawTemperature;
+    int32_t i32kP;    
+    int32_t i32kT;
+    struct rt_i2c_bus_device *bus;
+} spl0601_t;
+
+
+int spl0601_init(spl0601_t *hdev, const char *busname);
+void spl0601_rateset(spl0601_t *hdev, uint8_t iSensor, uint8_t u8OverSmpl, uint8_t u8SmplRate);
+void spl0601_start_temperature(spl0601_t *hdev);
+void spl0601_start_pressure(spl0601_t *hdev);
+void spl0601_start_continuous(spl0601_t *hdev, uint8_t mode);
+void spl0601_get_raw_temp(spl0601_t *hdev);
+void spl0601_get_raw_pressure(spl0601_t *hdev);
+float spl0601_get_temperature(spl0601_t *hdev);
+float spl0601_get_pressure(spl0601_t *hdev);
+
+#endif
+