You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							155 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							155 lines
						
					
					
						
							4.6 KiB
						
					
					
				/* | 
						|
 * lps22hb.c | 
						|
 * The LPS22HB is a low power barometer, here used as 1 DoF in a 10 DoF | 
						|
 * absolute orientation solution. | 
						|
 * | 
						|
 *  Created on: Jan 18, 2021 | 
						|
 *      Author: Daniel Peter Chokola | 
						|
 * | 
						|
 *  Adapted From: | 
						|
 *      EM7180_LSM6DSM_XXYYZZ_LPS22HB_Butterfly | 
						|
 *      by: Kris Winer | 
						|
 *      09/23/2017 Copyright Tlera Corporation | 
						|
 * | 
						|
 *  Library may be used freely and without limit with attribution. | 
						|
 */ | 
						|
 | 
						|
/* Includes */ | 
						|
#include <imu_common.h> | 
						|
#include <lps22hb.h> | 
						|
#include <stddef.h> | 
						|
 | 
						|
/* Definitions */ | 
						|
/* | 
						|
 * LPS22H Registers | 
						|
 * http://www.st.com/content/ccc/resource/technical/document/datasheet/bf/c1/4f/23/61/17/44/8a/DM00140895.pdf/files/DM00140895.pdf/jcr:content/translations/en.DM00140895.pdf | 
						|
 */ | 
						|
#define LPS22H_INTERRUPT_CFG 0x0B | 
						|
#define LPS22H_THS_P_L       0x0C | 
						|
#define LPS22H_THS_P_H       0x0D | 
						|
#define LPS22H_WHOAMI        0x0F // should return 0xB1 | 
						|
#define LPS22H_CTRL_REG1     0x10 | 
						|
#define LPS22H_CTRL_REG2     0x11 | 
						|
#define LPS22H_CTRL_REG3     0x12 | 
						|
#define LPS22H_FIFO_CTRL     0x14 | 
						|
#define LPS22H_REF_P_XL      0x15 | 
						|
#define LPS22H_REF_P_L       0x16 | 
						|
#define LPS22H_REF_P_H       0x17 | 
						|
#define LPS22H_RPDS_L        0x18 | 
						|
#define LPS22H_RPDS_H        0x19 | 
						|
#define LPS22H_RES_CONF      0x1A | 
						|
#define LPS22H_INT_SOURCE    0x25 | 
						|
#define LPS22H_FIFO_STATUS   0x26 | 
						|
#define LPS22H_STATUS        0x27 | 
						|
#define LPS22H_PRESS_OUT_XL  0x28 | 
						|
#define LPS22H_PRESS_OUT_L   0x29 | 
						|
#define LPS22H_PRESS_OUT_H   0x2A | 
						|
#define LPS22H_TEMP_OUT_L    0x2B | 
						|
#define LPS22H_TEMP_OUT_H    0x2C | 
						|
#define LPS22H_LPFP_RES      0x33 | 
						|
 | 
						|
/* Macros */ | 
						|
#define lps22hb_read_byte(addr, byte) i2c_read_byte((lps22hb->i2c_read_func), (lps22hb->i2c_addr), (addr), (byte)) | 
						|
#define lps22hb_write_byte(addr, byte) i2c_write_byte((lps22hb->i2c_write_func), (lps22hb->i2c_addr), (addr), (byte)) | 
						|
#define lps22hb_read(addr, data, len) i2c_read((lps22hb->i2c_read_func), (lps22hb->i2c_addr), (addr), (data), (len)) | 
						|
#define lps22hb_write(addr, data, len) i2c_write((lps22hb->i2c_write_func), (lps22hb->i2c_addr), (addr), (data), (len)) | 
						|
 | 
						|
/* Private Global Variables */ | 
						|
 | 
						|
/* Function Prototypes */ | 
						|
 | 
						|
/* Function Definitions */ | 
						|
lps22hb_status_t lps22hb_init(lps22hb_t *lps22hb, lps22hb_init_t *init) | 
						|
{ | 
						|
	int8_t *ptr = (int8_t*) lps22hb; | 
						|
	size_t i; | 
						|
 | 
						|
	return_val_if_fail(lps22hb, LPS22HB_BAD_ARG); | 
						|
	return_val_if_fail(init, LPS22HB_BAD_ARG); | 
						|
 | 
						|
	/* zero lps22hb_t struct */ | 
						|
	for(i = 0; i < sizeof(lps22hb_t); i++) | 
						|
	{ | 
						|
		*ptr++ = 0; | 
						|
	} | 
						|
 | 
						|
	lps22hb->init = init; | 
						|
 | 
						|
	return LPS22HB_OK; | 
						|
} | 
						|
 | 
						|
void lps22hb_set_delay_cb(lps22hb_t *lps22hb, delay_func_t delay_func) | 
						|
{ | 
						|
	return_if_fail(lps22hb); | 
						|
 | 
						|
	lps22hb->delay_func = delay_func; | 
						|
} | 
						|
 | 
						|
void lps22hb_set_i2c_cbs(lps22hb_t *lps22hb, i2c_read_func_t i2c_read_func, | 
						|
                         i2c_write_func_t i2c_write_func, uint8_t dev_addr) | 
						|
{ | 
						|
	return_if_fail(lps22hb); | 
						|
 | 
						|
	lps22hb->i2c_read_func = i2c_read_func; | 
						|
	lps22hb->i2c_write_func = i2c_write_func; | 
						|
	lps22hb->i2c_addr = dev_addr; | 
						|
} | 
						|
 | 
						|
lps22hb_status_t lps22hb_config(lps22hb_t *lps22hb) | 
						|
{ | 
						|
	int32_t ret = 0; | 
						|
 | 
						|
	/* | 
						|
	 * set sample rate by setting bits 6:4 | 
						|
	 * enable low-pass filter by setting bit 3 to one | 
						|
	 * bit 2 == 0 means bandwidth is odr/9, bit 2 == 1 means bandwidth is odr/20 | 
						|
	 * make sure data not updated during read by setting block data udate (bit 1) to 1 | 
						|
	 */ | 
						|
	ret |= lps22hb_write_byte(LPS22H_CTRL_REG1, | 
						|
	                          lps22hb->init->p_odr << 4 | 0x08 | 0x02); | 
						|
	ret |= lps22hb_write_byte(LPS22H_CTRL_REG3, 0x04); // enable data ready as interrupt source | 
						|
 | 
						|
	return ret ? LPS22HB_BAD_COMM : LPS22HB_OK; | 
						|
} | 
						|
 | 
						|
lps22hb_status_t lps22hb_status(lps22hb_t *lps22hb, uint8_t *status) | 
						|
{ | 
						|
	int32_t ret = 0; | 
						|
 | 
						|
	/* read the status register of the altimeter */ | 
						|
	ret |= lps22hb_read_byte(LPS22H_STATUS, status); | 
						|
 | 
						|
	return ret ? LPS22HB_BAD_COMM : LPS22HB_OK; | 
						|
} | 
						|
 | 
						|
lps22hb_status_t lps22hb_chip_id_get(lps22hb_t *lps22hb, uint8_t *data) | 
						|
{ | 
						|
	int32_t ret = 0; | 
						|
 | 
						|
	/* read the WHO_AM_I register of the altimeter; this is a good test of communication */ | 
						|
	ret |= lps22hb_read_byte(LPS22H_WHOAMI, data); // Read WHO_AM_I register for LPS22H | 
						|
 | 
						|
	return ret ? LPS22HB_BAD_COMM : LPS22HB_OK; | 
						|
} | 
						|
 | 
						|
lps22hb_status_t lps22hb_pressure_get(lps22hb_t *lps22hb, int32_t *data) | 
						|
{ | 
						|
	int32_t ret = 0; | 
						|
	uint8_t temp[3];  // 24-bit pressure register data stored here | 
						|
 | 
						|
	ret |= lps22hb_read(LPS22H_PRESS_OUT_XL | 0x80, temp, 3); // bit 7 must be one to read multiple bytes | 
						|
	*data = ((int32_t) temp[2] << 16 | (int32_t) temp[1] << 8 | temp[0]); | 
						|
 | 
						|
	return ret ? LPS22HB_BAD_COMM : LPS22HB_OK; | 
						|
} | 
						|
 | 
						|
lps22hb_status_t lps22hb_temp_get(lps22hb_t *lps22hb, int16_t *data) | 
						|
{ | 
						|
	int32_t ret = 0; | 
						|
	uint8_t temp[2];  // 16-bit pressure register data stored here | 
						|
 | 
						|
	ret |= lps22hb_read(LPS22H_TEMP_OUT_L | 0x80, temp, 2); // bit 7 must be one to read multiple bytes | 
						|
	*data = ((int16_t) temp[1] << 8 | temp[0]); | 
						|
 | 
						|
	return ret ? LPS22HB_BAD_COMM : LPS22HB_OK; | 
						|
}
 | 
						|
 |