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, ®.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 模式程序简单,适合一般地应用场景。