虽然传感器的检测的物理性质不同,但是传感器的硬件接口一般都有一些相似。如果你做过一种一款传感器如加速度,温湿度,那么其他的传感器的嵌入式程序实现都差不多。主要涉及这样几块相同的内容: 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 模式程序简单,适合一般地应用场景。