CO2, humidity, and temperature sensor

Committer:
mcm
Date:
Mon May 10 14:13:38 2021 +0000
Revision:
3:ca833b38050f
Parent:
2:0d0174b46fd3
This driver was completed and tested (NUCLEO-L053R8), it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:0d0174b46fd3 1 /**
mcm 2:0d0174b46fd3 2 * @brief SCD30.c
mcm 2:0d0174b46fd3 3 * @details CO2, humidity and temperature sensor.
mcm 2:0d0174b46fd3 4 * Functions file.
mcm 2:0d0174b46fd3 5 *
mcm 2:0d0174b46fd3 6 *
mcm 2:0d0174b46fd3 7 * @return N/A
mcm 2:0d0174b46fd3 8 *
mcm 2:0d0174b46fd3 9 * @author Manuel Caballero
mcm 2:0d0174b46fd3 10 * @date 07/May/2021
mcm 2:0d0174b46fd3 11 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 12 * @pre N/A
mcm 2:0d0174b46fd3 13 * @warning N/A
mcm 2:0d0174b46fd3 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 2:0d0174b46fd3 15 */
mcm 2:0d0174b46fd3 16
mcm 2:0d0174b46fd3 17 #include "SCD30.h"
mcm 2:0d0174b46fd3 18
mcm 2:0d0174b46fd3 19
mcm 2:0d0174b46fd3 20 SCD30::SCD30 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:0d0174b46fd3 21 : _i2c ( sda, scl )
mcm 2:0d0174b46fd3 22 , _SCD30_Addr ( addr )
mcm 2:0d0174b46fd3 23 {
mcm 2:0d0174b46fd3 24 _i2c.frequency( freq );
mcm 2:0d0174b46fd3 25 }
mcm 2:0d0174b46fd3 26
mcm 2:0d0174b46fd3 27
mcm 2:0d0174b46fd3 28 SCD30::~SCD30()
mcm 2:0d0174b46fd3 29 {
mcm 2:0d0174b46fd3 30 }
mcm 2:0d0174b46fd3 31
mcm 2:0d0174b46fd3 32
mcm 2:0d0174b46fd3 33
mcm 2:0d0174b46fd3 34 /**
mcm 2:0d0174b46fd3 35 * @brief SCD30_TriggerContinuousMeasurement ( uint16_t )
mcm 2:0d0174b46fd3 36 * @details It triggers continuous measurement with or without ambient pressure compensation.
mcm 2:0d0174b46fd3 37 *
mcm 2:0d0174b46fd3 38 * @param[in] pressure_compensation: 0 (desactivates pressure compensation) or [700 - 1400]. Pressure in mBar.
mcm 2:0d0174b46fd3 39 *
mcm 2:0d0174b46fd3 40 * @param[out] N/A
mcm 2:0d0174b46fd3 41 *
mcm 2:0d0174b46fd3 42 *
mcm 2:0d0174b46fd3 43 * @return Status of SCD30_TriggerContinuousMeasurement.
mcm 2:0d0174b46fd3 44 *
mcm 2:0d0174b46fd3 45 * @author Manuel Caballero
mcm 2:0d0174b46fd3 46 * @date 07/May/2021
mcm 2:0d0174b46fd3 47 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 48 * @pre N/A
mcm 2:0d0174b46fd3 49 * @warning N/A.
mcm 2:0d0174b46fd3 50 */
mcm 2:0d0174b46fd3 51 SCD30::SCD30_status_t SCD30::SCD30_TriggerContinuousMeasurement ( uint16_t pressure_compensation )
mcm 2:0d0174b46fd3 52 {
mcm 2:0d0174b46fd3 53 char cmd[5] = { 0U };
mcm 2:0d0174b46fd3 54 uint32_t aux;
mcm 2:0d0174b46fd3 55
mcm 2:0d0174b46fd3 56 /* Write the register */
mcm 2:0d0174b46fd3 57 cmd[0] = (char)( SCD30_TRIGGERS_CONTINUOUS_MEASUREMENT >> 8U );
mcm 2:0d0174b46fd3 58 cmd[1] = (char)( SCD30_TRIGGERS_CONTINUOUS_MEASUREMENT & 0xFF );
mcm 2:0d0174b46fd3 59 cmd[2] = (char)( pressure_compensation >> 8U );
mcm 2:0d0174b46fd3 60 cmd[3] = (char)( pressure_compensation & 0xFF );
mcm 2:0d0174b46fd3 61 cmd[4] = SCD30_CalculateI2C_CRC8 ( pressure_compensation );
mcm 2:0d0174b46fd3 62 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 63
mcm 2:0d0174b46fd3 64
mcm 2:0d0174b46fd3 65 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 66 {
mcm 2:0d0174b46fd3 67 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 68 }
mcm 2:0d0174b46fd3 69 else
mcm 2:0d0174b46fd3 70 {
mcm 2:0d0174b46fd3 71 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 72 }
mcm 2:0d0174b46fd3 73 }
mcm 2:0d0174b46fd3 74
mcm 2:0d0174b46fd3 75
mcm 2:0d0174b46fd3 76
mcm 2:0d0174b46fd3 77 /**
mcm 2:0d0174b46fd3 78 * @brief SCD30_StopContinuousMeasurement ( void )
mcm 2:0d0174b46fd3 79 * @details It stops the continuous measurement.
mcm 2:0d0174b46fd3 80 *
mcm 2:0d0174b46fd3 81 * @param[in] N/A.
mcm 2:0d0174b46fd3 82 *
mcm 2:0d0174b46fd3 83 * @param[out] N/A
mcm 2:0d0174b46fd3 84 *
mcm 2:0d0174b46fd3 85 *
mcm 2:0d0174b46fd3 86 * @return Status of SCD30_StopContinuousMeasurement.
mcm 2:0d0174b46fd3 87 *
mcm 2:0d0174b46fd3 88 * @author Manuel Caballero
mcm 2:0d0174b46fd3 89 * @date 07/May/2021
mcm 2:0d0174b46fd3 90 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 91 * @pre N/A
mcm 2:0d0174b46fd3 92 * @warning N/A.
mcm 2:0d0174b46fd3 93 */
mcm 2:0d0174b46fd3 94 SCD30::SCD30_status_t SCD30::SCD30_StopContinuousMeasurement ( void )
mcm 2:0d0174b46fd3 95 {
mcm 2:0d0174b46fd3 96 char cmd[2] = { 0U };
mcm 2:0d0174b46fd3 97 uint32_t aux;
mcm 2:0d0174b46fd3 98
mcm 2:0d0174b46fd3 99 /* Write the register */
mcm 2:0d0174b46fd3 100 cmd[0] = (char)( SCD30_STOP_CONTINUOUS_MEASUREMENT >> 8U );
mcm 2:0d0174b46fd3 101 cmd[1] = (char)( SCD30_STOP_CONTINUOUS_MEASUREMENT & 0xFF );
mcm 2:0d0174b46fd3 102 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 103
mcm 2:0d0174b46fd3 104
mcm 2:0d0174b46fd3 105 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 106 {
mcm 2:0d0174b46fd3 107 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 108 }
mcm 2:0d0174b46fd3 109 else
mcm 2:0d0174b46fd3 110 {
mcm 2:0d0174b46fd3 111 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 112 }
mcm 2:0d0174b46fd3 113 }
mcm 2:0d0174b46fd3 114
mcm 2:0d0174b46fd3 115
mcm 2:0d0174b46fd3 116
mcm 2:0d0174b46fd3 117 /**
mcm 2:0d0174b46fd3 118 * @brief SCD30_SetMeasurementInterval ( uint16_t )
mcm 2:0d0174b46fd3 119 * @details It sets the measurement interval.
mcm 2:0d0174b46fd3 120 *
mcm 2:0d0174b46fd3 121 * @param[in] measurement_interval: [2 - 1800]. Interval in seconds.
mcm 2:0d0174b46fd3 122 *
mcm 2:0d0174b46fd3 123 * @param[out] N/A
mcm 2:0d0174b46fd3 124 *
mcm 2:0d0174b46fd3 125 *
mcm 2:0d0174b46fd3 126 * @return Status of SCD30_SetMeasurementInterval.
mcm 2:0d0174b46fd3 127 *
mcm 2:0d0174b46fd3 128 * @author Manuel Caballero
mcm 2:0d0174b46fd3 129 * @date 07/May/2021
mcm 2:0d0174b46fd3 130 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 131 * @pre N/A
mcm 2:0d0174b46fd3 132 * @warning N/A.
mcm 2:0d0174b46fd3 133 */
mcm 2:0d0174b46fd3 134 SCD30::SCD30_status_t SCD30::SCD30_SetMeasurementInterval ( uint16_t measurement_interval )
mcm 2:0d0174b46fd3 135 {
mcm 2:0d0174b46fd3 136 char cmd[5] = { 0U };
mcm 2:0d0174b46fd3 137 uint32_t aux;
mcm 2:0d0174b46fd3 138
mcm 2:0d0174b46fd3 139 /* Write the register */
mcm 2:0d0174b46fd3 140 cmd[0] = (char)( SCD30_STOP_CONTINUOUS_MEASUREMENT >> 8U );
mcm 2:0d0174b46fd3 141 cmd[1] = (char)( SCD30_STOP_CONTINUOUS_MEASUREMENT & 0xFF );
mcm 2:0d0174b46fd3 142 cmd[2] = (char)( measurement_interval >> 8U );
mcm 2:0d0174b46fd3 143 cmd[3] = (char)( measurement_interval & 0xFF );
mcm 2:0d0174b46fd3 144 cmd[4] = SCD30_CalculateI2C_CRC8 ( measurement_interval );
mcm 2:0d0174b46fd3 145 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 146
mcm 2:0d0174b46fd3 147
mcm 2:0d0174b46fd3 148 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 149 {
mcm 2:0d0174b46fd3 150 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 151 }
mcm 2:0d0174b46fd3 152 else
mcm 2:0d0174b46fd3 153 {
mcm 2:0d0174b46fd3 154 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 155 }
mcm 2:0d0174b46fd3 156 }
mcm 2:0d0174b46fd3 157
mcm 2:0d0174b46fd3 158
mcm 2:0d0174b46fd3 159
mcm 2:0d0174b46fd3 160 /**
mcm 2:0d0174b46fd3 161 * @brief SCD30_GetMeasurementInterval ( uint16_t* )
mcm 2:0d0174b46fd3 162 * @details It sets the measurement interval.
mcm 2:0d0174b46fd3 163 *
mcm 2:0d0174b46fd3 164 * @param[in] N/A.
mcm 2:0d0174b46fd3 165 *
mcm 2:0d0174b46fd3 166 * @param[out] measurement_interval: Value. Interval in seconds.
mcm 2:0d0174b46fd3 167 *
mcm 2:0d0174b46fd3 168 *
mcm 2:0d0174b46fd3 169 * @return Status of SCD30_GetMeasurementInterval.
mcm 2:0d0174b46fd3 170 *
mcm 2:0d0174b46fd3 171 * @author Manuel Caballero
mcm 2:0d0174b46fd3 172 * @date 07/May/2021
mcm 2:0d0174b46fd3 173 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 174 * @pre N/A
mcm 2:0d0174b46fd3 175 * @warning N/A.
mcm 2:0d0174b46fd3 176 */
mcm 2:0d0174b46fd3 177 SCD30::SCD30_status_t SCD30::SCD30_GetMeasurementInterval ( uint16_t* measurement_interval )
mcm 2:0d0174b46fd3 178 {
mcm 2:0d0174b46fd3 179 char cmd[4] = { 0U };
mcm 2:0d0174b46fd3 180 uint8_t aux_crc;
mcm 2:0d0174b46fd3 181 uint32_t aux;
mcm 2:0d0174b46fd3 182
mcm 2:0d0174b46fd3 183 /* Write the register */
mcm 2:0d0174b46fd3 184 cmd[0] = (char)( SCD30_STOP_CONTINUOUS_MEASUREMENT >> 8U );
mcm 2:0d0174b46fd3 185 cmd[1] = (char)( SCD30_STOP_CONTINUOUS_MEASUREMENT & 0xFF );
mcm 2:0d0174b46fd3 186 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 187
mcm 2:0d0174b46fd3 188 /* Read the register */
mcm 2:0d0174b46fd3 189 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 190
mcm 2:0d0174b46fd3 191 /* Parse the data */
mcm 2:0d0174b46fd3 192 *measurement_interval = cmd[0];
mcm 2:0d0174b46fd3 193 *measurement_interval <<= 8U;
mcm 2:0d0174b46fd3 194 *measurement_interval |= cmd[1];
mcm 2:0d0174b46fd3 195
mcm 2:0d0174b46fd3 196 /* Check the CRC */
mcm 2:0d0174b46fd3 197 aux_crc = SCD30_CalculateI2C_CRC8 ( *measurement_interval );
mcm 2:0d0174b46fd3 198
mcm 2:0d0174b46fd3 199 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 200 {
mcm 2:0d0174b46fd3 201 if ( ( aux_crc - cmd[2] ) == 0U )
mcm 2:0d0174b46fd3 202 {
mcm 2:0d0174b46fd3 203 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 204 }
mcm 2:0d0174b46fd3 205 else
mcm 2:0d0174b46fd3 206 {
mcm 2:0d0174b46fd3 207 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 208 }
mcm 2:0d0174b46fd3 209 }
mcm 2:0d0174b46fd3 210 else
mcm 2:0d0174b46fd3 211 {
mcm 2:0d0174b46fd3 212 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 213 }
mcm 2:0d0174b46fd3 214 }
mcm 2:0d0174b46fd3 215
mcm 2:0d0174b46fd3 216
mcm 2:0d0174b46fd3 217
mcm 2:0d0174b46fd3 218 /**
mcm 2:0d0174b46fd3 219 * @brief SCD30_GetDataReadyStatus ( SCD30_get_ready_status_bit_t* )
mcm 2:0d0174b46fd3 220 * @details It gets the status when the data is ready to be read.
mcm 2:0d0174b46fd3 221 *
mcm 2:0d0174b46fd3 222 * @param[in] N/A.
mcm 2:0d0174b46fd3 223 *
mcm 2:0d0174b46fd3 224 * @param[out] status: Data ready status.
mcm 2:0d0174b46fd3 225 *
mcm 2:0d0174b46fd3 226 *
mcm 2:0d0174b46fd3 227 * @return Status of SCD30_GetDataReadyStatus.
mcm 2:0d0174b46fd3 228 *
mcm 2:0d0174b46fd3 229 * @author Manuel Caballero
mcm 2:0d0174b46fd3 230 * @date 07/May/2021
mcm 2:0d0174b46fd3 231 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 232 * @pre N/A
mcm 2:0d0174b46fd3 233 * @warning N/A.
mcm 2:0d0174b46fd3 234 */
mcm 2:0d0174b46fd3 235 SCD30::SCD30_status_t SCD30::SCD30_GetDataReadyStatus ( SCD30_get_ready_status_bit_t* status )
mcm 2:0d0174b46fd3 236 {
mcm 2:0d0174b46fd3 237 char cmd[3] = { 0U };
mcm 2:0d0174b46fd3 238 uint8_t aux_crc;
mcm 2:0d0174b46fd3 239 uint16_t aux_res;
mcm 2:0d0174b46fd3 240 uint32_t aux;
mcm 2:0d0174b46fd3 241
mcm 2:0d0174b46fd3 242 /* Write the register */
mcm 2:0d0174b46fd3 243 cmd[0] = (char)( SCD30_GET_DATA_READY_STATUS >> 8U );
mcm 2:0d0174b46fd3 244 cmd[1] = (char)( SCD30_GET_DATA_READY_STATUS & 0xFF );
mcm 2:0d0174b46fd3 245 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 246
mcm 2:0d0174b46fd3 247 /* Read the register */
mcm 2:0d0174b46fd3 248 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 249
mcm 2:0d0174b46fd3 250 /* Parse the data */
mcm 2:0d0174b46fd3 251 aux_res = cmd[0];
mcm 2:0d0174b46fd3 252 aux_res <<= 8U;
mcm 2:0d0174b46fd3 253 aux_res |= cmd[1];
mcm 2:0d0174b46fd3 254
mcm 2:0d0174b46fd3 255 *status = (SCD30_get_ready_status_bit_t)aux_res;
mcm 2:0d0174b46fd3 256
mcm 2:0d0174b46fd3 257 /* Check the CRC */
mcm 2:0d0174b46fd3 258 aux_crc = SCD30_CalculateI2C_CRC8 ( *status );
mcm 2:0d0174b46fd3 259
mcm 2:0d0174b46fd3 260 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 261 {
mcm 2:0d0174b46fd3 262 if ( ( aux_crc - cmd[2] ) == 0U )
mcm 2:0d0174b46fd3 263 {
mcm 2:0d0174b46fd3 264 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 265 }
mcm 2:0d0174b46fd3 266 else
mcm 2:0d0174b46fd3 267 {
mcm 2:0d0174b46fd3 268 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 269 }
mcm 2:0d0174b46fd3 270 }
mcm 2:0d0174b46fd3 271 else
mcm 2:0d0174b46fd3 272 {
mcm 2:0d0174b46fd3 273 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 274 }
mcm 2:0d0174b46fd3 275 }
mcm 2:0d0174b46fd3 276
mcm 2:0d0174b46fd3 277
mcm 2:0d0174b46fd3 278
mcm 2:0d0174b46fd3 279 /**
mcm 2:0d0174b46fd3 280 * @brief SCD30_ReadRawMeasurement ( SCD30_raw_output_data_t* )
mcm 2:0d0174b46fd3 281 * @details It gets all the raw data.
mcm 2:0d0174b46fd3 282 *
mcm 2:0d0174b46fd3 283 * @param[in] N/A.
mcm 2:0d0174b46fd3 284 *
mcm 2:0d0174b46fd3 285 * @param[out] raw_data: All the data in raw values.
mcm 2:0d0174b46fd3 286 *
mcm 2:0d0174b46fd3 287 *
mcm 2:0d0174b46fd3 288 * @return Status of SCD30_ReadRawMeasurement.
mcm 2:0d0174b46fd3 289 *
mcm 2:0d0174b46fd3 290 * @author Manuel Caballero
mcm 2:0d0174b46fd3 291 * @date 07/May/2021
mcm 2:0d0174b46fd3 292 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 293 * @pre N/A
mcm 2:0d0174b46fd3 294 * @warning N/A.
mcm 2:0d0174b46fd3 295 */
mcm 2:0d0174b46fd3 296 SCD30::SCD30_status_t SCD30::SCD30_ReadRawMeasurement ( SCD30_raw_output_data_t* raw_data )
mcm 2:0d0174b46fd3 297 {
mcm 2:0d0174b46fd3 298 char cmd[18] = { 0U };
mcm 2:0d0174b46fd3 299 uint16_t aux_seed;
mcm 2:0d0174b46fd3 300 uint8_t aux_crc;
mcm 2:0d0174b46fd3 301 uint8_t aux_return = 0U;
mcm 2:0d0174b46fd3 302 uint32_t aux;
mcm 2:0d0174b46fd3 303
mcm 2:0d0174b46fd3 304 /* Write the register */
mcm 2:0d0174b46fd3 305 cmd[0] = (char)( SCD30_READ_MEASUREMENT >> 8U );
mcm 2:0d0174b46fd3 306 cmd[1] = (char)( SCD30_READ_MEASUREMENT & 0xFF );
mcm 2:0d0174b46fd3 307 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 308
mcm 2:0d0174b46fd3 309 /* Read the register */
mcm 2:0d0174b46fd3 310 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 311
mcm 2:0d0174b46fd3 312 /* Parse the data */
mcm 2:0d0174b46fd3 313 raw_data->co2_mmsb = cmd[0];
mcm 2:0d0174b46fd3 314 raw_data->co2_mlsb = cmd[1];
mcm 2:0d0174b46fd3 315 raw_data->co2_mmsb_mlsb_crc = cmd[2];
mcm 2:0d0174b46fd3 316
mcm 2:0d0174b46fd3 317 /* Check the CRC */
mcm 2:0d0174b46fd3 318 aux_seed = raw_data->co2_mmsb;
mcm 2:0d0174b46fd3 319 aux_seed <<= 8U;
mcm 2:0d0174b46fd3 320 aux_seed |= raw_data->co2_mlsb;
mcm 2:0d0174b46fd3 321 aux_crc = SCD30_CalculateI2C_CRC8 ( aux_seed );
mcm 2:0d0174b46fd3 322
mcm 2:0d0174b46fd3 323 if ( ( aux_crc - raw_data->co2_mmsb_mlsb_crc ) != 0U )
mcm 2:0d0174b46fd3 324 {
mcm 2:0d0174b46fd3 325 aux_return++;
mcm 2:0d0174b46fd3 326 }
mcm 2:0d0174b46fd3 327
mcm 2:0d0174b46fd3 328 raw_data->co2_lmsb = cmd[3];
mcm 2:0d0174b46fd3 329 raw_data->co2_llsb = cmd[4];
mcm 2:0d0174b46fd3 330 raw_data->co2_lmsb_llsb_crc = cmd[5];
mcm 2:0d0174b46fd3 331
mcm 2:0d0174b46fd3 332 /* Check the CRC */
mcm 2:0d0174b46fd3 333 aux_seed = raw_data->co2_lmsb;
mcm 2:0d0174b46fd3 334 aux_seed <<= 8U;
mcm 2:0d0174b46fd3 335 aux_seed |= raw_data->co2_llsb;
mcm 2:0d0174b46fd3 336 aux_crc = SCD30_CalculateI2C_CRC8 ( aux_seed );
mcm 2:0d0174b46fd3 337
mcm 2:0d0174b46fd3 338 if ( ( aux_crc - raw_data->co2_lmsb_llsb_crc ) != 0U )
mcm 2:0d0174b46fd3 339 {
mcm 2:0d0174b46fd3 340 aux_return++;
mcm 2:0d0174b46fd3 341 }
mcm 2:0d0174b46fd3 342
mcm 2:0d0174b46fd3 343 raw_data->temperature_mmsb = cmd[6];
mcm 2:0d0174b46fd3 344 raw_data->temperature_mlsb = cmd[7];
mcm 2:0d0174b46fd3 345 raw_data->temperature_mmsb_mlsb_crc = cmd[8];
mcm 2:0d0174b46fd3 346
mcm 2:0d0174b46fd3 347 /* Check the CRC */
mcm 2:0d0174b46fd3 348 aux_seed = raw_data->temperature_mmsb;
mcm 2:0d0174b46fd3 349 aux_seed <<= 8U;
mcm 2:0d0174b46fd3 350 aux_seed |= raw_data->temperature_mlsb;
mcm 2:0d0174b46fd3 351 aux_crc = SCD30_CalculateI2C_CRC8 ( aux_seed );
mcm 2:0d0174b46fd3 352
mcm 2:0d0174b46fd3 353 if ( ( aux_crc - raw_data->temperature_mmsb_mlsb_crc ) != 0U )
mcm 2:0d0174b46fd3 354 {
mcm 2:0d0174b46fd3 355 aux_return++;
mcm 2:0d0174b46fd3 356 }
mcm 2:0d0174b46fd3 357
mcm 2:0d0174b46fd3 358 raw_data->temperature_lmsb = cmd[9];
mcm 2:0d0174b46fd3 359 raw_data->temperature_llsb = cmd[10];
mcm 2:0d0174b46fd3 360 raw_data->temperature_lmsb_llsb_crc = cmd[11];
mcm 2:0d0174b46fd3 361
mcm 2:0d0174b46fd3 362 /* Check the CRC */
mcm 2:0d0174b46fd3 363 aux_seed = raw_data->temperature_lmsb;
mcm 2:0d0174b46fd3 364 aux_seed <<= 8U;
mcm 2:0d0174b46fd3 365 aux_seed |= raw_data->temperature_llsb;
mcm 2:0d0174b46fd3 366 aux_crc = SCD30_CalculateI2C_CRC8 ( aux_seed );
mcm 2:0d0174b46fd3 367
mcm 2:0d0174b46fd3 368 if ( ( aux_crc - raw_data->temperature_lmsb_llsb_crc ) != 0U )
mcm 2:0d0174b46fd3 369 {
mcm 2:0d0174b46fd3 370 aux_return++;
mcm 2:0d0174b46fd3 371 }
mcm 2:0d0174b46fd3 372
mcm 2:0d0174b46fd3 373 raw_data->humidity_mmsb = cmd[12];
mcm 2:0d0174b46fd3 374 raw_data->humidity_mlsb = cmd[13];
mcm 2:0d0174b46fd3 375 raw_data->humidity_mmsb_mlsb_crc = cmd[14];
mcm 2:0d0174b46fd3 376
mcm 2:0d0174b46fd3 377 /* Check the CRC */
mcm 2:0d0174b46fd3 378 aux_seed = raw_data->humidity_mmsb;
mcm 2:0d0174b46fd3 379 aux_seed <<= 8U;
mcm 2:0d0174b46fd3 380 aux_seed |= raw_data->humidity_mlsb;
mcm 2:0d0174b46fd3 381 aux_crc = SCD30_CalculateI2C_CRC8 ( aux_seed );
mcm 2:0d0174b46fd3 382
mcm 2:0d0174b46fd3 383 if ( ( aux_crc - raw_data->humidity_mmsb_mlsb_crc ) != 0U )
mcm 2:0d0174b46fd3 384 {
mcm 2:0d0174b46fd3 385 aux_return++;
mcm 2:0d0174b46fd3 386 }
mcm 2:0d0174b46fd3 387
mcm 2:0d0174b46fd3 388 raw_data->humidity_lmsb = cmd[15];
mcm 2:0d0174b46fd3 389 raw_data->humidity_llsb = cmd[16];
mcm 2:0d0174b46fd3 390 raw_data->humidity_lmsb_llsb_crc = cmd[17];
mcm 2:0d0174b46fd3 391
mcm 2:0d0174b46fd3 392 /* Check the CRC */
mcm 2:0d0174b46fd3 393 aux_seed = raw_data->humidity_lmsb;
mcm 2:0d0174b46fd3 394 aux_seed <<= 8U;
mcm 2:0d0174b46fd3 395 aux_seed |= raw_data->humidity_llsb;
mcm 2:0d0174b46fd3 396 aux_crc = SCD30_CalculateI2C_CRC8 ( aux_seed );
mcm 2:0d0174b46fd3 397
mcm 2:0d0174b46fd3 398 if ( ( aux_crc - raw_data->humidity_lmsb_llsb_crc ) != 0U )
mcm 2:0d0174b46fd3 399 {
mcm 2:0d0174b46fd3 400 aux_return++;
mcm 2:0d0174b46fd3 401 }
mcm 2:0d0174b46fd3 402
mcm 2:0d0174b46fd3 403
mcm 2:0d0174b46fd3 404 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 405 {
mcm 2:0d0174b46fd3 406 if ( aux_return == 0U )
mcm 2:0d0174b46fd3 407 {
mcm 2:0d0174b46fd3 408 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 409 }
mcm 2:0d0174b46fd3 410 else
mcm 2:0d0174b46fd3 411 {
mcm 2:0d0174b46fd3 412 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 413 }
mcm 2:0d0174b46fd3 414 }
mcm 2:0d0174b46fd3 415 else
mcm 2:0d0174b46fd3 416 {
mcm 2:0d0174b46fd3 417 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 418 }
mcm 2:0d0174b46fd3 419 }
mcm 2:0d0174b46fd3 420
mcm 2:0d0174b46fd3 421
mcm 2:0d0174b46fd3 422
mcm 2:0d0174b46fd3 423 /**
mcm 2:0d0174b46fd3 424 * @brief SCD30_ReadMeasurement ( SCD30_output_data_t* )
mcm 2:0d0174b46fd3 425 * @details It gets all the data.
mcm 2:0d0174b46fd3 426 *
mcm 2:0d0174b46fd3 427 * @param[in] N/A.
mcm 2:0d0174b46fd3 428 *
mcm 2:0d0174b46fd3 429 * @param[out] data: All the data.
mcm 2:0d0174b46fd3 430 *
mcm 2:0d0174b46fd3 431 *
mcm 2:0d0174b46fd3 432 * @return Status of SCD30_ReadMeasurement.
mcm 2:0d0174b46fd3 433 *
mcm 2:0d0174b46fd3 434 * @author Manuel Caballero
mcm 2:0d0174b46fd3 435 * @date 07/May/2021
mcm 2:0d0174b46fd3 436 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 437 * @pre This function updates the raw data too.
mcm 2:0d0174b46fd3 438 * @warning N/A.
mcm 2:0d0174b46fd3 439 */
mcm 2:0d0174b46fd3 440 SCD30::SCD30_status_t SCD30::SCD30_ReadMeasurement ( SCD30_output_data_t* data )
mcm 2:0d0174b46fd3 441 {
mcm 2:0d0174b46fd3 442 SCD30::SCD30_status_t aux;
mcm 2:0d0174b46fd3 443 uint32_t data_aux;
mcm 2:0d0174b46fd3 444
mcm 2:0d0174b46fd3 445 /* Read all the raw data */
mcm 2:0d0174b46fd3 446 aux = SCD30_ReadRawMeasurement ( (SCD30_raw_output_data_t*)&data->raw );
mcm 2:0d0174b46fd3 447
mcm 2:0d0174b46fd3 448
mcm 2:0d0174b46fd3 449 /* Parse the data */
mcm 2:0d0174b46fd3 450 data_aux = data->raw.co2_mmsb;
mcm 2:0d0174b46fd3 451 data_aux <<= 8U;
mcm 2:0d0174b46fd3 452 data_aux |= data->raw.co2_mlsb;
mcm 2:0d0174b46fd3 453 data_aux <<= 8U;
mcm 2:0d0174b46fd3 454 data_aux |= data->raw.co2_lmsb;
mcm 2:0d0174b46fd3 455 data_aux <<= 8U;
mcm 2:0d0174b46fd3 456 data_aux |= data->raw.co2_llsb;
mcm 2:0d0174b46fd3 457
mcm 2:0d0174b46fd3 458 data->processed.co2 = *(float*)&data_aux;
mcm 2:0d0174b46fd3 459
mcm 2:0d0174b46fd3 460 data_aux = data->raw.temperature_mmsb;
mcm 2:0d0174b46fd3 461 data_aux <<= 8U;
mcm 2:0d0174b46fd3 462 data_aux |= data->raw.temperature_mlsb;
mcm 2:0d0174b46fd3 463 data_aux <<= 8U;
mcm 2:0d0174b46fd3 464 data_aux |= data->raw.temperature_lmsb;
mcm 2:0d0174b46fd3 465 data_aux <<= 8U;
mcm 2:0d0174b46fd3 466 data_aux |= data->raw.temperature_llsb;
mcm 2:0d0174b46fd3 467
mcm 2:0d0174b46fd3 468 data->processed.temperature = *(float*)&data_aux;
mcm 2:0d0174b46fd3 469
mcm 2:0d0174b46fd3 470 data_aux = data->raw.humidity_mmsb;
mcm 2:0d0174b46fd3 471 data_aux <<= 8U;
mcm 2:0d0174b46fd3 472 data_aux |= data->raw.humidity_mlsb;
mcm 2:0d0174b46fd3 473 data_aux <<= 8U;
mcm 2:0d0174b46fd3 474 data_aux |= data->raw.humidity_lmsb;
mcm 2:0d0174b46fd3 475 data_aux <<= 8U;
mcm 2:0d0174b46fd3 476 data_aux |= data->raw.humidity_llsb;
mcm 2:0d0174b46fd3 477
mcm 2:0d0174b46fd3 478 data->processed.humidity = *(float*)&data_aux;
mcm 2:0d0174b46fd3 479
mcm 2:0d0174b46fd3 480
mcm 2:0d0174b46fd3 481 return aux;
mcm 2:0d0174b46fd3 482 }
mcm 2:0d0174b46fd3 483
mcm 2:0d0174b46fd3 484
mcm 2:0d0174b46fd3 485
mcm 2:0d0174b46fd3 486 /**
mcm 2:0d0174b46fd3 487 * @brief SCD30_SetContinuousASC ( SCD30_continuous_auto_selfcal_t )
mcm 2:0d0174b46fd3 488 * @details It enables/disables the continuous automatic self-calibration.
mcm 2:0d0174b46fd3 489 *
mcm 2:0d0174b46fd3 490 * @param[in] asc: Continuous automatic self-calibration value.
mcm 2:0d0174b46fd3 491 *
mcm 2:0d0174b46fd3 492 * @param[out] N/A
mcm 2:0d0174b46fd3 493 *
mcm 2:0d0174b46fd3 494 *
mcm 2:0d0174b46fd3 495 * @return Status of SCD30_SetContinuousASC.
mcm 2:0d0174b46fd3 496 *
mcm 2:0d0174b46fd3 497 * @author Manuel Caballero
mcm 2:0d0174b46fd3 498 * @date 07/May/2021
mcm 2:0d0174b46fd3 499 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 500 * @pre N/A
mcm 2:0d0174b46fd3 501 * @warning N/A.
mcm 2:0d0174b46fd3 502 */
mcm 2:0d0174b46fd3 503 SCD30::SCD30_status_t SCD30::SCD30_SetContinuousASC ( SCD30_continuous_auto_selfcal_t asc )
mcm 2:0d0174b46fd3 504 {
mcm 2:0d0174b46fd3 505 char cmd[5] = { 0U };
mcm 2:0d0174b46fd3 506 uint32_t aux;
mcm 2:0d0174b46fd3 507
mcm 2:0d0174b46fd3 508 /* Write the register */
mcm 2:0d0174b46fd3 509 cmd[0] = (char)( SCD30_CONTINUOUS_AUTOMATIC_SELF_CALIBRATION >> 8U );
mcm 2:0d0174b46fd3 510 cmd[1] = (char)( SCD30_CONTINUOUS_AUTOMATIC_SELF_CALIBRATION & 0xFF );
mcm 2:0d0174b46fd3 511 cmd[2] = (char)( asc >> 8U );
mcm 2:0d0174b46fd3 512 cmd[3] = (char)( asc & 0xFF );
mcm 2:0d0174b46fd3 513 cmd[4] = SCD30_CalculateI2C_CRC8 ( asc );
mcm 2:0d0174b46fd3 514 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 515
mcm 2:0d0174b46fd3 516
mcm 2:0d0174b46fd3 517 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 518 {
mcm 2:0d0174b46fd3 519 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 520 }
mcm 2:0d0174b46fd3 521 else
mcm 2:0d0174b46fd3 522 {
mcm 2:0d0174b46fd3 523 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 524 }
mcm 2:0d0174b46fd3 525 }
mcm 2:0d0174b46fd3 526
mcm 2:0d0174b46fd3 527
mcm 2:0d0174b46fd3 528
mcm 2:0d0174b46fd3 529 /**
mcm 2:0d0174b46fd3 530 * @brief SCD30_GetContinuousASC ( SCD30_continuous_auto_selfcal_t* )
mcm 2:0d0174b46fd3 531 * @details It gets the continuous automatic self-calibration bit.
mcm 2:0d0174b46fd3 532 *
mcm 2:0d0174b46fd3 533 * @param[in] N/A.
mcm 2:0d0174b46fd3 534 *
mcm 2:0d0174b46fd3 535 * @param[out] asc: Continuous automatic self-calibration value.
mcm 2:0d0174b46fd3 536 *
mcm 2:0d0174b46fd3 537 *
mcm 2:0d0174b46fd3 538 * @return Status of SCD30_GetContinuousASC.
mcm 2:0d0174b46fd3 539 *
mcm 2:0d0174b46fd3 540 * @author Manuel Caballero
mcm 2:0d0174b46fd3 541 * @date 07/May/2021
mcm 2:0d0174b46fd3 542 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 543 * @pre N/A
mcm 2:0d0174b46fd3 544 * @warning N/A.
mcm 2:0d0174b46fd3 545 */
mcm 2:0d0174b46fd3 546 SCD30::SCD30_status_t SCD30::SCD30_GetContinuousASC ( SCD30_continuous_auto_selfcal_t* asc )
mcm 2:0d0174b46fd3 547 {
mcm 2:0d0174b46fd3 548 char cmd[4] = { 0U };
mcm 2:0d0174b46fd3 549 uint8_t aux_crc;
mcm 2:0d0174b46fd3 550 uint16_t aux_res;
mcm 2:0d0174b46fd3 551 uint32_t aux;
mcm 2:0d0174b46fd3 552
mcm 2:0d0174b46fd3 553 /* Write the register */
mcm 2:0d0174b46fd3 554 cmd[0] = (char)( SCD30_CONTINUOUS_AUTOMATIC_SELF_CALIBRATION >> 8U );
mcm 2:0d0174b46fd3 555 cmd[1] = (char)( SCD30_CONTINUOUS_AUTOMATIC_SELF_CALIBRATION & 0xFF );
mcm 2:0d0174b46fd3 556 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 557
mcm 2:0d0174b46fd3 558 /* Read the register */
mcm 2:0d0174b46fd3 559 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 560
mcm 2:0d0174b46fd3 561 /* Parse the data */
mcm 2:0d0174b46fd3 562 aux_res = cmd[0];
mcm 2:0d0174b46fd3 563 aux_res <<= 8U;
mcm 2:0d0174b46fd3 564 aux_res |= cmd[1];
mcm 2:0d0174b46fd3 565
mcm 2:0d0174b46fd3 566 *asc = (SCD30_continuous_auto_selfcal_t)aux_res;
mcm 2:0d0174b46fd3 567
mcm 2:0d0174b46fd3 568 /* Check the CRC */
mcm 2:0d0174b46fd3 569 aux_crc = SCD30_CalculateI2C_CRC8 ( *asc );
mcm 2:0d0174b46fd3 570
mcm 2:0d0174b46fd3 571 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 572 {
mcm 2:0d0174b46fd3 573 if ( ( aux_crc - cmd[2] ) == 0U )
mcm 2:0d0174b46fd3 574 {
mcm 2:0d0174b46fd3 575 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 576 }
mcm 2:0d0174b46fd3 577 else
mcm 2:0d0174b46fd3 578 {
mcm 2:0d0174b46fd3 579 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 580 }
mcm 2:0d0174b46fd3 581 }
mcm 2:0d0174b46fd3 582 else
mcm 2:0d0174b46fd3 583 {
mcm 2:0d0174b46fd3 584 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 585 }
mcm 2:0d0174b46fd3 586 }
mcm 2:0d0174b46fd3 587
mcm 2:0d0174b46fd3 588
mcm 2:0d0174b46fd3 589
mcm 2:0d0174b46fd3 590 /**
mcm 2:0d0174b46fd3 591 * @brief SCD30_SetForcedRecalibrationValue ( uint16_t )
mcm 2:0d0174b46fd3 592 * @details It sets the forced recalibration value.
mcm 2:0d0174b46fd3 593 *
mcm 2:0d0174b46fd3 594 * @param[in] frc: Forced recalibration value.
mcm 2:0d0174b46fd3 595 *
mcm 2:0d0174b46fd3 596 * @param[out] N/A
mcm 2:0d0174b46fd3 597 *
mcm 2:0d0174b46fd3 598 *
mcm 2:0d0174b46fd3 599 * @return Status of SCD30_SetForcedRecalibrationValue.
mcm 2:0d0174b46fd3 600 *
mcm 2:0d0174b46fd3 601 * @author Manuel Caballero
mcm 2:0d0174b46fd3 602 * @date 07/May/2021
mcm 2:0d0174b46fd3 603 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 604 * @pre N/A
mcm 2:0d0174b46fd3 605 * @warning N/A.
mcm 2:0d0174b46fd3 606 */
mcm 2:0d0174b46fd3 607 SCD30::SCD30_status_t SCD30::SCD30_SetForcedRecalibrationValue ( uint16_t frc )
mcm 2:0d0174b46fd3 608 {
mcm 2:0d0174b46fd3 609 char cmd[5] = { 0U };
mcm 2:0d0174b46fd3 610 uint32_t aux;
mcm 2:0d0174b46fd3 611
mcm 2:0d0174b46fd3 612 /* Write the register */
mcm 2:0d0174b46fd3 613 cmd[0] = (char)( SCD30_SET_FORCED_RECALIBRATION >> 8U );
mcm 2:0d0174b46fd3 614 cmd[1] = (char)( SCD30_SET_FORCED_RECALIBRATION & 0xFF );
mcm 2:0d0174b46fd3 615 cmd[2] = (char)( frc >> 8U );
mcm 2:0d0174b46fd3 616 cmd[3] = (char)( frc & 0xFF );
mcm 2:0d0174b46fd3 617 cmd[4] = SCD30_CalculateI2C_CRC8 ( frc );
mcm 2:0d0174b46fd3 618 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 619
mcm 2:0d0174b46fd3 620
mcm 2:0d0174b46fd3 621 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 622 {
mcm 2:0d0174b46fd3 623 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 624 }
mcm 2:0d0174b46fd3 625 else
mcm 2:0d0174b46fd3 626 {
mcm 2:0d0174b46fd3 627 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 628 }
mcm 2:0d0174b46fd3 629 }
mcm 2:0d0174b46fd3 630
mcm 2:0d0174b46fd3 631
mcm 2:0d0174b46fd3 632
mcm 2:0d0174b46fd3 633 /**
mcm 2:0d0174b46fd3 634 * @brief SCD30_GetForcedRecalibrationValue ( uint16_t* )
mcm 2:0d0174b46fd3 635 * @details It gets the forced recalibration value.
mcm 2:0d0174b46fd3 636 *
mcm 2:0d0174b46fd3 637 * @param[in] N/A.
mcm 2:0d0174b46fd3 638 *
mcm 2:0d0174b46fd3 639 * @param[out] frc: Forced recalibration value.
mcm 2:0d0174b46fd3 640 *
mcm 2:0d0174b46fd3 641 *
mcm 2:0d0174b46fd3 642 * @return Status of SCD30_GetForcedRecalibrationValue.
mcm 2:0d0174b46fd3 643 *
mcm 2:0d0174b46fd3 644 * @author Manuel Caballero
mcm 2:0d0174b46fd3 645 * @date 07/May/2021
mcm 2:0d0174b46fd3 646 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 647 * @pre N/A
mcm 2:0d0174b46fd3 648 * @warning N/A.
mcm 2:0d0174b46fd3 649 */
mcm 2:0d0174b46fd3 650 SCD30::SCD30_status_t SCD30::SCD30_GetForcedRecalibrationValue ( uint16_t* frc )
mcm 2:0d0174b46fd3 651 {
mcm 2:0d0174b46fd3 652 char cmd[3] = { 0U };
mcm 2:0d0174b46fd3 653 uint8_t aux_crc;
mcm 2:0d0174b46fd3 654 uint32_t aux;
mcm 2:0d0174b46fd3 655
mcm 2:0d0174b46fd3 656 /* Write the register */
mcm 2:0d0174b46fd3 657 cmd[0] = (char)( SCD30_SET_FORCED_RECALIBRATION >> 8U );
mcm 2:0d0174b46fd3 658 cmd[1] = (char)( SCD30_SET_FORCED_RECALIBRATION & 0xFF );
mcm 2:0d0174b46fd3 659 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 660
mcm 2:0d0174b46fd3 661 /* Read the register */
mcm 2:0d0174b46fd3 662 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 663
mcm 2:0d0174b46fd3 664 /* Parse the data */
mcm 2:0d0174b46fd3 665 *frc = cmd[0];
mcm 2:0d0174b46fd3 666 *frc <<= 8U;
mcm 2:0d0174b46fd3 667 *frc |= cmd[1];
mcm 2:0d0174b46fd3 668
mcm 2:0d0174b46fd3 669 /* Check the CRC */
mcm 2:0d0174b46fd3 670 aux_crc = SCD30_CalculateI2C_CRC8 ( *frc );
mcm 2:0d0174b46fd3 671
mcm 2:0d0174b46fd3 672 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 673 {
mcm 2:0d0174b46fd3 674 if ( ( aux_crc - cmd[2] ) == 0U )
mcm 2:0d0174b46fd3 675 {
mcm 2:0d0174b46fd3 676 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 677 }
mcm 2:0d0174b46fd3 678 else
mcm 2:0d0174b46fd3 679 {
mcm 2:0d0174b46fd3 680 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 681 }
mcm 2:0d0174b46fd3 682 }
mcm 2:0d0174b46fd3 683 else
mcm 2:0d0174b46fd3 684 {
mcm 2:0d0174b46fd3 685 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 686 }
mcm 2:0d0174b46fd3 687 }
mcm 2:0d0174b46fd3 688
mcm 2:0d0174b46fd3 689
mcm 2:0d0174b46fd3 690
mcm 2:0d0174b46fd3 691 /**
mcm 2:0d0174b46fd3 692 * @brief SCD30_SetTemperatureOffsetValue ( uint16_t )
mcm 2:0d0174b46fd3 693 * @details It sets the temperature offset value.
mcm 2:0d0174b46fd3 694 *
mcm 2:0d0174b46fd3 695 * @param[in] temp_offset: Temperature offset value.
mcm 2:0d0174b46fd3 696 *
mcm 2:0d0174b46fd3 697 * @param[out] N/A
mcm 2:0d0174b46fd3 698 *
mcm 2:0d0174b46fd3 699 *
mcm 2:0d0174b46fd3 700 * @return Status of SCD30_SetTemperatureOffsetValue.
mcm 2:0d0174b46fd3 701 *
mcm 2:0d0174b46fd3 702 * @author Manuel Caballero
mcm 2:0d0174b46fd3 703 * @date 07/May/2021
mcm 2:0d0174b46fd3 704 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 705 * @pre N/A
mcm 2:0d0174b46fd3 706 * @warning N/A.
mcm 2:0d0174b46fd3 707 */
mcm 2:0d0174b46fd3 708 SCD30::SCD30_status_t SCD30::SCD30_SetTemperatureOffsetValue ( uint16_t temp_offset )
mcm 2:0d0174b46fd3 709 {
mcm 2:0d0174b46fd3 710 char cmd[5] = { 0U };
mcm 2:0d0174b46fd3 711 uint32_t aux;
mcm 2:0d0174b46fd3 712
mcm 2:0d0174b46fd3 713 /* Write the register */
mcm 2:0d0174b46fd3 714 cmd[0] = (char)( SCD30_SET_TEMPERATURE_OFFSET >> 8U );
mcm 2:0d0174b46fd3 715 cmd[1] = (char)( SCD30_SET_TEMPERATURE_OFFSET & 0xFF );
mcm 2:0d0174b46fd3 716 cmd[2] = (char)( temp_offset >> 8U );
mcm 2:0d0174b46fd3 717 cmd[3] = (char)( temp_offset & 0xFF );
mcm 2:0d0174b46fd3 718 cmd[4] = SCD30_CalculateI2C_CRC8 ( temp_offset );
mcm 2:0d0174b46fd3 719 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 720
mcm 2:0d0174b46fd3 721
mcm 2:0d0174b46fd3 722 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 723 {
mcm 2:0d0174b46fd3 724 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 725 }
mcm 2:0d0174b46fd3 726 else
mcm 2:0d0174b46fd3 727 {
mcm 2:0d0174b46fd3 728 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 729 }
mcm 2:0d0174b46fd3 730 }
mcm 2:0d0174b46fd3 731
mcm 2:0d0174b46fd3 732
mcm 2:0d0174b46fd3 733
mcm 2:0d0174b46fd3 734 /**
mcm 2:0d0174b46fd3 735 * @brief SCD30_GetTemperatureOffsetValue ( uint16_t* )
mcm 2:0d0174b46fd3 736 * @details It gets the temperature offset value.
mcm 2:0d0174b46fd3 737 *
mcm 2:0d0174b46fd3 738 * @param[in] N/A.
mcm 2:0d0174b46fd3 739 *
mcm 2:0d0174b46fd3 740 * @param[out] temp_offset: Temperature offset value.
mcm 2:0d0174b46fd3 741 *
mcm 2:0d0174b46fd3 742 *
mcm 2:0d0174b46fd3 743 * @return Status of SCD30_GetTemperatureOffsetValue.
mcm 2:0d0174b46fd3 744 *
mcm 2:0d0174b46fd3 745 * @author Manuel Caballero
mcm 2:0d0174b46fd3 746 * @date 07/May/2021
mcm 2:0d0174b46fd3 747 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 748 * @pre N/A
mcm 2:0d0174b46fd3 749 * @warning N/A.
mcm 2:0d0174b46fd3 750 */
mcm 2:0d0174b46fd3 751 SCD30::SCD30_status_t SCD30::SCD30_GetTemperatureOffsetValue ( uint16_t* temp_offset )
mcm 2:0d0174b46fd3 752 {
mcm 2:0d0174b46fd3 753 char cmd[3] = { 0U };
mcm 2:0d0174b46fd3 754 uint8_t aux_crc;
mcm 2:0d0174b46fd3 755 uint32_t aux;
mcm 2:0d0174b46fd3 756
mcm 2:0d0174b46fd3 757 /* Write the register */
mcm 2:0d0174b46fd3 758 cmd[0] = (char)( SCD30_SET_FORCED_RECALIBRATION >> 8U );
mcm 2:0d0174b46fd3 759 cmd[1] = (char)( SCD30_SET_FORCED_RECALIBRATION & 0xFF );
mcm 2:0d0174b46fd3 760 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 761
mcm 2:0d0174b46fd3 762 /* Read the register */
mcm 2:0d0174b46fd3 763 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 764
mcm 2:0d0174b46fd3 765 /* Parse the data */
mcm 2:0d0174b46fd3 766 *temp_offset = cmd[0];
mcm 2:0d0174b46fd3 767 *temp_offset <<= 8U;
mcm 2:0d0174b46fd3 768 *temp_offset |= cmd[1];
mcm 2:0d0174b46fd3 769
mcm 2:0d0174b46fd3 770 /* Check the CRC */
mcm 2:0d0174b46fd3 771 aux_crc = SCD30_CalculateI2C_CRC8 ( *temp_offset );
mcm 2:0d0174b46fd3 772
mcm 2:0d0174b46fd3 773 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 774 {
mcm 2:0d0174b46fd3 775 if ( ( aux_crc - cmd[2] ) == 0U )
mcm 2:0d0174b46fd3 776 {
mcm 2:0d0174b46fd3 777 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 778 }
mcm 2:0d0174b46fd3 779 else
mcm 2:0d0174b46fd3 780 {
mcm 2:0d0174b46fd3 781 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 782 }
mcm 2:0d0174b46fd3 783 }
mcm 2:0d0174b46fd3 784 else
mcm 2:0d0174b46fd3 785 {
mcm 2:0d0174b46fd3 786 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 787 }
mcm 2:0d0174b46fd3 788 }
mcm 2:0d0174b46fd3 789
mcm 2:0d0174b46fd3 790
mcm 2:0d0174b46fd3 791
mcm 2:0d0174b46fd3 792 /**
mcm 2:0d0174b46fd3 793 * @brief SCD30_SetAltitudeCompensationValue ( uint16_t )
mcm 2:0d0174b46fd3 794 * @details It sets the altitude compensation value.
mcm 2:0d0174b46fd3 795 *
mcm 2:0d0174b46fd3 796 * @param[in] alt_comp: Altitude compensation value.
mcm 2:0d0174b46fd3 797 *
mcm 2:0d0174b46fd3 798 * @param[out] N/A
mcm 2:0d0174b46fd3 799 *
mcm 2:0d0174b46fd3 800 *
mcm 2:0d0174b46fd3 801 * @return Status of SCD30_SetAltitudeCompensationValue.
mcm 2:0d0174b46fd3 802 *
mcm 2:0d0174b46fd3 803 * @author Manuel Caballero
mcm 2:0d0174b46fd3 804 * @date 07/May/2021
mcm 2:0d0174b46fd3 805 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 806 * @pre N/A
mcm 2:0d0174b46fd3 807 * @warning N/A.
mcm 2:0d0174b46fd3 808 */
mcm 2:0d0174b46fd3 809 SCD30::SCD30_status_t SCD30::SCD30_SetAltitudeCompensationValue ( uint16_t alt_comp )
mcm 2:0d0174b46fd3 810 {
mcm 2:0d0174b46fd3 811 char cmd[5] = { 0U };
mcm 2:0d0174b46fd3 812 uint32_t aux;
mcm 2:0d0174b46fd3 813
mcm 2:0d0174b46fd3 814 /* Write the register */
mcm 2:0d0174b46fd3 815 cmd[0] = (char)( SCD30_SET_ALTITUDE_COMPENSATION >> 8U );
mcm 2:0d0174b46fd3 816 cmd[1] = (char)( SCD30_SET_ALTITUDE_COMPENSATION & 0xFF );
mcm 2:0d0174b46fd3 817 cmd[2] = (char)( alt_comp >> 8U );
mcm 2:0d0174b46fd3 818 cmd[3] = (char)( alt_comp & 0xFF );
mcm 2:0d0174b46fd3 819 cmd[4] = SCD30_CalculateI2C_CRC8 ( alt_comp );
mcm 2:0d0174b46fd3 820 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 821
mcm 2:0d0174b46fd3 822
mcm 2:0d0174b46fd3 823 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 824 {
mcm 2:0d0174b46fd3 825 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 826 }
mcm 2:0d0174b46fd3 827 else
mcm 2:0d0174b46fd3 828 {
mcm 2:0d0174b46fd3 829 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 830 }
mcm 2:0d0174b46fd3 831 }
mcm 2:0d0174b46fd3 832
mcm 2:0d0174b46fd3 833
mcm 2:0d0174b46fd3 834
mcm 2:0d0174b46fd3 835 /**
mcm 2:0d0174b46fd3 836 * @brief SCD30_GetAltitudeCompensationValue ( uint16_t* )
mcm 2:0d0174b46fd3 837 * @details It gets the altitude compensation value.
mcm 2:0d0174b46fd3 838 *
mcm 2:0d0174b46fd3 839 * @param[in] N/A.
mcm 2:0d0174b46fd3 840 *
mcm 2:0d0174b46fd3 841 * @param[out] alt_comp: Altitude compensation value.
mcm 2:0d0174b46fd3 842 *
mcm 2:0d0174b46fd3 843 *
mcm 2:0d0174b46fd3 844 * @return Status of SCD30_GetAltitudeCompensationValue.
mcm 2:0d0174b46fd3 845 *
mcm 2:0d0174b46fd3 846 * @author Manuel Caballero
mcm 2:0d0174b46fd3 847 * @date 07/May/2021
mcm 2:0d0174b46fd3 848 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 849 * @pre N/A
mcm 2:0d0174b46fd3 850 * @warning N/A.
mcm 2:0d0174b46fd3 851 */
mcm 2:0d0174b46fd3 852 SCD30::SCD30_status_t SCD30::SCD30_GetAltitudeCompensationValue ( uint16_t* alt_comp )
mcm 2:0d0174b46fd3 853 {
mcm 2:0d0174b46fd3 854 char cmd[3] = { 0U };
mcm 2:0d0174b46fd3 855 uint8_t aux_crc;
mcm 2:0d0174b46fd3 856 uint32_t aux;
mcm 2:0d0174b46fd3 857
mcm 2:0d0174b46fd3 858 /* Write the register */
mcm 2:0d0174b46fd3 859 cmd[0] = (char)( SCD30_SET_ALTITUDE_COMPENSATION >> 8U );
mcm 2:0d0174b46fd3 860 cmd[1] = (char)( SCD30_SET_ALTITUDE_COMPENSATION & 0xFF );
mcm 2:0d0174b46fd3 861 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 862
mcm 2:0d0174b46fd3 863 /* Read the register */
mcm 2:0d0174b46fd3 864 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 865
mcm 2:0d0174b46fd3 866 /* Parse the data */
mcm 2:0d0174b46fd3 867 *alt_comp = cmd[0];
mcm 2:0d0174b46fd3 868 *alt_comp <<= 8U;
mcm 2:0d0174b46fd3 869 *alt_comp |= cmd[1];
mcm 2:0d0174b46fd3 870
mcm 2:0d0174b46fd3 871 /* Check the CRC */
mcm 2:0d0174b46fd3 872 aux_crc = SCD30_CalculateI2C_CRC8 ( *alt_comp );
mcm 2:0d0174b46fd3 873
mcm 2:0d0174b46fd3 874 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 875 {
mcm 2:0d0174b46fd3 876 if ( ( aux_crc - cmd[2] ) == 0U )
mcm 2:0d0174b46fd3 877 {
mcm 2:0d0174b46fd3 878 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 879 }
mcm 2:0d0174b46fd3 880 else
mcm 2:0d0174b46fd3 881 {
mcm 2:0d0174b46fd3 882 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 883 }
mcm 2:0d0174b46fd3 884 }
mcm 2:0d0174b46fd3 885 else
mcm 2:0d0174b46fd3 886 {
mcm 2:0d0174b46fd3 887 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 888 }
mcm 2:0d0174b46fd3 889 }
mcm 2:0d0174b46fd3 890
mcm 2:0d0174b46fd3 891
mcm 2:0d0174b46fd3 892
mcm 2:0d0174b46fd3 893 /**
mcm 2:0d0174b46fd3 894 * @brief SCD30_GetFirmwareVersion ( SCD30_fw_version_t* )
mcm 2:0d0174b46fd3 895 * @details It gets the firmware version value.
mcm 2:0d0174b46fd3 896 *
mcm 2:0d0174b46fd3 897 * @param[in] N/A.
mcm 2:0d0174b46fd3 898 *
mcm 2:0d0174b46fd3 899 * @param[out] fw: Firmware version value.
mcm 2:0d0174b46fd3 900 *
mcm 2:0d0174b46fd3 901 *
mcm 2:0d0174b46fd3 902 * @return Status of SCD30_GetFirmwareVersion.
mcm 2:0d0174b46fd3 903 *
mcm 2:0d0174b46fd3 904 * @author Manuel Caballero
mcm 2:0d0174b46fd3 905 * @date 07/May/2021
mcm 2:0d0174b46fd3 906 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 907 * @pre N/A
mcm 2:0d0174b46fd3 908 * @warning N/A.
mcm 2:0d0174b46fd3 909 */
mcm 2:0d0174b46fd3 910 SCD30::SCD30_status_t SCD30::SCD30_GetFirmwareVersion ( SCD30_fw_version_t* fw )
mcm 2:0d0174b46fd3 911 {
mcm 2:0d0174b46fd3 912 char cmd[3] = { 0U };
mcm 2:0d0174b46fd3 913 uint16_t aux_seed;
mcm 2:0d0174b46fd3 914 uint8_t aux_crc;
mcm 2:0d0174b46fd3 915 uint32_t aux;
mcm 2:0d0174b46fd3 916
mcm 2:0d0174b46fd3 917 /* Write the register */
mcm 2:0d0174b46fd3 918 cmd[0] = (char)( SCD30_FIRMWARE_VERSION >> 8U );
mcm 2:0d0174b46fd3 919 cmd[1] = (char)( SCD30_FIRMWARE_VERSION & 0xFF );
mcm 2:0d0174b46fd3 920 aux = _i2c.write ( _SCD30_Addr, &cmd[0], 2U, false );
mcm 2:0d0174b46fd3 921
mcm 2:0d0174b46fd3 922 /* Read the register */
mcm 2:0d0174b46fd3 923 aux |= _i2c.read ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:0d0174b46fd3 924
mcm 2:0d0174b46fd3 925 /* Parse the data */
mcm 2:0d0174b46fd3 926 fw->version_major = cmd[0];
mcm 2:0d0174b46fd3 927 fw->version_minor = cmd[1];
mcm 2:0d0174b46fd3 928
mcm 2:0d0174b46fd3 929 /* Check the CRC */
mcm 2:0d0174b46fd3 930 aux_seed = fw->version_major;
mcm 2:0d0174b46fd3 931 aux_seed <<= 8U;
mcm 2:0d0174b46fd3 932 aux_seed |= fw->version_minor;
mcm 2:0d0174b46fd3 933 aux_crc = SCD30_CalculateI2C_CRC8 ( aux_seed );
mcm 2:0d0174b46fd3 934
mcm 2:0d0174b46fd3 935 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 936 {
mcm 2:0d0174b46fd3 937 if ( ( aux_crc - cmd[2] ) == 0U )
mcm 2:0d0174b46fd3 938 {
mcm 2:0d0174b46fd3 939 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 940 }
mcm 2:0d0174b46fd3 941 else
mcm 2:0d0174b46fd3 942 {
mcm 2:0d0174b46fd3 943 return SCD30_DATA_CORRUPTED;
mcm 2:0d0174b46fd3 944 }
mcm 2:0d0174b46fd3 945 }
mcm 2:0d0174b46fd3 946 else
mcm 2:0d0174b46fd3 947 {
mcm 2:0d0174b46fd3 948 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 949 }
mcm 2:0d0174b46fd3 950 }
mcm 2:0d0174b46fd3 951
mcm 2:0d0174b46fd3 952
mcm 2:0d0174b46fd3 953
mcm 2:0d0174b46fd3 954 /**
mcm 2:0d0174b46fd3 955 * @brief SCD30_SoftReset ( void )
mcm 2:0d0174b46fd3 956 * @details It performs a software reset.
mcm 2:0d0174b46fd3 957 *
mcm 2:0d0174b46fd3 958 * @param[in] N/A.
mcm 2:0d0174b46fd3 959 *
mcm 2:0d0174b46fd3 960 * @param[out] N/A.
mcm 2:0d0174b46fd3 961 *
mcm 2:0d0174b46fd3 962 *
mcm 2:0d0174b46fd3 963 * @return Status of SCD30_SoftReset.
mcm 2:0d0174b46fd3 964 *
mcm 2:0d0174b46fd3 965 * @author Manuel Caballero
mcm 2:0d0174b46fd3 966 * @date 07/May/2021
mcm 2:0d0174b46fd3 967 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 968 * @pre N/A
mcm 2:0d0174b46fd3 969 * @warning N/A.
mcm 2:0d0174b46fd3 970 */
mcm 2:0d0174b46fd3 971 SCD30::SCD30_status_t SCD30::SCD30_SoftReset ( void )
mcm 2:0d0174b46fd3 972 {
mcm 2:0d0174b46fd3 973 char cmd[2] = { 0U };
mcm 2:0d0174b46fd3 974 uint32_t aux;
mcm 2:0d0174b46fd3 975
mcm 2:0d0174b46fd3 976 /* Write the register */
mcm 2:0d0174b46fd3 977 cmd[0] = (char)( SCD30_SOFTRESET >> 8U );
mcm 2:0d0174b46fd3 978 cmd[1] = (char)( SCD30_SOFTRESET & 0xFF );
mcm 2:0d0174b46fd3 979 aux = _i2c.write ( _SCD30_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:0d0174b46fd3 980
mcm 2:0d0174b46fd3 981
mcm 2:0d0174b46fd3 982
mcm 2:0d0174b46fd3 983 if ( aux == I2C_SUCCESS )
mcm 2:0d0174b46fd3 984 {
mcm 2:0d0174b46fd3 985 return SCD30_SUCCESS;
mcm 2:0d0174b46fd3 986 }
mcm 2:0d0174b46fd3 987 else
mcm 2:0d0174b46fd3 988 {
mcm 2:0d0174b46fd3 989 return SCD30_FAILURE;
mcm 2:0d0174b46fd3 990 }
mcm 2:0d0174b46fd3 991 }
mcm 2:0d0174b46fd3 992
mcm 2:0d0174b46fd3 993
mcm 2:0d0174b46fd3 994
mcm 2:0d0174b46fd3 995 /**
mcm 2:0d0174b46fd3 996 * @brief SCD30_CalculateI2C_CRC8 ( uint16_t )
mcm 2:0d0174b46fd3 997 * @details It calculates the I2C checksum calculation (CRC-8).
mcm 2:0d0174b46fd3 998 *
mcm 2:0d0174b46fd3 999 * @param[in] seed: Data to calculate the CRC-8.
mcm 2:0d0174b46fd3 1000 *
mcm 2:0d0174b46fd3 1001 * @param[out] N/A.
mcm 2:0d0174b46fd3 1002 *
mcm 2:0d0174b46fd3 1003 *
mcm 2:0d0174b46fd3 1004 * @return Status of SCD30_CalculateI2C_CRC8.
mcm 2:0d0174b46fd3 1005 *
mcm 2:0d0174b46fd3 1006 * @author Manuel Caballero
mcm 2:0d0174b46fd3 1007 * @date 07/May/2021
mcm 2:0d0174b46fd3 1008 * @version 07/May/2021 The ORIGIN
mcm 2:0d0174b46fd3 1009 * @pre N/A
mcm 2:0d0174b46fd3 1010 * @warning N/A.
mcm 2:0d0174b46fd3 1011 */
mcm 2:0d0174b46fd3 1012 uint8_t SCD30::SCD30_CalculateI2C_CRC8 ( uint16_t seed )
mcm 2:0d0174b46fd3 1013 {
mcm 2:0d0174b46fd3 1014 uint8_t bit;
mcm 2:0d0174b46fd3 1015 uint8_t crc = SCD30_CRC8_INITIALIZATION;
mcm 2:0d0174b46fd3 1016
mcm 2:0d0174b46fd3 1017 // calculates 8-Bit checksum with given polynomial
mcm 2:0d0174b46fd3 1018
mcm 2:0d0174b46fd3 1019 crc ^= ( seed >> 8U ) & 255U;
mcm 2:0d0174b46fd3 1020 for(bit = 8U; bit > 0U; --bit)
mcm 2:0d0174b46fd3 1021 {
mcm 2:0d0174b46fd3 1022 if( crc & 0x80U )
mcm 2:0d0174b46fd3 1023 {
mcm 2:0d0174b46fd3 1024 crc = ( crc << 1U ) ^ SCD30_CRC8_POLYNOMIAL;
mcm 2:0d0174b46fd3 1025 }
mcm 2:0d0174b46fd3 1026 else
mcm 2:0d0174b46fd3 1027 {
mcm 2:0d0174b46fd3 1028 crc = ( crc << 1U );
mcm 2:0d0174b46fd3 1029 }
mcm 2:0d0174b46fd3 1030 }
mcm 2:0d0174b46fd3 1031
mcm 2:0d0174b46fd3 1032 crc ^= seed & 255U;
mcm 2:0d0174b46fd3 1033 for( bit = 8U; bit > 0U; --bit )
mcm 2:0d0174b46fd3 1034 {
mcm 2:0d0174b46fd3 1035 if( crc & 0x80 )
mcm 2:0d0174b46fd3 1036 {
mcm 2:0d0174b46fd3 1037 crc = ( crc << 1U ) ^ SCD30_CRC8_POLYNOMIAL;
mcm 2:0d0174b46fd3 1038 }
mcm 2:0d0174b46fd3 1039 else
mcm 2:0d0174b46fd3 1040 {
mcm 2:0d0174b46fd3 1041 crc = ( crc << 1U );
mcm 2:0d0174b46fd3 1042 }
mcm 2:0d0174b46fd3 1043 }
mcm 2:0d0174b46fd3 1044
mcm 2:0d0174b46fd3 1045 return crc;
mcm 2:0d0174b46fd3 1046 }