FBM320氣壓計


1、FBM320控制寄存器

  a、AD數據寄存器地址(24bit數據):

    0xF6:Data-LSB

    0xF7:Data-CSB

    0xF8:Data-MSB

  b、CONFIG寄存器地址(0xF4):

    OSR(bit6-bit7):00=1024X;01=2048X;10=4096X;11=8192X

    Measurement_Control (bit0 ~ bit5):101110=溫度轉換;110100=壓力轉換

  c、軟件復位寄存器(0xE0):

    向寄存器中寫入0x6B,FBM320將執行復位功能,等待復位時間為15ms

  d、校准數據寄存器(0xD0、0xF1、0xAA ~ 0xBB)

    校准數據寄存器總共20Byte,用於傳感器的校准

  e、器件ID寄存器(0x6B)

    器件ID寄存器上電默認值為0x42

  f、SPI控制寄存器(0x00)

    SDO_active(bot0、bit7):1=4線SPI,0=3線SPI

    LSB_first(bit2、bit6):數據位傳輸順序,1=LSB,0=MSB

2、FBM320代碼實現

fbm320.h

#ifndef __FBM320_H
#define __FBM320_H
 
#pragma pack(push, 4)
// FBM320數據結構
typedef struct _sFbm320
{
    // FBM320 轉換結果
    signed int real_pressure; // 真實壓力值,單位:Pa
    signed int real_temperature; // 真實溫度值,單位:0.01℃
    unsigned int raw_pressure; // 原始壓力值
    unsigned int raw_temperature; // 原始溫度值
}sFbm320_t;
#pragma pack(pop)
 

/********************************************************
 * 函數功能:FBM320初始化
 * 形    參:無
 * 返 回 值:0=初始化成功
 *           1=芯片ID讀取失敗
 *           2=版本號讀取失敗
 *           3=校准系數讀取失敗
 * 開發人員:icode
 ********************************************************/
unsigned char fbm320_init(void);

/********************************************************
 * 函數功能:FBM320數據更新
 * 形    參:psFbm320:數據結構指針
 *           ticks:當前的時間,單位:ms
 * 返 回 值:0=數據更新完成
 *           1=啟動溫度測量
 *           2=讀取溫度數據
 *           3=啟動氣壓測量
 *           4=讀取氣壓數據
 *           其它=狀態機異常復位
 *           0xFF=數據結構指針異常
 * 開發人員:icode
 ********************************************************/
unsigned char fbm320_update(sFbm320_t * const psFbm320, unsigned int ticks);
 
#endif
 
fbm320.c
 
#include "fbm320.h"
#include "delay.h"
#include "iic.h"
 
// 器件地址:FBM320器件地址主要通過 SDO/ADDR 引腳配置
#define FBM320_SDO  ((unsigned char)0x01) // 拉高或未連接為1,拉低為0
#define FBM320_ADDR  ((unsigned char)(0x6C + FBM320_SDO))
// FBM320芯片ID
#define FBM320_CHIP_ID      ((unsigned char)0x42)
// FBM320控制寄存器地址
#define FBM320_SPI_CTRL_REG     0x00
#define FBM320_SPI_CTRL_REG_SDO_ACTIVE_POS (0)
#define FBM320_SPI_CTRL_REG_SDO_ACTIVE_MSK (0x81 << FBM320_SPI_CTRL_REG_SDO_ACTIVE_POS)
#define FBM320_SPI_CTRL_REG_SDO_ACTIVE_EN (0x81 << FBM320_SPI_CTRL_REG_SDO_ACTIVE_POS)
#define FBM320_SPI_CTRL_REG_SDO_ACTIVE_DIS (0 << << FBM320_SPI_CTRL_REG_SDO_ACTIVE_POS)
#define FBM320_TAKE_MEAS_REG    0xF4
#define FBM320_READ_MEAS_REG_U    0xF6
#define FBM320_READ_MEAS_REG_L    0xF7
#define FBM320_READ_MEAS_REG_XL    0xF8
#define FBM320_SOFTRESET_REG    0xE0
#define FBM320_CHIP_ID_REG     0x6B
#define FBM320_VERSION_REG     0xA5
#define FBM320_P_CONFIG_REG     0xA6
#define FBM320_P_CONFIG_REG_GAIN_POS  (3)
#define FBM320_P_CONFIG_REG_GAIN_MAK  (7 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X1   (0 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X2   (1 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X4   (2 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X8   (3 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X16  (4 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X32  (5 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X64  (6 << FBM320_P_CONFIG_REG_GAIN_POS)
#define FBM320_P_CONFIG_REG_GAIN_X128  (7 << FBM320_P_CONFIG_REG_GAIN_POS)
// CMD list
#define FBM320_SOFTWARE_RESET    0xB6 // 軟復位
#define FBM320_MEAS_TEMPERATURE    0x2E // 2.5ms wait for measurement
#define FBM320_MEAS_PRESS_OVERSAMP_0  0x34 // 2.5ms wait for measurement
#define FBM320_MEAS_PRESS_OVERSAMP_1  0x74 // 3.7ms wait for measurement
#define FBM320_MEAS_PRESS_OVERSAMP_2  0xB4 // 6ms wait for measurement
#define FBM320_MEAS_PRESS_OVERSAMP_3  0xF4 // 10.7ms wait for measurement
#define FBM320_CONVERSION_TIME_OSR1024  2500  // 單位:微秒
#define FBM320_CONVERSION_TIME_OSR2048  3700  // 單位:微秒
#define FBM320_CONVERSION_TIME_OSR4096  6000  // 單位:微秒
#define FBM320_CONVERSION_TIME_OSR8192  10700 // 單位:微秒
#define FBM320_CONVERSION_TIME_OSR16384  20500 // 單位:微秒
// 校准系數寄存器地址 {0xF1, 0xD0, 0xBB ~ 0xAA}
#define FBM320_CALIBRATION_DATA_START0  0xAA
#define FBM320_CALIBRATION_DATA_START1  0xD0
#define FBM320_CALIBRATION_DATA_START2  0xF1
#define FBM320_CALIBRATION_DATA_LENGTH  20 // 校准系數數據個數,單位:字節
 
#pragma pack(push, 1)
// FBM320硬件版本
typedef enum _eHardVersion
{
    eVERSION_B1 = 0x00,
    eVERSION_UNKNOWN = 0xFF,
}eHardVersion_t;
// FBM320采樣率
typedef enum _eOsrType
{
    eOSR_1024,
    eOSR_2048,
    eOSR_4096,
    eOSR_8192,
    eOSR_16384,
}eOsrType_t;
// FBM320校准系數
typedef struct _sCalibrationData
{
    signed int c0;
    signed int c1;
    signed int c2;
    signed int c3;
    signed int c4;
    signed int c5;
    signed int c6;
    signed int c7;
    signed int c8;
    signed int c9;
    signed int c10;
    signed int c11;
    signed int c12;
}sCalibrationData_t;
// FBM320數據結構
typedef struct _sFbm320Dev
{
     // 器件參數
    eOsrType_t rate; // 采樣率
    unsigned char chip_id; // 芯片ID
    eHardVersion_t version; // 版本號
    sCalibrationData_t calibration; // 校准系數
 
    // 轉換配置參數
    unsigned char start_pressure; // 氣壓轉換啟動命令
    unsigned char start_temperature; // 溫度轉換啟動命令
    unsigned int convert_time_pressure; // 氣壓轉換時間,單位:us
    unsigned int convert_time_temperature; // 溫度轉換時間,單位:us
}sFbm320Dev_t;
#pragma pack(pop)

// 氣壓計數據結構對象
static sFbm320Dev_t sFbm320Dev;
 
/********************************************************
 * 函數功能:讀FBM320寄存器的值
 * 形    參:addr:寄存器地址
 *           p:數據緩存地址
 *           length:數據長度,單位:字節
 * 返 回 值:0=成功
 *           1=數據緩存異常
 *           2=總線應答超時
 * 開發人員:icode
 ********************************************************/
static unsigned char fbm320_read(unsigned char addr, void * const p, unsigned int length)
{
    unsigned char *pbuf = (unsigned char *)p;
    if(!pbuf || !p || length < 1)
    {
         return 1;
    }
 
 iic_start();
 
 // 發送器件地址(寫模式)
 if(iic_write((FBM320_ADDR << 1) | 0x00) != 0)
 {
  iic_stop();
  return 2; // 應答超時
 }
 
 // 發送器件內部寄存器地址
 if(iic_write(addr) != 0)
 {
  iic_stop();
  return 2; // 應答超時
 }
 
 iic_start();
 
 // 發送器件地址(讀模式)
 if(iic_write((FBM320_ADDR << 1) | 0x01) != 0)
 {
  iic_stop();
  return 2; // 應答超時
 }
 // 讀數據
 for(unsigned int i = 0; i < length; i++)
 {
  pbuf[i] = iic_read((i < (length - 1))? 0 : 1);
 }
 
 iic_stop();
 return 0;
}

/********************************************************
 * 函數功能:寫FBM320寄存器的值
 * 形    參:addr:寄存器地址
 *           p:數據緩存地址
 *           length:數據長度,單位:字節
 * 返 回 值:0=成功
 *           1=數據緩存異常
 *           2=總線應答超時
 * 開發人員:icode
 ********************************************************/
static unsigned char fbm320_write(unsigned char addr, const void *p, unsigned int length)
{
 unsigned char *pbuf = (unsigned char *)p;
 if(!pbuf || !p || length < 1)
 {
  return 1;
 }
 
 iic_start();
 
 // 發送器件地址(寫模式)
 if(iic_write((FBM320_ADDR << 1) | 0x00) != 0)
 {
  iic_stop();
  return 2; // 應答超時
 }
 
 // 發送器件內部寄存器地址
 if(iic_write(addr) != 0)
 {
  iic_stop();
  return 2; // 應答超時
 }
 
 for(unsigned int i = 0; i < length; i++)
 {
  // 發送數據
  if(iic_write(pbuf[i]) != 0)
  {
   iic_stop();
   return 2; // 應答超時
  }
 }
 
 iic_stop();
 return 0;
}

/********************************************************
 * 函數功能:讀FBM320版本號寄存器的值
 * 形    參:psFbm320:數據結構指針
 * 返 回 值:0=成功
 *           1=數據結構指針異常
 *           2=軟件復位失敗
 *           3=讀寄存器失敗
 * 開發人員:icode
 ********************************************************/
static unsigned char fbm320_version_read(sFbm320Dev_t * const psFbm320)
{
 unsigned char wdata = 0;
 unsigned char rdata[2] = {0};
 
 if(!psFbm320)
 {
  return 1; // 參數異常
 }
 // 器件執行復位指令時,總線是沒有應答的
 wdata = FBM320_SOFTWARE_RESET;
 fbm320_write(FBM320_SOFTRESET_REG, &wdata, sizeof(wdata));
 delay_ms(15); // The minimum start up time of fbm320 is 15ms
 
 if(fbm320_read(FBM320_TAKE_MEAS_REG, rdata, sizeof(rdata[0])) != 0)
 {
  return 3; // 讀寄存器失敗
 }
 
 if(fbm320_read(FBM320_VERSION_REG, rdata + 1, sizeof(rdata[0])) != 0)
 {
  return 3; // 讀寄存器失敗
 }
 wdata = ((rdata[0] & 0xC0) >> 6) | ((rdata[1] & 0x70) >> 2);
 if(wdata == eVERSION_B1)
 {
  psFbm320->version = eVERSION_B1;
 }
 else
 {
  // The version of sensor is unknown.
  psFbm320->version = eVERSION_UNKNOWN;
 }
 
 return 0;
}

/********************************************************
 * 函數功能:讀FBM320校准系數寄存器的值
 * 形    參:psFbm320:數據結構指針
 * 返 回 值:0=成功
 *           1=數據結構指針異常
 *           2=校准系數讀取失敗
 * 開發人員:icode
 ********************************************************/
static unsigned char fbm320_calibration_read(sFbm320Dev_t * const psFbm320)
{
 unsigned short word[10] = {0};
 unsigned char byte[FBM320_CALIBRATION_DATA_LENGTH] = {0};
 
 if(!psFbm320)
 {
  return 1; // 參數異常
 }
 // 讀校准系數,地址:0xBB ~ 0xAA
 if(fbm320_read(FBM320_CALIBRATION_DATA_START0, byte, sizeof(byte) - 2) != 0)
 {
  return 2; // 校准系數讀取失敗
 }
 // 讀校准系數,地址:0xD0
 if(fbm320_read(FBM320_CALIBRATION_DATA_START1, byte + 18, sizeof(byte[0])) != 0)
 {
  return 2; // 校准系數讀取失敗
 }
 // 讀校准系數,地址:0xF1
 if (fbm320_read(FBM320_CALIBRATION_DATA_START2, byte + 19, sizeof(byte[0])) != 0)
 {
  return 2; // 校准系數讀取失敗
 }
 
 // 系數重建
 word[0] = (byte[0] << 8 | byte[1]);
 word[1] = (byte[2] << 8 | byte[3]);
 word[2] = (byte[4] << 8 | byte[5]);
 word[3] = (byte[6] << 8 | byte[7]);
 word[4] = (byte[8] << 8 | byte[9]);
 word[5] = (byte[10] << 8 | byte[11]);
 word[6] = (byte[12] << 8 | byte[13]);
 word[7] = (byte[14] << 8 | byte[15]);
 word[8] = (byte[16] << 8 | byte[17]);
 word[9] = (byte[18] << 8 | byte[19]);
 
 psFbm320->calibration.c0 = word[0] >> 4;
 psFbm320->calibration.c1 = ((word[1] & 0xFF00) >> 5 ) | (word[2] & 0x7);
 psFbm320->calibration.c2 = ((word[1] & 0xFF) << 1 ) | (word[4] & 0x1);
 psFbm320->calibration.c3 = word[2] >> 3;
 psFbm320->calibration.c4 = ((unsigned int)word[3] << 2) | (word[0] & 0x3);
 psFbm320->calibration.c5 = word[4] >> 1;
 psFbm320->calibration.c6 = word[5] >> 3;
 psFbm320->calibration.c7 = ((unsigned int)word[6] << 3) | (word[5] & 0x7);
 psFbm320->calibration.c8 = word[7] >> 3;
 psFbm320->calibration.c9 = word[8] >> 2;
 psFbm320->calibration.c10 = ((word[9] & 0xFF00) >> 6) | (word[8] & 0x3);
 psFbm320->calibration.c11 = word[9] & 0xFF;
 psFbm320->calibration.c12 = ((word[0] & 0xC) << 1) | (word[7] & 0x7);
 return 0;
}

/********************************************************
 * 函數功能:FBM320采樣率配置
 * 形    參:psFbm320:數據結構指針
 *           rate:采樣率類型
 * 返 回 值:0=成功
 *           1=數據結構指針異常
 *           2=未知的采樣率類型
 * 開發人員:icode
 ********************************************************/
static unsigned char fbm320_oversampling_rate_config(sFbm320Dev_t * const psFbm320, eOsrType_t rate)
{
 unsigned char rwdata;
 
 if(!psFbm320)
 {
  return 1; // 參數異常
 }
 // 設定壓力測量轉換時間
 switch (rate)
 {
  case eOSR_1024:
  {
   psFbm320->start_pressure = FBM320_MEAS_PRESS_OVERSAMP_0;
   psFbm320->convert_time_pressure = FBM320_CONVERSION_TIME_OSR1024;
   break;
  }
  case eOSR_2048:
  {
   psFbm320->start_pressure = FBM320_MEAS_PRESS_OVERSAMP_1;
   psFbm320->convert_time_pressure = FBM320_CONVERSION_TIME_OSR2048;
   break;
  }
  case eOSR_4096:
  {
   psFbm320->start_pressure = FBM320_MEAS_PRESS_OVERSAMP_2;
   psFbm320->convert_time_pressure = FBM320_CONVERSION_TIME_OSR4096;
   break;
  }
  case eOSR_8192:
  {
   psFbm320->start_pressure = FBM320_MEAS_PRESS_OVERSAMP_3;
   psFbm320->convert_time_pressure = FBM320_CONVERSION_TIME_OSR8192;
   break;
  }
  case eOSR_16384:
  {
   psFbm320->start_pressure = FBM320_MEAS_PRESS_OVERSAMP_2;
   psFbm320->convert_time_pressure = FBM320_CONVERSION_TIME_OSR16384;
   
   fbm320_read(0xA6, &rwdata, sizeof(rwdata));
   rwdata = (rwdata & 0xF8) | 0x6;
   fbm320_write(0xA6, &rwdata, sizeof(rwdata));
   fbm320_read(0xA6, &rwdata, sizeof(rwdata));
   break;
  }
  default:
  {
   return 2; // 未知的采樣率類型
  }
 }
 
 // 保存當前的采樣率
 psFbm320->rate = rate;
 
 // 設定溫度測量轉換時間
 psFbm320->start_temperature = FBM320_MEAS_TEMPERATURE;
 psFbm320->convert_time_temperature = FBM320_CONVERSION_TIME_OSR1024;
 
 return 0;
}

/********************************************************
 * 函數功能:FBM320數據校准
 * 形    參:psFbm320Dev:配置參數指針
 *           psFbm320:數據緩存指針
 * 返 回 值:0=校准完成
 *           1=數據結構指針異常
 * 開發人員:icode
 ********************************************************/
static unsigned char fbm320_calculation(sFbm320Dev_t * const psFbm320Dev, sFbm320_t * const psFbm320)
{
 signed int X01, X02, X03, X11, X12, X13, X21, X22, X23, X24, X25, X26;
 signed int PP1, PP2, PP3, PP4, CF, X31, X32;
 signed int RT, RP, UT, UP, DT, DT2;
 
 if(!psFbm320Dev || !psFbm320)
 {
  return 1;
 }
 // calculation for real temperature value
 UT = psFbm320->raw_temperature;
 DT = ((UT - 8388608) >> 4) + (psFbm320Dev->calibration.c0 << 4);
 X01 = (psFbm320Dev->calibration.c1 + 4498L) * DT >> 1;
 X02 = ((((psFbm320Dev->calibration.c2 - 256L) * DT) >> 14) * DT) >> 4;
 X03 = (((((psFbm320Dev->calibration.c3 * DT) >> 18) * DT) >> 18) * DT);
 DT2 = (X01 + X02 + X03) >> 12;
 RT =  ((2500L << 15) - X01 - X02 - X03) >> 15;
 
 // calculation for real pressure value
 UP = psFbm320->raw_pressure;
 X11 = ((psFbm320Dev->calibration.c5 - 15446L) * DT2);
 X12 = ((((psFbm320Dev->calibration.c6 - 4096L) * DT2) >> 16) * DT2) >> 4;
 X13 = ((X11 + X12) >> 11) + ((psFbm320Dev->calibration.c4 - 122684) << 4);
 X21 = ((psFbm320Dev->calibration.c8 + 1528L) * DT2) >> 11;
 X22 = (((psFbm320Dev->calibration.c9 * DT2) >> 17) * DT2) >> 13;
 X23 = (X22 >= X21) ? (X22 - X21) : (X21 - X22);
 X24 = (X23 >> 11) * (psFbm320Dev->calibration.c7 + 596352);
 X25 = ((X23 & 0x7FF) * (psFbm320Dev->calibration.c7 + 596352)) >> 11;
 X26 = (X21 >= X22 ? ((0 - X24 - X25) >> 9) : ((X24 + X25) >> 9)) + psFbm320Dev->calibration.c7 + 596352;
 PP1 = (((UP - 8388608) >> 1) - X13) >> 4;
 PP2 = ((X26 >> 12) * PP1) >> 1;
 PP3 = ((X26 & 0xFFF) * PP1) >> 13;
 PP4 = (PP2 + PP3) >> 3;
 CF = (2097152 + psFbm320Dev->calibration.c12 * DT2) >> 2;
 X31 = (((CF * psFbm320Dev->calibration.c10) >> 22) * PP4) >> 6;
 X32 = (((((CF * psFbm320Dev->calibration.c11) >> 20) * PP4) >> 22) * PP4);
 RP = ((X31 + X32) >> 11) + PP4 + 100000;
 psFbm320->real_temperature = RT; // uint:0.01 degree Celsius
 psFbm320->real_pressure = RP; // uint: Pa
 return 0;
}

/********************************************************
 * 函數功能:讀FBM320芯片ID
 * 形    參:psFbm320:數據結構指針
 * 返 回 值:0=成功
 *           1=數據結構指針異常
 *           2=讀寄存器失敗
 *           3=芯片ID錯誤
 * 開發人員:icode
 ********************************************************/
static unsigned char fbm320_chip_id_check(sFbm320Dev_t * const psFbm320)
{
 unsigned char chip_id = 0;
 
 if(!psFbm320)
 {
  return 1; // 參數異常
 }
 
 if (fbm320_read(FBM320_CHIP_ID_REG, &chip_id, sizeof(chip_id)) != 0)
 {
  return 2; // 讀寄存器失敗
 }
 
 if(chip_id != FBM320_CHIP_ID)
 {
  return 3; // 芯片ID錯誤
 }
  
 psFbm320->chip_id = FBM320_CHIP_ID;
 return 0;
}

/********************************************************
 * 函數功能:FBM320初始化
 * 形    參:無
 * 返 回 值:0=初始化成功
 *           1=芯片ID讀取失敗
 *           2=版本號讀取失敗
 *           3=校准系數讀取失敗
 * 開發人員:icode
 ********************************************************/
unsigned char fbm320_init(void)
{
 unsigned char rwdata = 0;
 // The minimum start up time of fbm320 is 15ms
 delay_ms(15);
 if(fbm320_chip_id_check(&sFbm320Dev) != 0)
 {
  return 1; // 芯片ID讀取失敗
 }
 
 if(fbm320_version_read(&sFbm320Dev) != 0)
 {
  return 2; // 版本號讀取失敗
 }
 if(fbm320_calibration_read(&sFbm320Dev) != 0)
 {
  return 3; // 校准系數讀取失敗
 }
 // FBM320采樣率配置
 fbm320_oversampling_rate_config(&sFbm320Dev, eOSR_8192);
 
 // Setting the P_CONFIG_REG_GAIN
 fbm320_read(FBM320_P_CONFIG_REG, &rwdata, sizeof(rwdata));
 rwdata &= ~(FBM320_P_CONFIG_REG_GAIN_MAK);
 rwdata |= FBM320_P_CONFIG_REG_GAIN_X32;
 fbm320_write(FBM320_P_CONFIG_REG, &rwdata, sizeof(rwdata));
 return 0;
}

/********************************************************
 * 函數功能:FBM320數據更新
 * 形    參:psFbm320:數據結構指針
 *           ticks:當前的時間,單位:ms
 * 返 回 值:0=數據更新完成
 *           1=啟動溫度測量
 *           2=讀取溫度數據
 *           3=啟動氣壓測量
 *           4=讀取氣壓數據
 *           其它=狀態機異常復位
 *           0xFF=數據結構指針異常
 * 開發人員:icode
 ********************************************************/
unsigned char fbm320_update(sFbm320_t * const psFbm320, unsigned int ticks)
{
 static unsigned char status = 0;
 static unsigned int start_time = 0;
 
 if(!psFbm320)
 {
  return 0xFF;
 }
 
 switch(status)
 {
  case 0: // 用戶處理數據
  {
   status++;
   break;
  }
  case 1: // 啟動溫度測量
  {
   unsigned char wdata = sFbm320Dev.start_temperature;
   if(fbm320_write(FBM320_TAKE_MEAS_REG, &wdata, sizeof(wdata)) == 0)
   {
    // 溫度測量啟動成功
    status++;
    start_time = ticks;
   }
   break;
  }
  case 2: // 讀取溫度值
  {
   // 判斷溫度測量時間
   if((ticks - start_time) * 1000 > sFbm320Dev.convert_time_temperature)
   {
    unsigned char rbuf[3] = {0};
    if(fbm320_read(FBM320_READ_MEAS_REG_U, rbuf, sizeof(rbuf)) == 0)
    {
     status++;
     start_time = 0;
     
     // 溫度數據處理
     ticks = 0;
     ticks = (ticks << 8) + rbuf[0];
     ticks = (ticks << 8) + rbuf[1];
     ticks = (ticks << 8) + rbuf[2];
     psFbm320->raw_temperature = ticks;
    }
   }
   break;
  }
  case 3: // 啟動氣壓測量
  {
   unsigned char wdata = sFbm320Dev.start_pressure;
   if(fbm320_write(FBM320_TAKE_MEAS_REG, &wdata, sizeof(wdata)) == 0)
   {
    // 氣壓測量啟動成功
    status++;
    start_time = ticks;
   }
   break;
  }
  case 4: // 讀取氣壓值
  {
   // 判斷溫度測量時間
   if((ticks - start_time) * 1000 > sFbm320Dev.convert_time_pressure)
   {
    unsigned char rbuf[3] = {0};
    if(fbm320_read(FBM320_READ_MEAS_REG_U, rbuf, sizeof(rbuf)) == 0)
    {
     status = 0;
     start_time = 0;
     
     // 氣壓數據處理
     ticks = 0;
     ticks = (ticks << 8) + rbuf[0];
     ticks = (ticks << 8) + rbuf[1];
     ticks = (ticks << 8) + rbuf[2];
     psFbm320->raw_pressure = ticks;
     
     // 數據校准計算
     fbm320_calculation(&sFbm320Dev, psFbm320);
    }
   }
   break;
  }
  default: // 狀態復位
  {
   // 這里不能將狀態清零,因為零表示用戶可以處理數據
   status = 1;
   break;
  }
 }
 
 return status;
}
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM