Digital Barometric Pressure Sensor

Committer:
mcm
Date:
Fri Feb 25 15:43:15 2022 +0000
Revision:
3:1217d0c3c926
Parent:
2:b186771f85a2
This driver was completed and tested (NUCLEO-L152RE) and it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:b186771f85a2 1 /**
mcm 2:b186771f85a2 2 * @brief QMP6988.cpp
mcm 2:b186771f85a2 3 * @details Digital Barometric Pressure Sensor.
mcm 2:b186771f85a2 4 * Function file.
mcm 2:b186771f85a2 5 *
mcm 2:b186771f85a2 6 *
mcm 2:b186771f85a2 7 * @return N/A
mcm 2:b186771f85a2 8 *
mcm 2:b186771f85a2 9 * @author Manuel Caballero
mcm 2:b186771f85a2 10 * @date 25/February/2022
mcm 2:b186771f85a2 11 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 12 * @pre N/A.
mcm 2:b186771f85a2 13 * @warning N/A
mcm 2:b186771f85a2 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 2:b186771f85a2 15 */
mcm 2:b186771f85a2 16
mcm 2:b186771f85a2 17 #include "QMP6988.h"
mcm 2:b186771f85a2 18
mcm 2:b186771f85a2 19
mcm 2:b186771f85a2 20 QMP6988::QMP6988 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:b186771f85a2 21 : _i2c ( sda, scl )
mcm 2:b186771f85a2 22 , _QMP6988_Addr ( addr )
mcm 2:b186771f85a2 23 {
mcm 2:b186771f85a2 24 _i2c.frequency( freq );
mcm 2:b186771f85a2 25 }
mcm 2:b186771f85a2 26
mcm 2:b186771f85a2 27
mcm 2:b186771f85a2 28 QMP6988::~QMP6988()
mcm 2:b186771f85a2 29 {
mcm 2:b186771f85a2 30 }
mcm 2:b186771f85a2 31
mcm 2:b186771f85a2 32
mcm 2:b186771f85a2 33
mcm 2:b186771f85a2 34 /**
mcm 2:b186771f85a2 35 * @brief QMP6988_GetRawCompensationCoefficients ( QMP6988_raw_compensation_coefficients_t* )
mcm 2:b186771f85a2 36 * @details It gets the raw compensation coefficients.
mcm 2:b186771f85a2 37 *
mcm 2:b186771f85a2 38 * @param[in] N/A.
mcm 2:b186771f85a2 39 *
mcm 2:b186771f85a2 40 * @param[out] myRawK: Raw compensation coefficients.
mcm 2:b186771f85a2 41 *
mcm 2:b186771f85a2 42 *
mcm 2:b186771f85a2 43 * @return Status of QMP6988_GetRawCompensationCoefficients
mcm 2:b186771f85a2 44 *
mcm 2:b186771f85a2 45 * @author Manuel Caballero
mcm 2:b186771f85a2 46 * @date 25/February/2022
mcm 2:b186771f85a2 47 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 48 * @pre N/A
mcm 2:b186771f85a2 49 * @warning N/A.
mcm 2:b186771f85a2 50 */
mcm 2:b186771f85a2 51 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetRawCompensationCoefficients ( QMP6988_raw_compensation_coefficients_t* myRawK )
mcm 2:b186771f85a2 52 {
mcm 2:b186771f85a2 53 char cmd[25] = { 0 };
mcm 2:b186771f85a2 54 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 55
mcm 2:b186771f85a2 56
mcm 2:b186771f85a2 57 /* Read the register */
mcm 2:b186771f85a2 58 cmd[0] = QMP6988_COE_B00_1;
mcm 2:b186771f85a2 59 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 60 aux |= _i2c.read ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:b186771f85a2 61
mcm 2:b186771f85a2 62 /* Parse the data */
mcm 2:b186771f85a2 63 myRawK->raw_b00 = cmd[0];
mcm 2:b186771f85a2 64 myRawK->raw_b00 <<= 8U;
mcm 2:b186771f85a2 65 myRawK->raw_b00 |= cmd[1];
mcm 2:b186771f85a2 66 myRawK->raw_b00 <<= 4U;
mcm 2:b186771f85a2 67 myRawK->raw_b00 |= ( ( cmd[24] & 0xF0 ) >> 4U );
mcm 2:b186771f85a2 68
mcm 2:b186771f85a2 69 myRawK->raw_bt1 = cmd[2];
mcm 2:b186771f85a2 70 myRawK->raw_bt1 <<= 8U;
mcm 2:b186771f85a2 71 myRawK->raw_bt1 |= cmd[3];
mcm 2:b186771f85a2 72
mcm 2:b186771f85a2 73 myRawK->raw_bt2 = cmd[4];
mcm 2:b186771f85a2 74 myRawK->raw_bt2 <<= 8U;
mcm 2:b186771f85a2 75 myRawK->raw_bt2 |= cmd[5];
mcm 2:b186771f85a2 76
mcm 2:b186771f85a2 77 myRawK->raw_bp1 = cmd[6];
mcm 2:b186771f85a2 78 myRawK->raw_bp1 <<= 8U;
mcm 2:b186771f85a2 79 myRawK->raw_bp1 |= cmd[7];
mcm 2:b186771f85a2 80
mcm 2:b186771f85a2 81 myRawK->raw_b11 = cmd[8];
mcm 2:b186771f85a2 82 myRawK->raw_b11 <<= 8U;
mcm 2:b186771f85a2 83 myRawK->raw_b11 |= cmd[9];
mcm 2:b186771f85a2 84
mcm 2:b186771f85a2 85 myRawK->raw_bp2 = cmd[10];
mcm 2:b186771f85a2 86 myRawK->raw_bp2 <<= 8U;
mcm 2:b186771f85a2 87 myRawK->raw_bp2 |= cmd[11];
mcm 2:b186771f85a2 88
mcm 2:b186771f85a2 89 myRawK->raw_b12 = cmd[12];
mcm 2:b186771f85a2 90 myRawK->raw_b12 <<= 8U;
mcm 2:b186771f85a2 91 myRawK->raw_b12 |= cmd[13];
mcm 2:b186771f85a2 92
mcm 2:b186771f85a2 93 myRawK->raw_b21 = cmd[14];
mcm 2:b186771f85a2 94 myRawK->raw_b21 <<= 8U;
mcm 2:b186771f85a2 95 myRawK->raw_b21 |= cmd[15];
mcm 2:b186771f85a2 96
mcm 2:b186771f85a2 97 myRawK->raw_bp3 = cmd[16];
mcm 2:b186771f85a2 98 myRawK->raw_bp3 <<= 8U;
mcm 2:b186771f85a2 99 myRawK->raw_bp3 |= cmd[17];
mcm 2:b186771f85a2 100
mcm 2:b186771f85a2 101 myRawK->raw_a0 = cmd[18];
mcm 2:b186771f85a2 102 myRawK->raw_a0 <<= 8U;
mcm 2:b186771f85a2 103 myRawK->raw_a0 |= cmd[19];
mcm 2:b186771f85a2 104 myRawK->raw_a0 <<= 4U;
mcm 2:b186771f85a2 105 myRawK->raw_a0 |= ( cmd[24] & 0x0F );
mcm 2:b186771f85a2 106
mcm 2:b186771f85a2 107 myRawK->raw_a1 = cmd[20];
mcm 2:b186771f85a2 108 myRawK->raw_a1 <<= 8U;
mcm 2:b186771f85a2 109 myRawK->raw_a1 |= cmd[21];
mcm 2:b186771f85a2 110
mcm 2:b186771f85a2 111 myRawK->raw_a2 = cmd[22];
mcm 2:b186771f85a2 112 myRawK->raw_a2 <<= 8U;
mcm 2:b186771f85a2 113 myRawK->raw_a2 |= cmd[23];
mcm 2:b186771f85a2 114
mcm 2:b186771f85a2 115
mcm 2:b186771f85a2 116
mcm 2:b186771f85a2 117 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 118 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 119 } else {
mcm 2:b186771f85a2 120 return QMP6988_FAILURE;
mcm 2:b186771f85a2 121 }
mcm 2:b186771f85a2 122 }
mcm 2:b186771f85a2 123
mcm 2:b186771f85a2 124
mcm 2:b186771f85a2 125
mcm 2:b186771f85a2 126 /**
mcm 2:b186771f85a2 127 * @brief QMP6988_GetChipID ( uint8_t* )
mcm 2:b186771f85a2 128 * @details It gets the chip ID.
mcm 2:b186771f85a2 129 *
mcm 2:b186771f85a2 130 * @param[in] N/A.
mcm 2:b186771f85a2 131 *
mcm 2:b186771f85a2 132 * @param[out] myChipID: Chip ID.
mcm 2:b186771f85a2 133 *
mcm 2:b186771f85a2 134 *
mcm 2:b186771f85a2 135 * @return Status of QMP6988_GetChipID
mcm 2:b186771f85a2 136 *
mcm 2:b186771f85a2 137 * @author Manuel Caballero
mcm 2:b186771f85a2 138 * @date 25/February/2022
mcm 2:b186771f85a2 139 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 140 * @pre N/A
mcm 2:b186771f85a2 141 * @warning N/A.
mcm 2:b186771f85a2 142 */
mcm 2:b186771f85a2 143 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetChipID ( uint8_t* myChipID )
mcm 2:b186771f85a2 144 {
mcm 2:b186771f85a2 145 char cmd = 0U;
mcm 2:b186771f85a2 146 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 147
mcm 2:b186771f85a2 148
mcm 2:b186771f85a2 149 /* Read the register */
mcm 2:b186771f85a2 150 cmd = QMP6988_CHIP_ID;
mcm 2:b186771f85a2 151 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 152 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 153
mcm 2:b186771f85a2 154 /* Parse the data */
mcm 2:b186771f85a2 155 *myChipID = cmd;
mcm 2:b186771f85a2 156
mcm 2:b186771f85a2 157
mcm 2:b186771f85a2 158
mcm 2:b186771f85a2 159 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 160 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 161 } else {
mcm 2:b186771f85a2 162 return QMP6988_FAILURE;
mcm 2:b186771f85a2 163 }
mcm 2:b186771f85a2 164 }
mcm 2:b186771f85a2 165
mcm 2:b186771f85a2 166
mcm 2:b186771f85a2 167
mcm 2:b186771f85a2 168 /**
mcm 2:b186771f85a2 169 * @brief QMP6988_SoftReset ( void )
mcm 2:b186771f85a2 170 * @details It performs a software reset.
mcm 2:b186771f85a2 171 *
mcm 2:b186771f85a2 172 * @param[in] N/A.
mcm 2:b186771f85a2 173 *
mcm 2:b186771f85a2 174 * @param[out] N/A.
mcm 2:b186771f85a2 175 *
mcm 2:b186771f85a2 176 *
mcm 2:b186771f85a2 177 * @return Status of QMP6988_SoftReset
mcm 2:b186771f85a2 178 *
mcm 2:b186771f85a2 179 * @author Manuel Caballero
mcm 2:b186771f85a2 180 * @date 25/February/2022
mcm 2:b186771f85a2 181 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 182 * @pre N/A
mcm 2:b186771f85a2 183 * @warning The user must wait for at least 100us (Trst) after using this function.
mcm 2:b186771f85a2 184 */
mcm 2:b186771f85a2 185 QMP6988::QMP6988_status_t QMP6988::QMP6988_SoftReset ( void )
mcm 2:b186771f85a2 186 {
mcm 2:b186771f85a2 187 char cmd = 0U;
mcm 2:b186771f85a2 188 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 189
mcm 2:b186771f85a2 190
mcm 2:b186771f85a2 191 /* Read the register */
mcm 2:b186771f85a2 192 cmd = QMP6988_RESET;
mcm 2:b186771f85a2 193 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, false );
mcm 2:b186771f85a2 194
mcm 2:b186771f85a2 195
mcm 2:b186771f85a2 196
mcm 2:b186771f85a2 197 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 198 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 199 } else {
mcm 2:b186771f85a2 200 return QMP6988_FAILURE;
mcm 2:b186771f85a2 201 }
mcm 2:b186771f85a2 202 }
mcm 2:b186771f85a2 203
mcm 2:b186771f85a2 204
mcm 2:b186771f85a2 205
mcm 2:b186771f85a2 206 /**
mcm 2:b186771f85a2 207 * @brief QMP6988_SetIIR_Filter ( QMP6988_iir_filter_t )
mcm 2:b186771f85a2 208 * @details It sets the IIR filter co-efficient.
mcm 2:b186771f85a2 209 *
mcm 2:b186771f85a2 210 * @param[in] N/A.
mcm 2:b186771f85a2 211 * @param[in] myFilter: IIR filter
mcm 2:b186771f85a2 212 *
mcm 2:b186771f85a2 213 * @param[out] N/A.
mcm 2:b186771f85a2 214 *
mcm 2:b186771f85a2 215 *
mcm 2:b186771f85a2 216 * @return Status of QMP6988_SetIIR_Filter
mcm 2:b186771f85a2 217 *
mcm 2:b186771f85a2 218 * @author Manuel Caballero
mcm 2:b186771f85a2 219 * @date 25/February/2022
mcm 2:b186771f85a2 220 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 221 * @pre N/A
mcm 2:b186771f85a2 222 * @warning N/A.
mcm 2:b186771f85a2 223 */
mcm 2:b186771f85a2 224 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetIIR_Filter ( QMP6988_iir_filter_t myFilter )
mcm 2:b186771f85a2 225 {
mcm 2:b186771f85a2 226 char cmd[2] = { 0U };
mcm 2:b186771f85a2 227 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 228
mcm 2:b186771f85a2 229
mcm 2:b186771f85a2 230 /* Write the register */
mcm 2:b186771f85a2 231 cmd[0] = QMP6988_IIR_CNT;
mcm 2:b186771f85a2 232 cmd[1] = myFilter;
mcm 2:b186771f85a2 233 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 234
mcm 2:b186771f85a2 235
mcm 2:b186771f85a2 236
mcm 2:b186771f85a2 237 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 238 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 239 } else {
mcm 2:b186771f85a2 240 return QMP6988_FAILURE;
mcm 2:b186771f85a2 241 }
mcm 2:b186771f85a2 242 }
mcm 2:b186771f85a2 243
mcm 2:b186771f85a2 244
mcm 2:b186771f85a2 245
mcm 2:b186771f85a2 246 /**
mcm 2:b186771f85a2 247 * @brief QMP6988_GetIIR_Filter ( QMP6988_iir_filter_t* )
mcm 2:b186771f85a2 248 * @details It gets the IIR filter co-efficient.
mcm 2:b186771f85a2 249 *
mcm 2:b186771f85a2 250 * @param[in] N/A.
mcm 2:b186771f85a2 251 *
mcm 2:b186771f85a2 252 * @param[out] myFilter: IIR filter.
mcm 2:b186771f85a2 253 *
mcm 2:b186771f85a2 254 *
mcm 2:b186771f85a2 255 * @return Status of QMP6988_GetIIR_Filter
mcm 2:b186771f85a2 256 *
mcm 2:b186771f85a2 257 * @author Manuel Caballero
mcm 2:b186771f85a2 258 * @date 25/February/2022
mcm 2:b186771f85a2 259 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 260 * @pre N/A
mcm 2:b186771f85a2 261 * @warning N/A.
mcm 2:b186771f85a2 262 */
mcm 2:b186771f85a2 263 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetIIR_Filter ( QMP6988_iir_filter_t* myFilter )
mcm 2:b186771f85a2 264 {
mcm 2:b186771f85a2 265 char cmd = 0U;
mcm 2:b186771f85a2 266 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 267
mcm 2:b186771f85a2 268
mcm 2:b186771f85a2 269 /* Read the register */
mcm 2:b186771f85a2 270 cmd = QMP6988_IIR_CNT;
mcm 2:b186771f85a2 271 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 272 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 273
mcm 2:b186771f85a2 274 /* Parse the data */
mcm 2:b186771f85a2 275 *myFilter = (QMP6988_iir_filter_t)cmd;
mcm 2:b186771f85a2 276
mcm 2:b186771f85a2 277
mcm 2:b186771f85a2 278
mcm 2:b186771f85a2 279 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 280 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 281 } else {
mcm 2:b186771f85a2 282 return QMP6988_FAILURE;
mcm 2:b186771f85a2 283 }
mcm 2:b186771f85a2 284 }
mcm 2:b186771f85a2 285
mcm 2:b186771f85a2 286
mcm 2:b186771f85a2 287
mcm 2:b186771f85a2 288 /**
mcm 2:b186771f85a2 289 * @brief QMP6988_SetMasterCodeI2C ( QMP6988_i2c_set_master_code_t )
mcm 2:b186771f85a2 290 * @details It sets the master code setting at I2C HS mode.
mcm 2:b186771f85a2 291 *
mcm 2:b186771f85a2 292 * @param[in] myMasterCode: Master code setting at I2C HS mode
mcm 2:b186771f85a2 293 *
mcm 2:b186771f85a2 294 * @param[out] N/A.
mcm 2:b186771f85a2 295 *
mcm 2:b186771f85a2 296 *
mcm 2:b186771f85a2 297 * @return Status of QMP6988_SetMasterCodeI2C
mcm 2:b186771f85a2 298 *
mcm 2:b186771f85a2 299 * @author Manuel Caballero
mcm 2:b186771f85a2 300 * @date 25/February/2022
mcm 2:b186771f85a2 301 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 302 * @pre N/A
mcm 2:b186771f85a2 303 * @warning N/A.
mcm 2:b186771f85a2 304 */
mcm 2:b186771f85a2 305 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetMasterCodeI2C ( QMP6988_i2c_set_master_code_t myMasterCode )
mcm 2:b186771f85a2 306 {
mcm 2:b186771f85a2 307 char cmd[2] = { 0U };
mcm 2:b186771f85a2 308 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 309
mcm 2:b186771f85a2 310
mcm 2:b186771f85a2 311 /* Write the register */
mcm 2:b186771f85a2 312 cmd[0] = QMP6988_I2C_SET;
mcm 2:b186771f85a2 313 cmd[1] = myMasterCode;
mcm 2:b186771f85a2 314 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 315
mcm 2:b186771f85a2 316
mcm 2:b186771f85a2 317
mcm 2:b186771f85a2 318 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 319 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 320 } else {
mcm 2:b186771f85a2 321 return QMP6988_FAILURE;
mcm 2:b186771f85a2 322 }
mcm 2:b186771f85a2 323 }
mcm 2:b186771f85a2 324
mcm 2:b186771f85a2 325
mcm 2:b186771f85a2 326
mcm 2:b186771f85a2 327 /**
mcm 2:b186771f85a2 328 * @brief QMP6988_GetMasterCodeI2C ( QMP6988_i2c_set_master_code_t* )
mcm 2:b186771f85a2 329 * @details It gets the master code setting at I2C HS mode.
mcm 2:b186771f85a2 330 *
mcm 2:b186771f85a2 331 * @param[in] N/A.
mcm 2:b186771f85a2 332 *
mcm 2:b186771f85a2 333 * @param[out] myMasterCode: Master code setting at I2C HS mode.
mcm 2:b186771f85a2 334 *
mcm 2:b186771f85a2 335 *
mcm 2:b186771f85a2 336 * @return Status of QMP6988_GetMasterCodeI2C
mcm 2:b186771f85a2 337 *
mcm 2:b186771f85a2 338 * @author Manuel Caballero
mcm 2:b186771f85a2 339 * @date 25/February/2022
mcm 2:b186771f85a2 340 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 341 * @pre N/A
mcm 2:b186771f85a2 342 * @warning N/A.
mcm 2:b186771f85a2 343 */
mcm 2:b186771f85a2 344 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetMasterCodeI2C ( QMP6988_i2c_set_master_code_t* myMasterCode )
mcm 2:b186771f85a2 345 {
mcm 2:b186771f85a2 346 char cmd = 0U;
mcm 2:b186771f85a2 347 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 348
mcm 2:b186771f85a2 349
mcm 2:b186771f85a2 350 /* Read the register */
mcm 2:b186771f85a2 351 cmd = QMP6988_I2C_SET;
mcm 2:b186771f85a2 352 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 353 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 354
mcm 2:b186771f85a2 355 /* Parse the data */
mcm 2:b186771f85a2 356 *myMasterCode = (QMP6988_i2c_set_master_code_t)cmd;
mcm 2:b186771f85a2 357
mcm 2:b186771f85a2 358
mcm 2:b186771f85a2 359
mcm 2:b186771f85a2 360 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 361 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 362 } else {
mcm 2:b186771f85a2 363 return QMP6988_FAILURE;
mcm 2:b186771f85a2 364 }
mcm 2:b186771f85a2 365 }
mcm 2:b186771f85a2 366
mcm 2:b186771f85a2 367
mcm 2:b186771f85a2 368
mcm 2:b186771f85a2 369 /**
mcm 2:b186771f85a2 370 * @brief QMP6988_GetDeviceStat ( uint8_t* )
mcm 2:b186771f85a2 371 * @details It gets the device stat.
mcm 2:b186771f85a2 372 *
mcm 2:b186771f85a2 373 * @param[in] N/A.
mcm 2:b186771f85a2 374 *
mcm 2:b186771f85a2 375 * @param[out] myDeviceStat: Device stat: Measure and OTP update.
mcm 2:b186771f85a2 376 *
mcm 2:b186771f85a2 377 *
mcm 2:b186771f85a2 378 * @return Status of QMP6988_GetDeviceStat
mcm 2:b186771f85a2 379 *
mcm 2:b186771f85a2 380 * @author Manuel Caballero
mcm 2:b186771f85a2 381 * @date 25/February/2022
mcm 2:b186771f85a2 382 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 383 * @pre N/A
mcm 2:b186771f85a2 384 * @warning N/A.
mcm 2:b186771f85a2 385 */
mcm 2:b186771f85a2 386 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetDeviceStat ( uint8_t* myDeviceStat )
mcm 2:b186771f85a2 387 {
mcm 2:b186771f85a2 388 char cmd = 0U;
mcm 2:b186771f85a2 389 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 390
mcm 2:b186771f85a2 391
mcm 2:b186771f85a2 392 /* Read the register */
mcm 2:b186771f85a2 393 cmd = QMP6988_DEVICE_STAT;
mcm 2:b186771f85a2 394 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 395 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 396
mcm 2:b186771f85a2 397 /* Parse the data */
mcm 2:b186771f85a2 398 *myDeviceStat = cmd;
mcm 2:b186771f85a2 399
mcm 2:b186771f85a2 400
mcm 2:b186771f85a2 401
mcm 2:b186771f85a2 402 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 403 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 404 } else {
mcm 2:b186771f85a2 405 return QMP6988_FAILURE;
mcm 2:b186771f85a2 406 }
mcm 2:b186771f85a2 407 }
mcm 2:b186771f85a2 408
mcm 2:b186771f85a2 409
mcm 2:b186771f85a2 410
mcm 2:b186771f85a2 411 /**
mcm 2:b186771f85a2 412 * @brief QMP6988_SetPowerMode ( QMP6988_ctrl_meas_power_mode_t )
mcm 2:b186771f85a2 413 * @details It sets the power mode.
mcm 2:b186771f85a2 414 *
mcm 2:b186771f85a2 415 * @param[in] myPowerMode: Power mode setting.
mcm 2:b186771f85a2 416 *
mcm 2:b186771f85a2 417 * @param[out] N/A.
mcm 2:b186771f85a2 418 *
mcm 2:b186771f85a2 419 *
mcm 2:b186771f85a2 420 * @return Status of QMP6988_SetPowerMode
mcm 2:b186771f85a2 421 *
mcm 2:b186771f85a2 422 * @author Manuel Caballero
mcm 2:b186771f85a2 423 * @date 25/February/2022
mcm 2:b186771f85a2 424 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 425 * @pre N/A
mcm 2:b186771f85a2 426 * @warning N/A.
mcm 2:b186771f85a2 427 */
mcm 2:b186771f85a2 428 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetPowerMode ( QMP6988_ctrl_meas_power_mode_t myPowerMode )
mcm 2:b186771f85a2 429 {
mcm 2:b186771f85a2 430 char cmd[2] = { 0U };
mcm 2:b186771f85a2 431 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 432
mcm 2:b186771f85a2 433
mcm 2:b186771f85a2 434 /* Read the register */
mcm 2:b186771f85a2 435 cmd[0] = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 436 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 437 aux |= _i2c.read ( _QMP6988_Addr, &cmd[1], 1U );
mcm 2:b186771f85a2 438
mcm 2:b186771f85a2 439 /* Update the register */
mcm 2:b186771f85a2 440 cmd[0] = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 441 cmd[1] &= ~CTRL_MEAS_POWER_MODE_MASK;
mcm 2:b186771f85a2 442 cmd[1] |= myPowerMode;
mcm 2:b186771f85a2 443 aux |= _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 444
mcm 2:b186771f85a2 445
mcm 2:b186771f85a2 446
mcm 2:b186771f85a2 447 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 448 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 449 } else {
mcm 2:b186771f85a2 450 return QMP6988_FAILURE;
mcm 2:b186771f85a2 451 }
mcm 2:b186771f85a2 452 }
mcm 2:b186771f85a2 453
mcm 2:b186771f85a2 454
mcm 2:b186771f85a2 455
mcm 2:b186771f85a2 456 /**
mcm 2:b186771f85a2 457 * @brief QMP6988_GetPowerMode ( QMP6988_ctrl_meas_power_mode_t* )
mcm 2:b186771f85a2 458 * @details It gets the power mode.
mcm 2:b186771f85a2 459 *
mcm 2:b186771f85a2 460 * @param[in] N/A.
mcm 2:b186771f85a2 461 *
mcm 2:b186771f85a2 462 * @param[out] myPowerMode: Power mode setting.
mcm 2:b186771f85a2 463 *
mcm 2:b186771f85a2 464 *
mcm 2:b186771f85a2 465 * @return Status of QMP6988_GetPowerMode
mcm 2:b186771f85a2 466 *
mcm 2:b186771f85a2 467 * @author Manuel Caballero
mcm 2:b186771f85a2 468 * @date 25/February/2022
mcm 2:b186771f85a2 469 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 470 * @pre N/A
mcm 2:b186771f85a2 471 * @warning N/A.
mcm 2:b186771f85a2 472 */
mcm 2:b186771f85a2 473 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetPowerMode ( QMP6988_ctrl_meas_power_mode_t* myPowerMode )
mcm 2:b186771f85a2 474 {
mcm 2:b186771f85a2 475 char cmd = 0U;
mcm 2:b186771f85a2 476 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 477
mcm 2:b186771f85a2 478
mcm 2:b186771f85a2 479 /* Read the register */
mcm 2:b186771f85a2 480 cmd = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 481 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 482 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 483
mcm 2:b186771f85a2 484 /* Parse the data */
mcm 2:b186771f85a2 485 *myPowerMode = (QMP6988_ctrl_meas_power_mode_t)( cmd & CTRL_MEAS_POWER_MODE_MASK );
mcm 2:b186771f85a2 486
mcm 2:b186771f85a2 487
mcm 2:b186771f85a2 488
mcm 2:b186771f85a2 489 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 490 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 491 } else {
mcm 2:b186771f85a2 492 return QMP6988_FAILURE;
mcm 2:b186771f85a2 493 }
mcm 2:b186771f85a2 494 }
mcm 2:b186771f85a2 495
mcm 2:b186771f85a2 496
mcm 2:b186771f85a2 497
mcm 2:b186771f85a2 498 /**
mcm 2:b186771f85a2 499 * @brief QMP6988_SetTemperatureAverage ( QMP6988_ctrl_meas_temp_average_t )
mcm 2:b186771f85a2 500 * @details It sets the temperature averaging time.
mcm 2:b186771f85a2 501 *
mcm 2:b186771f85a2 502 * @param[in] myTempAvrg: Temperature averaging time.
mcm 2:b186771f85a2 503 *
mcm 2:b186771f85a2 504 * @param[out] N/A.
mcm 2:b186771f85a2 505 *
mcm 2:b186771f85a2 506 *
mcm 2:b186771f85a2 507 * @return Status of QMP6988_SetTemperatureAverage
mcm 2:b186771f85a2 508 *
mcm 2:b186771f85a2 509 * @author Manuel Caballero
mcm 2:b186771f85a2 510 * @date 25/February/2022
mcm 2:b186771f85a2 511 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 512 * @pre N/A
mcm 2:b186771f85a2 513 * @warning N/A.
mcm 2:b186771f85a2 514 */
mcm 2:b186771f85a2 515 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetTemperatureAverage ( QMP6988_ctrl_meas_temp_average_t myTempAvrg )
mcm 2:b186771f85a2 516 {
mcm 2:b186771f85a2 517 char cmd[2] = { 0U };
mcm 2:b186771f85a2 518 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 519
mcm 2:b186771f85a2 520
mcm 2:b186771f85a2 521 /* Read the register */
mcm 2:b186771f85a2 522 cmd[0] = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 523 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 524 aux |= _i2c.read ( _QMP6988_Addr, &cmd[1], 1U );
mcm 2:b186771f85a2 525
mcm 2:b186771f85a2 526 /* Update the register */
mcm 2:b186771f85a2 527 cmd[0] = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 528 cmd[1] &= ~CTRL_MEAS_TEMP_AVERAGE_MASK;
mcm 2:b186771f85a2 529 cmd[1] |= myTempAvrg;
mcm 2:b186771f85a2 530 aux |= _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 531
mcm 2:b186771f85a2 532
mcm 2:b186771f85a2 533
mcm 2:b186771f85a2 534 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 535 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 536 } else {
mcm 2:b186771f85a2 537 return QMP6988_FAILURE;
mcm 2:b186771f85a2 538 }
mcm 2:b186771f85a2 539 }
mcm 2:b186771f85a2 540
mcm 2:b186771f85a2 541
mcm 2:b186771f85a2 542
mcm 2:b186771f85a2 543 /**
mcm 2:b186771f85a2 544 * @brief QMP6988_GetTemperatureAverage ( QMP6988_ctrl_meas_temp_average_t* )
mcm 2:b186771f85a2 545 * @details It gets the temperature averaging time.
mcm 2:b186771f85a2 546 *
mcm 2:b186771f85a2 547 * @param[in] N/A.
mcm 2:b186771f85a2 548 *
mcm 2:b186771f85a2 549 * @param[out] myTempAvrg: Temperature averaging time.
mcm 2:b186771f85a2 550 *
mcm 2:b186771f85a2 551 *
mcm 2:b186771f85a2 552 * @return Status of QMP6988_GetTemperatureAverage
mcm 2:b186771f85a2 553 *
mcm 2:b186771f85a2 554 * @author Manuel Caballero
mcm 2:b186771f85a2 555 * @date 25/February/2022
mcm 2:b186771f85a2 556 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 557 * @pre N/A
mcm 2:b186771f85a2 558 * @warning N/A.
mcm 2:b186771f85a2 559 */
mcm 2:b186771f85a2 560 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetTemperatureAverage ( QMP6988_ctrl_meas_temp_average_t* myTempAvrg )
mcm 2:b186771f85a2 561 {
mcm 2:b186771f85a2 562 char cmd = 0U;
mcm 2:b186771f85a2 563 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 564
mcm 2:b186771f85a2 565
mcm 2:b186771f85a2 566 /* Read the register */
mcm 2:b186771f85a2 567 cmd = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 568 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 569 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 570
mcm 2:b186771f85a2 571 /* Parse the data */
mcm 2:b186771f85a2 572 *myTempAvrg = (QMP6988_ctrl_meas_temp_average_t)( cmd & CTRL_MEAS_TEMP_AVERAGE_MASK );
mcm 2:b186771f85a2 573
mcm 2:b186771f85a2 574
mcm 2:b186771f85a2 575
mcm 2:b186771f85a2 576 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 577 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 578 } else {
mcm 2:b186771f85a2 579 return QMP6988_FAILURE;
mcm 2:b186771f85a2 580 }
mcm 2:b186771f85a2 581 }
mcm 2:b186771f85a2 582
mcm 2:b186771f85a2 583
mcm 2:b186771f85a2 584
mcm 2:b186771f85a2 585 /**
mcm 2:b186771f85a2 586 * @brief QMP6988_SetPressureAverage ( QMP6988_ctrl_meas_press_average_t )
mcm 2:b186771f85a2 587 * @details It sets the pressure averaging time.
mcm 2:b186771f85a2 588 *
mcm 2:b186771f85a2 589 * @param[in] myPressAvrg: Pressure averaging time.
mcm 2:b186771f85a2 590 *
mcm 2:b186771f85a2 591 * @param[out] N/A.
mcm 2:b186771f85a2 592 *
mcm 2:b186771f85a2 593 *
mcm 2:b186771f85a2 594 * @return Status of QMP6988_SetPressureAverage
mcm 2:b186771f85a2 595 *
mcm 2:b186771f85a2 596 * @author Manuel Caballero
mcm 2:b186771f85a2 597 * @date 25/February/2022
mcm 2:b186771f85a2 598 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 599 * @pre N/A
mcm 2:b186771f85a2 600 * @warning N/A.
mcm 2:b186771f85a2 601 */
mcm 2:b186771f85a2 602 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetPressureAverage ( QMP6988_ctrl_meas_press_average_t myPressAvrg )
mcm 2:b186771f85a2 603 {
mcm 2:b186771f85a2 604 char cmd[2] = { 0U };
mcm 2:b186771f85a2 605 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 606
mcm 2:b186771f85a2 607
mcm 2:b186771f85a2 608 /* Read the register */
mcm 2:b186771f85a2 609 cmd[0] = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 610 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 611 aux |= _i2c.read ( _QMP6988_Addr, &cmd[1], 1U );
mcm 2:b186771f85a2 612
mcm 2:b186771f85a2 613 /* Update the register */
mcm 2:b186771f85a2 614 cmd[0] = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 615 cmd[1] &= ~CTRL_MEAS_PRESS_AVERAGE_MASK;
mcm 2:b186771f85a2 616 cmd[1] |= myPressAvrg;
mcm 2:b186771f85a2 617 aux |= _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 618
mcm 2:b186771f85a2 619
mcm 2:b186771f85a2 620
mcm 2:b186771f85a2 621 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 622 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 623 } else {
mcm 2:b186771f85a2 624 return QMP6988_FAILURE;
mcm 2:b186771f85a2 625 }
mcm 2:b186771f85a2 626 }
mcm 2:b186771f85a2 627
mcm 2:b186771f85a2 628
mcm 2:b186771f85a2 629
mcm 2:b186771f85a2 630 /**
mcm 2:b186771f85a2 631 * @brief QMP6988_GetPressureAverage ( QMP6988_ctrl_meas_press_average_t* )
mcm 2:b186771f85a2 632 * @details It gets the pressure averaging time.
mcm 2:b186771f85a2 633 *
mcm 2:b186771f85a2 634 * @param[in] N/A.
mcm 2:b186771f85a2 635 *
mcm 2:b186771f85a2 636 * @param[out] myPressAvrg: Pressure averaging time.
mcm 2:b186771f85a2 637 *
mcm 2:b186771f85a2 638 *
mcm 2:b186771f85a2 639 * @return Status of QMP6988_GetPressureAverage
mcm 2:b186771f85a2 640 *
mcm 2:b186771f85a2 641 * @author Manuel Caballero
mcm 2:b186771f85a2 642 * @date 25/February/2022
mcm 2:b186771f85a2 643 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 644 * @pre N/A
mcm 2:b186771f85a2 645 * @warning N/A.
mcm 2:b186771f85a2 646 */
mcm 2:b186771f85a2 647 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetPressureAverage ( QMP6988_ctrl_meas_press_average_t* myPressAvrg )
mcm 2:b186771f85a2 648 {
mcm 2:b186771f85a2 649 char cmd = 0U;
mcm 2:b186771f85a2 650 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 651
mcm 2:b186771f85a2 652
mcm 2:b186771f85a2 653 /* Read the register */
mcm 2:b186771f85a2 654 cmd = QMP6988_CTRL_MEAS;
mcm 2:b186771f85a2 655 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 656 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 657
mcm 2:b186771f85a2 658 /* Parse the data */
mcm 2:b186771f85a2 659 *myPressAvrg = (QMP6988_ctrl_meas_press_average_t)( cmd & CTRL_MEAS_PRESS_AVERAGE_MASK );
mcm 2:b186771f85a2 660
mcm 2:b186771f85a2 661
mcm 2:b186771f85a2 662
mcm 2:b186771f85a2 663 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 664 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 665 } else {
mcm 2:b186771f85a2 666 return QMP6988_FAILURE;
mcm 2:b186771f85a2 667 }
mcm 2:b186771f85a2 668 }
mcm 2:b186771f85a2 669
mcm 2:b186771f85a2 670
mcm 2:b186771f85a2 671
mcm 2:b186771f85a2 672 /**
mcm 2:b186771f85a2 673 * @brief QMP6988_SetStandbyTimeSetting ( QMP6988_io_setup_t_standby_t )
mcm 2:b186771f85a2 674 * @details It sets the standby time setting.
mcm 2:b186771f85a2 675 *
mcm 2:b186771f85a2 676 * @param[in] myStandbyTime: Standby time setting.
mcm 2:b186771f85a2 677 *
mcm 2:b186771f85a2 678 * @param[out] N/A.
mcm 2:b186771f85a2 679 *
mcm 2:b186771f85a2 680 *
mcm 2:b186771f85a2 681 * @return Status of QMP6988_SetStandbyTimeSetting
mcm 2:b186771f85a2 682 *
mcm 2:b186771f85a2 683 * @author Manuel Caballero
mcm 2:b186771f85a2 684 * @date 25/February/2022
mcm 2:b186771f85a2 685 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 686 * @pre N/A
mcm 2:b186771f85a2 687 * @warning N/A.
mcm 2:b186771f85a2 688 */
mcm 2:b186771f85a2 689 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetStandbyTimeSetting ( QMP6988_io_setup_t_standby_t myStandbyTime )
mcm 2:b186771f85a2 690 {
mcm 2:b186771f85a2 691 char cmd[2] = { 0U };
mcm 2:b186771f85a2 692 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 693
mcm 2:b186771f85a2 694
mcm 2:b186771f85a2 695 /* Read the register */
mcm 2:b186771f85a2 696 cmd[0] = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 697 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 698 aux |= _i2c.read ( _QMP6988_Addr, &cmd[1], 1U );
mcm 2:b186771f85a2 699
mcm 2:b186771f85a2 700 /* Update the register */
mcm 2:b186771f85a2 701 cmd[0] = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 702 cmd[1] &= ~IO_SETUP_T_STANDBY_MASK;
mcm 2:b186771f85a2 703 cmd[1] |= myStandbyTime;
mcm 2:b186771f85a2 704 aux |= _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 705
mcm 2:b186771f85a2 706
mcm 2:b186771f85a2 707
mcm 2:b186771f85a2 708 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 709 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 710 } else {
mcm 2:b186771f85a2 711 return QMP6988_FAILURE;
mcm 2:b186771f85a2 712 }
mcm 2:b186771f85a2 713 }
mcm 2:b186771f85a2 714
mcm 2:b186771f85a2 715
mcm 2:b186771f85a2 716
mcm 2:b186771f85a2 717 /**
mcm 2:b186771f85a2 718 * @brief QMP6988_GetStandbyTimeSetting ( QMP6988_io_setup_t_standby_t* )
mcm 2:b186771f85a2 719 * @details It gets the standby time setting.
mcm 2:b186771f85a2 720 *
mcm 2:b186771f85a2 721 * @param[in] N/A.
mcm 2:b186771f85a2 722 *
mcm 2:b186771f85a2 723 * @param[out] myStandbyTime: Standby time setting.
mcm 2:b186771f85a2 724 *
mcm 2:b186771f85a2 725 *
mcm 2:b186771f85a2 726 * @return Status of QMP6988_GetStandbyTimeSetting
mcm 2:b186771f85a2 727 *
mcm 2:b186771f85a2 728 * @author Manuel Caballero
mcm 2:b186771f85a2 729 * @date 25/February/2022
mcm 2:b186771f85a2 730 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 731 * @pre N/A
mcm 2:b186771f85a2 732 * @warning N/A.
mcm 2:b186771f85a2 733 */
mcm 2:b186771f85a2 734 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetStandbyTimeSetting ( QMP6988_io_setup_t_standby_t* myStandbyTime )
mcm 2:b186771f85a2 735 {
mcm 2:b186771f85a2 736 char cmd = 0U;
mcm 2:b186771f85a2 737 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 738
mcm 2:b186771f85a2 739
mcm 2:b186771f85a2 740 /* Read the register */
mcm 2:b186771f85a2 741 cmd = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 742 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 743 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 744
mcm 2:b186771f85a2 745 /* Parse the data */
mcm 2:b186771f85a2 746 *myStandbyTime = (QMP6988_io_setup_t_standby_t)( cmd & IO_SETUP_T_STANDBY_MASK );
mcm 2:b186771f85a2 747
mcm 2:b186771f85a2 748
mcm 2:b186771f85a2 749
mcm 2:b186771f85a2 750 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 751 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 752 } else {
mcm 2:b186771f85a2 753 return QMP6988_FAILURE;
mcm 2:b186771f85a2 754 }
mcm 2:b186771f85a2 755 }
mcm 2:b186771f85a2 756
mcm 2:b186771f85a2 757
mcm 2:b186771f85a2 758
mcm 2:b186771f85a2 759 /**
mcm 2:b186771f85a2 760 * @brief QMP6988_SetSPI_ModeSetting ( QMP6988_io_setup_spi3w_t )
mcm 2:b186771f85a2 761 * @details It sets the SPI mode setting (4 or 3 wire).
mcm 2:b186771f85a2 762 *
mcm 2:b186771f85a2 763 * @param[in] mySPI: the SPI mode setting (4 or 3 wire).
mcm 2:b186771f85a2 764 *
mcm 2:b186771f85a2 765 * @param[out] N/A.
mcm 2:b186771f85a2 766 *
mcm 2:b186771f85a2 767 *
mcm 2:b186771f85a2 768 * @return Status of QMP6988_SetSPI_ModeSetting
mcm 2:b186771f85a2 769 *
mcm 2:b186771f85a2 770 * @author Manuel Caballero
mcm 2:b186771f85a2 771 * @date 25/February/2022
mcm 2:b186771f85a2 772 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 773 * @pre N/A
mcm 2:b186771f85a2 774 * @warning N/A.
mcm 2:b186771f85a2 775 */
mcm 2:b186771f85a2 776 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetSPI_ModeSetting ( QMP6988_io_setup_spi3w_t mySPI )
mcm 2:b186771f85a2 777 {
mcm 2:b186771f85a2 778 char cmd[2] = { 0U };
mcm 2:b186771f85a2 779 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 780
mcm 2:b186771f85a2 781
mcm 2:b186771f85a2 782 /* Read the register */
mcm 2:b186771f85a2 783 cmd[0] = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 784 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 785 aux |= _i2c.read ( _QMP6988_Addr, &cmd[1], 1U );
mcm 2:b186771f85a2 786
mcm 2:b186771f85a2 787 /* Update the register */
mcm 2:b186771f85a2 788 cmd[0] = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 789 cmd[1] &= ~IO_SETUP_SPI3W_MASK;
mcm 2:b186771f85a2 790 cmd[1] |= mySPI;
mcm 2:b186771f85a2 791 aux |= _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 792
mcm 2:b186771f85a2 793
mcm 2:b186771f85a2 794
mcm 2:b186771f85a2 795
mcm 2:b186771f85a2 796 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 797 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 798 } else {
mcm 2:b186771f85a2 799 return QMP6988_FAILURE;
mcm 2:b186771f85a2 800 }
mcm 2:b186771f85a2 801 }
mcm 2:b186771f85a2 802
mcm 2:b186771f85a2 803
mcm 2:b186771f85a2 804
mcm 2:b186771f85a2 805 /**
mcm 2:b186771f85a2 806 * @brief QMP6988_GetSPI_ModeSetting ( QMP6988_io_setup_spi3w_t* )
mcm 2:b186771f85a2 807 * @details It gets the SPI mode setting (4 or 3 wire).
mcm 2:b186771f85a2 808 *
mcm 2:b186771f85a2 809 * @param[in] N/A.
mcm 2:b186771f85a2 810 *
mcm 2:b186771f85a2 811 * @param[out] mySPI: SPI mode setting (4 or 3 wire).
mcm 2:b186771f85a2 812 *
mcm 2:b186771f85a2 813 *
mcm 2:b186771f85a2 814 * @return Status of QMP6988_GetSPI_ModeSetting
mcm 2:b186771f85a2 815 *
mcm 2:b186771f85a2 816 * @author Manuel Caballero
mcm 2:b186771f85a2 817 * @date 25/February/2022
mcm 2:b186771f85a2 818 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 819 * @pre N/A
mcm 2:b186771f85a2 820 * @warning N/A.
mcm 2:b186771f85a2 821 */
mcm 2:b186771f85a2 822 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetSPI_ModeSetting ( QMP6988_io_setup_spi3w_t* mySPI )
mcm 2:b186771f85a2 823 {
mcm 2:b186771f85a2 824 char cmd = 0U;
mcm 2:b186771f85a2 825 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 826
mcm 2:b186771f85a2 827
mcm 2:b186771f85a2 828 /* Read the register */
mcm 2:b186771f85a2 829 cmd = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 830 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 831 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 832
mcm 2:b186771f85a2 833 /* Parse the data */
mcm 2:b186771f85a2 834 *mySPI = (QMP6988_io_setup_spi3w_t)( cmd & IO_SETUP_SPI3W_MASK );
mcm 2:b186771f85a2 835
mcm 2:b186771f85a2 836
mcm 2:b186771f85a2 837
mcm 2:b186771f85a2 838 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 839 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 840 } else {
mcm 2:b186771f85a2 841 return QMP6988_FAILURE;
mcm 2:b186771f85a2 842 }
mcm 2:b186771f85a2 843 }
mcm 2:b186771f85a2 844
mcm 2:b186771f85a2 845
mcm 2:b186771f85a2 846
mcm 2:b186771f85a2 847 /**
mcm 2:b186771f85a2 848 * @brief QMP6988_SetSDI_Output ( QMP6988_io_setup_spi3_sdim_t )
mcm 2:b186771f85a2 849 * @details It sets the selected output type of SDI terminal.
mcm 2:b186771f85a2 850 *
mcm 2:b186771f85a2 851 * @param[in] mySDI: Output type of SDI terminal.
mcm 2:b186771f85a2 852 *
mcm 2:b186771f85a2 853 * @param[out] N/A.
mcm 2:b186771f85a2 854 *
mcm 2:b186771f85a2 855 *
mcm 2:b186771f85a2 856 * @return Status of QMP6988_SetSDI_Output
mcm 2:b186771f85a2 857 *
mcm 2:b186771f85a2 858 * @author Manuel Caballero
mcm 2:b186771f85a2 859 * @date 25/February/2022
mcm 2:b186771f85a2 860 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 861 * @pre N/A
mcm 2:b186771f85a2 862 * @warning N/A.
mcm 2:b186771f85a2 863 */
mcm 2:b186771f85a2 864 QMP6988::QMP6988_status_t QMP6988::QMP6988_SetSDI_Output ( QMP6988_io_setup_spi3_sdim_t mySDI )
mcm 2:b186771f85a2 865 {
mcm 2:b186771f85a2 866 char cmd[2] = { 0U };
mcm 2:b186771f85a2 867 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 868
mcm 2:b186771f85a2 869
mcm 2:b186771f85a2 870 /* Read the register */
mcm 2:b186771f85a2 871 cmd[0] = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 872 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 873 aux |= _i2c.read ( _QMP6988_Addr, &cmd[1], 1U );
mcm 2:b186771f85a2 874
mcm 2:b186771f85a2 875 /* Update the register */
mcm 2:b186771f85a2 876 cmd[0] = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 877 cmd[1] &= ~IO_SETUP_SPI3_SDIM_MASK;
mcm 2:b186771f85a2 878 cmd[1] |= mySDI;
mcm 2:b186771f85a2 879 aux |= _i2c.write ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:b186771f85a2 880
mcm 2:b186771f85a2 881
mcm 2:b186771f85a2 882
mcm 2:b186771f85a2 883 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 884 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 885 } else {
mcm 2:b186771f85a2 886 return QMP6988_FAILURE;
mcm 2:b186771f85a2 887 }
mcm 2:b186771f85a2 888 }
mcm 2:b186771f85a2 889
mcm 2:b186771f85a2 890
mcm 2:b186771f85a2 891
mcm 2:b186771f85a2 892 /**
mcm 2:b186771f85a2 893 * @brief QMP6988_GetSDI_Output ( QMP6988_io_setup_spi3_sdim_t* )
mcm 2:b186771f85a2 894 * @details It gets the selected output type of SDI terminal.
mcm 2:b186771f85a2 895 *
mcm 2:b186771f85a2 896 * @param[in] N/A.
mcm 2:b186771f85a2 897 *
mcm 2:b186771f85a2 898 * @param[out] mySDI: Output type of SDI terminal.
mcm 2:b186771f85a2 899 *
mcm 2:b186771f85a2 900 *
mcm 2:b186771f85a2 901 * @return Status of QMP6988_GetSDI_Output
mcm 2:b186771f85a2 902 *
mcm 2:b186771f85a2 903 * @author Manuel Caballero
mcm 2:b186771f85a2 904 * @date 25/February/2022
mcm 2:b186771f85a2 905 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 906 * @pre N/A
mcm 2:b186771f85a2 907 * @warning N/A.
mcm 2:b186771f85a2 908 */
mcm 2:b186771f85a2 909 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetSDI_Output ( QMP6988_io_setup_spi3_sdim_t* mySDI )
mcm 2:b186771f85a2 910 {
mcm 2:b186771f85a2 911 char cmd = 0U;
mcm 2:b186771f85a2 912 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 913
mcm 2:b186771f85a2 914
mcm 2:b186771f85a2 915 /* Read the register */
mcm 2:b186771f85a2 916 cmd = QMP6988_IO_SETUP;
mcm 2:b186771f85a2 917 aux = _i2c.write ( _QMP6988_Addr, &cmd, 1U, true );
mcm 2:b186771f85a2 918 aux |= _i2c.read ( _QMP6988_Addr, &cmd, 1U );
mcm 2:b186771f85a2 919
mcm 2:b186771f85a2 920 /* Parse the data */
mcm 2:b186771f85a2 921 *mySDI = (QMP6988_io_setup_spi3_sdim_t)( cmd & IO_SETUP_SPI3_SDIM_MASK );
mcm 2:b186771f85a2 922
mcm 2:b186771f85a2 923
mcm 2:b186771f85a2 924
mcm 2:b186771f85a2 925 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 926 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 927 } else {
mcm 2:b186771f85a2 928 return QMP6988_FAILURE;
mcm 2:b186771f85a2 929 }
mcm 2:b186771f85a2 930 }
mcm 2:b186771f85a2 931
mcm 2:b186771f85a2 932
mcm 2:b186771f85a2 933
mcm 2:b186771f85a2 934 /**
mcm 2:b186771f85a2 935 * @brief QMP6988_GetRawMeasurements ( QMP6988_raw_measured_data_t* )
mcm 2:b186771f85a2 936 * @details It gets the raw temperature and pressure data.
mcm 2:b186771f85a2 937 *
mcm 2:b186771f85a2 938 * @param[in] N/A.
mcm 2:b186771f85a2 939 *
mcm 2:b186771f85a2 940 * @param[out] myData: Raw pressure data and raw temperature data.
mcm 2:b186771f85a2 941 *
mcm 2:b186771f85a2 942 *
mcm 2:b186771f85a2 943 * @return Status of QMP6988_GetRawMeasurements
mcm 2:b186771f85a2 944 *
mcm 2:b186771f85a2 945 * @author Manuel Caballero
mcm 2:b186771f85a2 946 * @date 25/February/2022
mcm 2:b186771f85a2 947 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 948 * @pre N/A
mcm 2:b186771f85a2 949 * @warning N/A.
mcm 2:b186771f85a2 950 */
mcm 2:b186771f85a2 951 QMP6988::QMP6988_status_t QMP6988::QMP6988_GetRawMeasurements ( QMP6988_raw_measured_data_t* myData )
mcm 2:b186771f85a2 952 {
mcm 2:b186771f85a2 953 char cmd[6] = { 0U };
mcm 2:b186771f85a2 954 uint32_t aux = I2C_SUCCESS;
mcm 2:b186771f85a2 955
mcm 2:b186771f85a2 956
mcm 2:b186771f85a2 957 /* Read the register */
mcm 2:b186771f85a2 958 cmd[0] = QMP6988_PRESS_TXD2;
mcm 2:b186771f85a2 959 aux = _i2c.write ( _QMP6988_Addr, &cmd[0], 1U, true );
mcm 2:b186771f85a2 960 aux |= _i2c.read ( _QMP6988_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:b186771f85a2 961
mcm 2:b186771f85a2 962 /* Parse the data */
mcm 2:b186771f85a2 963 myData->dp = cmd[0];
mcm 2:b186771f85a2 964 myData->dp <<= 8U;
mcm 2:b186771f85a2 965 myData->dp |= cmd[1];
mcm 2:b186771f85a2 966 myData->dp <<= 8U;
mcm 2:b186771f85a2 967 myData->dp |= cmd[2];
mcm 2:b186771f85a2 968
mcm 2:b186771f85a2 969 myData->dt = cmd[3];
mcm 2:b186771f85a2 970 myData->dt <<= 8U;
mcm 2:b186771f85a2 971 myData->dt |= cmd[4];
mcm 2:b186771f85a2 972 myData->dt <<= 8U;
mcm 2:b186771f85a2 973 myData->dt |= cmd[5];
mcm 2:b186771f85a2 974
mcm 2:b186771f85a2 975
mcm 2:b186771f85a2 976 if ( aux == I2C_SUCCESS ) {
mcm 2:b186771f85a2 977 return QMP6988_SUCCESS;
mcm 2:b186771f85a2 978 } else {
mcm 2:b186771f85a2 979 return QMP6988_FAILURE;
mcm 2:b186771f85a2 980 }
mcm 2:b186771f85a2 981 }
mcm 2:b186771f85a2 982
mcm 2:b186771f85a2 983
mcm 2:b186771f85a2 984
mcm 2:b186771f85a2 985 /**
mcm 2:b186771f85a2 986 * @brief QMP6988_CalculateK ( float , float , uint16_t )
mcm 2:b186771f85a2 987 * @details It calculates the conversion factor. K = A + ( S * OTP ) / 32767.
mcm 2:b186771f85a2 988 *
mcm 2:b186771f85a2 989 * @param[in] a: Conversion factor A.
mcm 2:b186771f85a2 990 * @param[in] s: Conversion factor S.
mcm 2:b186771f85a2 991 * @param[in] otp: Raw Compensation Coefficient.
mcm 2:b186771f85a2 992 *
mcm 2:b186771f85a2 993 * @param[out] N/A.
mcm 2:b186771f85a2 994 *
mcm 2:b186771f85a2 995 *
mcm 2:b186771f85a2 996 * @return Compensation coefficients.
mcm 2:b186771f85a2 997 *
mcm 2:b186771f85a2 998 * @author Manuel Caballero
mcm 2:b186771f85a2 999 * @date 25/February/2022
mcm 2:b186771f85a2 1000 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 1001 * @pre N/A
mcm 2:b186771f85a2 1002 * @warning N/A.
mcm 2:b186771f85a2 1003 */
mcm 2:b186771f85a2 1004 float QMP6988::QMP6988_CalculateK ( float a, float s, uint16_t otp )
mcm 2:b186771f85a2 1005 {
mcm 2:b186771f85a2 1006 return ( a + ( s * otp ) / 32767.0 );
mcm 2:b186771f85a2 1007 }
mcm 2:b186771f85a2 1008
mcm 2:b186771f85a2 1009
mcm 2:b186771f85a2 1010
mcm 2:b186771f85a2 1011 /**
mcm 2:b186771f85a2 1012 * @brief QMP6988_CalculateK0 ( uint32_t )
mcm 2:b186771f85a2 1013 * @details It calculates the conversion factor. K = OTP / 16.
mcm 2:b186771f85a2 1014 *
mcm 2:b186771f85a2 1015 * @param[in] otp: Raw Compensation Coefficient.
mcm 2:b186771f85a2 1016 *
mcm 2:b186771f85a2 1017 * @param[out] N/A.
mcm 2:b186771f85a2 1018 *
mcm 2:b186771f85a2 1019 *
mcm 2:b186771f85a2 1020 * @return Compensation coefficients.
mcm 2:b186771f85a2 1021 *
mcm 2:b186771f85a2 1022 * @author Manuel Caballero
mcm 2:b186771f85a2 1023 * @date 25/February/2022
mcm 2:b186771f85a2 1024 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 1025 * @pre N/A
mcm 2:b186771f85a2 1026 * @warning N/A.
mcm 2:b186771f85a2 1027 */
mcm 2:b186771f85a2 1028 float QMP6988::QMP6988_CalculateK0 ( uint32_t otp )
mcm 2:b186771f85a2 1029 {
mcm 2:b186771f85a2 1030 return ( otp / 16.0 );
mcm 2:b186771f85a2 1031 }
mcm 2:b186771f85a2 1032
mcm 2:b186771f85a2 1033
mcm 2:b186771f85a2 1034
mcm 2:b186771f85a2 1035 /**
mcm 2:b186771f85a2 1036 * @brief QMP6988_CalculateCompensationCoefficients ( QMP6988_raw_compensation_coefficients_t )
mcm 2:b186771f85a2 1037 * @details It calculates the compensation coefficients.
mcm 2:b186771f85a2 1038 *
mcm 2:b186771f85a2 1039 * @param[in] myRawK: Raw compensation coefficients.
mcm 2:b186771f85a2 1040 *
mcm 2:b186771f85a2 1041 * @param[out] N/A.
mcm 2:b186771f85a2 1042 *
mcm 2:b186771f85a2 1043 *
mcm 2:b186771f85a2 1044 * @return Compensation coefficients.
mcm 2:b186771f85a2 1045 *
mcm 2:b186771f85a2 1046 * @author Manuel Caballero
mcm 2:b186771f85a2 1047 * @date 25/February/2022
mcm 2:b186771f85a2 1048 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 1049 * @pre Due to in the datasheet is not clear how to calculate the compensated values, those have been taken from the origin repo:
mcm 2:b186771f85a2 1050 * https://github.com/m5stack/UNIT_ENV/tree/master/src.
mcm 2:b186771f85a2 1051 * @warning N/A.
mcm 2:b186771f85a2 1052 */
mcm 2:b186771f85a2 1053 QMP6988::QMP6988_compensation_coefficients_t QMP6988::QMP6988_CalculateCompensationCoefficients ( QMP6988_raw_compensation_coefficients_t myRawK )
mcm 2:b186771f85a2 1054 {
mcm 2:b186771f85a2 1055 QMP6988_compensation_coefficients_t auxK;
mcm 2:b186771f85a2 1056
mcm 2:b186771f85a2 1057 auxK.a1 = 3608L * (int32_t)myRawK.raw_a1 - 1731677965L;
mcm 2:b186771f85a2 1058 auxK.a2 = 16889L * (int32_t)myRawK.raw_a2 - 87619360L;
mcm 2:b186771f85a2 1059 auxK.bt1 = 2982L * (int64_t)myRawK.raw_bt1 + 107370906L;
mcm 2:b186771f85a2 1060 auxK.bt2 = 329854L * (int64_t)myRawK.raw_bt2 + 108083093L;
mcm 2:b186771f85a2 1061 auxK.bp1 = 19923L * (int64_t)myRawK.raw_bp1 + 1133836764L;
mcm 2:b186771f85a2 1062 auxK.b11 = 2406L * (int64_t)myRawK.raw_b11 + 118215883L;
mcm 2:b186771f85a2 1063 auxK.bp2 = 3079L * (int64_t)myRawK.raw_bp2 - 181579595L;
mcm 2:b186771f85a2 1064 auxK.b12 = 6846L * (int64_t)myRawK.raw_b12 + 85590281L;
mcm 2:b186771f85a2 1065 auxK.b21 = 6846L * (int64_t)myRawK.raw_b21 + 85590281L;
mcm 2:b186771f85a2 1066 auxK.bp3 = 2915L * (int64_t)myRawK.raw_bp3 + 157155561L;
mcm 2:b186771f85a2 1067
mcm 2:b186771f85a2 1068 auxK.a0 = myRawK.raw_a0;
mcm 2:b186771f85a2 1069 auxK.b00 = myRawK.raw_b00;
mcm 2:b186771f85a2 1070
mcm 2:b186771f85a2 1071
mcm 2:b186771f85a2 1072 return auxK;
mcm 2:b186771f85a2 1073 }
mcm 2:b186771f85a2 1074
mcm 2:b186771f85a2 1075
mcm 2:b186771f85a2 1076
mcm 2:b186771f85a2 1077 /**
mcm 2:b186771f85a2 1078 * @brief QMP6988_CalculateCompensatedMeasuredData ( QMP6988_raw_measured_data_t , QMP6988_compensation_coefficients_t )
mcm 2:b186771f85a2 1079 * @details It calculates the compensated values: temperature and pressure.
mcm 2:b186771f85a2 1080 *
mcm 2:b186771f85a2 1081 * @param[in] myData: Raw measured data: Temperature and Pressure.
mcm 2:b186771f85a2 1082 * @param[in] myK: Raw compensation coefficients.
mcm 2:b186771f85a2 1083 *
mcm 2:b186771f85a2 1084 * @param[out] N/A.
mcm 2:b186771f85a2 1085 *
mcm 2:b186771f85a2 1086 *
mcm 2:b186771f85a2 1087 * @return Compensated Temperature and Pressure values.
mcm 2:b186771f85a2 1088 *
mcm 2:b186771f85a2 1089 * @author Manuel Caballero
mcm 2:b186771f85a2 1090 * @date 25/February/2022
mcm 2:b186771f85a2 1091 * @version 25/February/2022 The ORIGIN
mcm 2:b186771f85a2 1092 * @pre Due to in the datasheet is not clear how to calculate the compensated values, those have been taken from the origin repo:
mcm 2:b186771f85a2 1093 * https://github.com/m5stack/UNIT_ENV/tree/master/src
mcm 2:b186771f85a2 1094 * @warning N/A.
mcm 2:b186771f85a2 1095 */
mcm 2:b186771f85a2 1096 QMP6988::QMP6988_compensated_measured_data_t QMP6988::QMP6988_CalculateCompensatedMeasuredData ( QMP6988_raw_measured_data_t myData, QMP6988_compensation_coefficients_t myK )
mcm 2:b186771f85a2 1097 {
mcm 2:b186771f85a2 1098 QMP6988_compensated_measured_data_t auxData;
mcm 2:b186771f85a2 1099 int32_t auxT, auxP;
mcm 2:b186771f85a2 1100 int64_t wk1, wk2, wk3;
mcm 2:b186771f85a2 1101 int16_t t_int;
mcm 2:b186771f85a2 1102 uint32_t p_int;
mcm 2:b186771f85a2 1103
mcm 2:b186771f85a2 1104
mcm 2:b186771f85a2 1105 /* Aux data */
mcm 2:b186771f85a2 1106 auxT = (int32_t)( myData.dt - 8388608 );
mcm 2:b186771f85a2 1107 auxP = (int32_t)( myData.dp - 8388608 );
mcm 2:b186771f85a2 1108
mcm 2:b186771f85a2 1109 /* Calculate the compensated temperature */
mcm 2:b186771f85a2 1110 wk1 = ((int64_t)myK.a1 * (int64_t)auxT); // 31Q23+24-1=54 (54Q23)
mcm 2:b186771f85a2 1111 wk2 = ((int64_t)myK.a2 * (int64_t)auxT) >> 14; // 30Q47+24-1=53 (39Q33)
mcm 2:b186771f85a2 1112 wk2 = (wk2 * (int64_t)auxT) >> 10; // 39Q33+24-1=62 (52Q23)
mcm 2:b186771f85a2 1113 wk2 = ((wk1 + wk2) / 32767) >> 19; // 54,52->55Q23 (20Q04)
mcm 2:b186771f85a2 1114 t_int = (int16_t)((myK.a0 + wk2) >> 4); // 21Q4 -> 17Q0
mcm 2:b186771f85a2 1115
mcm 2:b186771f85a2 1116 auxData.temperature = (float)t_int / 256.0;
mcm 2:b186771f85a2 1117
mcm 2:b186771f85a2 1118 /* Calculate the compensated pressure */
mcm 2:b186771f85a2 1119 wk1 = ((int64_t)myK.bt1 * (int64_t)t_int); // 28Q15+16-1=43 (43Q15)
mcm 2:b186771f85a2 1120 wk2 = ((int64_t)myK.bp1 * (int64_t)auxP) >> 5; // 31Q20+24-1=54 (49Q15)
mcm 2:b186771f85a2 1121 wk1 += wk2; // 43,49->50Q15
mcm 2:b186771f85a2 1122 wk2 = ((int64_t)myK.bt2 * (int64_t)t_int) >> 1; // 34Q38+16-1=49 (48Q37)
mcm 2:b186771f85a2 1123 wk2 = (wk2 * (int64_t)t_int) >> 8; // 48Q37+16-1=63 (55Q29)
mcm 2:b186771f85a2 1124 wk3 = wk2; // 55Q29
mcm 2:b186771f85a2 1125 wk2 = ((int64_t)myK.b11 * (int64_t)t_int) >> 4; // 28Q34+16-1=43 (39Q30)
mcm 2:b186771f85a2 1126 wk2 = (wk2 * (int64_t)auxP) >> 1; // 39Q30+24-1=62 (61Q29)
mcm 2:b186771f85a2 1127 wk3 += wk2; // 55,61->62Q29
mcm 2:b186771f85a2 1128 wk2 = ((int64_t)myK.bp2 * (int64_t)auxP) >> 13; // 29Q43+24-1=52 (39Q30)
mcm 2:b186771f85a2 1129 wk2 = (wk2 * (int64_t)auxP) >> 1; // 39Q30+24-1=62 (61Q29)
mcm 2:b186771f85a2 1130 wk3 += wk2; // 62,61->63Q29
mcm 2:b186771f85a2 1131 wk1 += wk3 >> 14; // Q29 >> 14 -> Q15
mcm 2:b186771f85a2 1132 wk2 = ((int64_t)myK.b12 * (int64_t)t_int); // 29Q53+16-1=45 (45Q53)
mcm 2:b186771f85a2 1133 wk2 = (wk2 * (int64_t)t_int) >> 22; // 45Q53+16-1=61 (39Q31)
mcm 2:b186771f85a2 1134 wk2 = (wk2 * (int64_t)auxP) >> 1; // 39Q31+24-1=62 (61Q30)
mcm 2:b186771f85a2 1135 wk3 = wk2; // 61Q30
mcm 2:b186771f85a2 1136 wk2 = ((int64_t)myK.b21 * (int64_t)t_int) >> 6; // 29Q60+16-1=45 (39Q54)
mcm 2:b186771f85a2 1137 wk2 = (wk2 * (int64_t)auxP) >> 23; // 39Q54+24-1=62 (39Q31)
mcm 2:b186771f85a2 1138 wk2 = (wk2 * (int64_t)auxP) >> 1; // 39Q31+24-1=62 (61Q20)
mcm 2:b186771f85a2 1139 wk3 += wk2; // 61,61->62Q30
mcm 2:b186771f85a2 1140 wk2 = ((int64_t)myK.bp3 * (int64_t)auxP) >> 12; // 28Q65+24-1=51 (39Q53)
mcm 2:b186771f85a2 1141 wk2 = (wk2 * (int64_t)auxP) >> 23; // 39Q53+24-1=62 (39Q30)
mcm 2:b186771f85a2 1142 wk2 = (wk2 * (int64_t)auxP); // 39Q30+24-1=62 (62Q30)
mcm 2:b186771f85a2 1143 wk3 += wk2; // 62,62->63Q30
mcm 2:b186771f85a2 1144 wk1 += wk3 >> 15; // Q30 >> 15 = Q15
mcm 2:b186771f85a2 1145 wk1 /= 32767L;
mcm 2:b186771f85a2 1146 wk1 >>= 11; // Q15 >> 7 = Q4
mcm 2:b186771f85a2 1147 wk1 += myK.b00; // Q4 + 20Q4
mcm 2:b186771f85a2 1148 //wk1 >>= 4;
mcm 2:b186771f85a2 1149 p_int = (int32_t)wk1;
mcm 2:b186771f85a2 1150
mcm 2:b186771f85a2 1151 auxData.pressure = (float)p_int / 16.0;
mcm 2:b186771f85a2 1152
mcm 2:b186771f85a2 1153 return auxData;
mcm 2:b186771f85a2 1154 }