天天看點

LPS25HB 氣壓計 的嵌入式程式開發LPS25HB 氣壓計 的嵌入式程式開發

文章目錄

  • LPS25HB 氣壓計 的嵌入式程式開發
    • 開發簡介:
    • 開發過程:

LPS25HB 氣壓計 的嵌入式程式開發

開發簡介:

雖然傳感器的檢測的實體性質不同,但是傳感器的硬體接口一般都有一些相似。如果你做過一種一款傳感器如加速度,溫濕度,那麼其他的傳感器的嵌入式程式實作都差不多。主要涉及這樣幾塊相同的内容:

1、通用接口IIC還是SPI

2、晶片是否支援FIFO的功能。

3、是否支援中斷的機制。

開發過程:

下面以LPS25HB氣壓傳感器為例,簡單介紹開發過程。

1、這裡我們采用IIC的通訊方式,

當然首先需要對MCU的IIC接口進行初始化。

STM32 平台的初始化一般如下:

uint8_t MX_I2C1_Init(void)  //加速度、氣壓傳感器SensorIIC接口
{
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 400000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0x34;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
	
	if( HAL_I2C_GetState( &hi2c1) == HAL_I2C_STATE_READY )
	{
		return 0;
	}
	else
	{
		return 1;
	}

}

           

2、實作IIC的讀寫功能,如果有啟用中斷,則配置中斷管腳及中斷優先級

void BSP_BARO_Init(lps25hb_ctx_t *dev_ctx)
{
	 dev_ctx->write_reg = platform_write;
	 dev_ctx->read_reg =  platform_read;
	 dev_ctx->handle   =   &hi2c1;
	
	 BSP_BARO_IO_ITConfig(); // 使能Baro MEMS 中斷

}
           

3、調試IIC讀寫功能是否正常,我們可以讀取傳感器晶片的 whoamI 值來确認。然後配置已基本的寄存器參數,如果啟用FIFO,那相對就複雜些。預設是ByPass 模式。

void BSP_BARO_Config(lps25hb_ctx_t *dev_ctx)
{	
  /* Check device ID */
  whoamI = 0;
  lps25hb_device_id_get(dev_ctx, &whoamI);
  if ( whoamI != LPS25HB_ID )
    while(1); /*manage here device not found */
  /* Restore default configuration */
  lps25hb_reset_set(dev_ctx, PROPERTY_ENABLE);
  do {
    lps25hb_reset_get(dev_ctx, &rst);
  } while (rst);
	
  /*  Enable Block Data Update */
  lps25hb_block_data_update_set(dev_ctx, PROPERTY_ENABLE);
  /* Set Output Data Rate */
  lps25hb_data_rate_set(dev_ctx, LPS25HB_ODR_25Hz);	

		#ifdef  FIFO_BARO     //如果定義的FIFO功能
	//	lps25hb_fifo_mode_set(dev_ctx,LPS25HB_FIFO_MODE);                					 // 設定 FIFO Mode
		;
		lps25hb_stop_on_fifo_threshold_set(dev_ctx,1);

	//	lps25hb_fifo_set(dev_ctx,1);   //啟用FIFO

		lps25hb_int_pin_mode_set(dev_ctx,LPS25HB_DRDY_OR_FIFO_FLAGS);                     //開啟中斷

		lps25hb_fifo_watermark_set(dev_ctx,0x0F);               				//開啟watermark
	
	   、、 lps25hb_fifo_get(dev_ctx,&testv);
	
  	  //lps25hb_fifo_watermark_set_level(dev_acc,THRESH_MASK);
		
	#endif
  
}
           

4、ByPass 模式下的資料讀取

void BARO_Handle(lps25hb_ctx_t *dev_ctx)
{
	lps25hb_reg_t reg;
	lps25hb_status_get(dev_ctx, &reg.status_reg);

	if (reg.status_reg.p_da)
	{
		memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
		lps25hb_pressure_raw_get(dev_ctx, data_raw_pressure.u8bit);
		pressure_hPa = lps25hb_from_lsb_to_hpa( data_raw_pressure.i32bit);

	}

	if (reg.status_reg.t_da)
	{
		memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
		lps25hb_temperature_raw_get(dev_ctx, data_raw_temperature.u8bit);
		temperature_degC = lps25hb_from_lsb_to_degc( data_raw_temperature.i16bit);
	}	
}


           

ByPass 模式程式簡單,适合一般地應用場景。