Ultra-Small, Low-Power, I2C-Compatible, 860-SPS, 16-Bit ADCs With Internal Reference, Oscillator, and Programmable Comparator

Committer:
mcm
Date:
Thu Jun 18 16:11:01 2020 +0000
Revision:
2:aecccd48773a
Parent:
0:9dd3592a3761
Child:
3:4a9619b441f0
The functions file is ready for review.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:aecccd48773a 1 /**
mcm 2:aecccd48773a 2 * @brief ADS111X.cpp
mcm 2:aecccd48773a 3 * @details Ultra-Small, Low-Power, I2C-Compatible, 860-SPS, 16-Bit ADCs With Internal Reference, Oscillator, and Programmable Comparator.
mcm 2:aecccd48773a 4 * Function file.
mcm 2:aecccd48773a 5 *
mcm 2:aecccd48773a 6 *
mcm 2:aecccd48773a 7 * @return N/A
mcm 2:aecccd48773a 8 *
mcm 2:aecccd48773a 9 * @author Manuel Caballero
mcm 2:aecccd48773a 10 * @date 18/June/2020
mcm 2:aecccd48773a 11 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 12 * @pre N/A.
mcm 2:aecccd48773a 13 * @warning N/A
mcm 2:aecccd48773a 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 2:aecccd48773a 15 */
mcm 2:aecccd48773a 16
mcm 2:aecccd48773a 17 #include "ADS111X.h"
mcm 2:aecccd48773a 18
mcm 2:aecccd48773a 19
mcm 2:aecccd48773a 20 ADS111X::ADS111X ( PinName sda, PinName scl, uint32_t addr, uint32_t freq, ADS111X_device_t device )
mcm 2:aecccd48773a 21 : _i2c ( sda, scl )
mcm 2:aecccd48773a 22 , _ADS111X_Addr ( addr )
mcm 2:aecccd48773a 23 , _device ( device )
mcm 2:aecccd48773a 24 {
mcm 2:aecccd48773a 25 _i2c.frequency( freq );
mcm 2:aecccd48773a 26 }
mcm 2:aecccd48773a 27
mcm 2:aecccd48773a 28
mcm 2:aecccd48773a 29 ADS111X::~ADS111X()
mcm 2:aecccd48773a 30 {
mcm 2:aecccd48773a 31 }
mcm 2:aecccd48773a 32
mcm 2:aecccd48773a 33
mcm 2:aecccd48773a 34 /**
mcm 2:aecccd48773a 35 * @brief ADS111X_StartSingleConversion ( void );
mcm 2:aecccd48773a 36 *
mcm 2:aecccd48773a 37 * @details It starts a new single conversion.
mcm 2:aecccd48773a 38 *
mcm 2:aecccd48773a 39 * @param[in] N/A.
mcm 2:aecccd48773a 40 *
mcm 2:aecccd48773a 41 * @param[out] N/A.
mcm 2:aecccd48773a 42 *
mcm 2:aecccd48773a 43 *
mcm 2:aecccd48773a 44 * @return Status of ADS111X_StartSingleConversion.
mcm 2:aecccd48773a 45 *
mcm 2:aecccd48773a 46 *
mcm 2:aecccd48773a 47 * @author Manuel Caballero
mcm 2:aecccd48773a 48 * @date 18/June/2020
mcm 2:aecccd48773a 49 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 50 * @pre This function can only be used when in power-down state and has no effect
mcm 2:aecccd48773a 51 * when a conversion is ongoing.
mcm 2:aecccd48773a 52 * @warning N/A.
mcm 2:aecccd48773a 53 */
mcm 2:aecccd48773a 54 ADS111X::ADS111X_status_t ADS111X::ADS111X_StartSingleConversion ( void )
mcm 2:aecccd48773a 55 {
mcm 2:aecccd48773a 56 char cmd[3] = { 0U };
mcm 2:aecccd48773a 57 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 58 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 59
mcm 2:aecccd48773a 60 /* Read the register to mask it */
mcm 2:aecccd48773a 61 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 62 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 63 aux |= _i2c.read ( _ADS111X_Addr, &cmd[1], 2U );
mcm 2:aecccd48773a 64
mcm 2:aecccd48773a 65 /* Mask it and update the register */
mcm 2:aecccd48773a 66 myConfig = cmd[1];
mcm 2:aecccd48773a 67 myConfig <<= 8U;
mcm 2:aecccd48773a 68 myConfig |= cmd[2];
mcm 2:aecccd48773a 69
mcm 2:aecccd48773a 70 myConfig |= CONFIG_OS_BUSY;
mcm 2:aecccd48773a 71 cmd[1] = (char)( myConfig >> 8U );
mcm 2:aecccd48773a 72 cmd[2] = (char)( myConfig );
mcm 2:aecccd48773a 73 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 74
mcm 2:aecccd48773a 75
mcm 2:aecccd48773a 76
mcm 2:aecccd48773a 77 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 78 {
mcm 2:aecccd48773a 79 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 80 }
mcm 2:aecccd48773a 81 else
mcm 2:aecccd48773a 82 {
mcm 2:aecccd48773a 83 return ADS111X_FAILURE;
mcm 2:aecccd48773a 84 }
mcm 2:aecccd48773a 85 }
mcm 2:aecccd48773a 86
mcm 2:aecccd48773a 87
mcm 2:aecccd48773a 88
mcm 2:aecccd48773a 89 /**
mcm 2:aecccd48773a 90 * @brief ADS111X_GetOS ( ADS111X_config_t* );
mcm 2:aecccd48773a 91 *
mcm 2:aecccd48773a 92 * @details It checks if the device is not currently performing a conversion.
mcm 2:aecccd48773a 93 *
mcm 2:aecccd48773a 94 * @param[in] N/A.
mcm 2:aecccd48773a 95 *
mcm 2:aecccd48773a 96 * @param[out] myADS111X: Operational status flag.
mcm 2:aecccd48773a 97 *
mcm 2:aecccd48773a 98 *
mcm 2:aecccd48773a 99 * @return Status of ADS111X_GetOS.
mcm 2:aecccd48773a 100 *
mcm 2:aecccd48773a 101 *
mcm 2:aecccd48773a 102 * @author Manuel Caballero
mcm 2:aecccd48773a 103 * @date 18/June/2020
mcm 2:aecccd48773a 104 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 105 * @pre N/A
mcm 2:aecccd48773a 106 * @warning N/A.
mcm 2:aecccd48773a 107 */
mcm 2:aecccd48773a 108 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetOS ( ADS111X_config_t* myADS111X )
mcm 2:aecccd48773a 109 {
mcm 2:aecccd48773a 110 char cmd[2] = { 0U };
mcm 2:aecccd48773a 111 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 112 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 113
mcm 2:aecccd48773a 114 /* Read the register to mask it */
mcm 2:aecccd48773a 115 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 116 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 117 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 118
mcm 2:aecccd48773a 119 /* Parse it */
mcm 2:aecccd48773a 120 myConfig = cmd[0];
mcm 2:aecccd48773a 121 myConfig <<= 8U;
mcm 2:aecccd48773a 122 myConfig |= cmd[1];
mcm 2:aecccd48773a 123 myADS111X->os = (ADS111X_config_os_t)( myConfig & CONFIG_OS_MASK );
mcm 2:aecccd48773a 124
mcm 2:aecccd48773a 125
mcm 2:aecccd48773a 126
mcm 2:aecccd48773a 127 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 128 {
mcm 2:aecccd48773a 129 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 130 }
mcm 2:aecccd48773a 131 else
mcm 2:aecccd48773a 132 {
mcm 2:aecccd48773a 133 return ADS111X_FAILURE;
mcm 2:aecccd48773a 134 }
mcm 2:aecccd48773a 135 }
mcm 2:aecccd48773a 136
mcm 2:aecccd48773a 137
mcm 2:aecccd48773a 138
mcm 2:aecccd48773a 139 /**
mcm 2:aecccd48773a 140 * @brief ADS111X_SetMux ( ADS111X_data_t );
mcm 2:aecccd48773a 141 *
mcm 2:aecccd48773a 142 * @details It sets input multiplexer configuration.
mcm 2:aecccd48773a 143 *
mcm 2:aecccd48773a 144 * @param[in] myADS111X: Input multiplexer configuration.
mcm 2:aecccd48773a 145 *
mcm 2:aecccd48773a 146 * @param[out] N/A.
mcm 2:aecccd48773a 147 *
mcm 2:aecccd48773a 148 *
mcm 2:aecccd48773a 149 * @return Status of ADS111X_SetMux.
mcm 2:aecccd48773a 150 *
mcm 2:aecccd48773a 151 *
mcm 2:aecccd48773a 152 * @author Manuel Caballero
mcm 2:aecccd48773a 153 * @date 18/June/2020
mcm 2:aecccd48773a 154 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 155 * @pre N/A
mcm 2:aecccd48773a 156 * @warning ADS1115 only.
mcm 2:aecccd48773a 157 */
mcm 2:aecccd48773a 158 ADS111X::ADS111X_status_t ADS111X::ADS111X_SetMux ( ADS111X_data_t myADS111X )
mcm 2:aecccd48773a 159 {
mcm 2:aecccd48773a 160 char cmd[3] = { 0U };
mcm 2:aecccd48773a 161 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 162 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 163
mcm 2:aecccd48773a 164 /* Only ADS1015 supports this functionality */
mcm 2:aecccd48773a 165 if ( myADS111X.device == DEVICE_ADS1115 )
mcm 2:aecccd48773a 166 {
mcm 2:aecccd48773a 167 /* Read the register to mask it */
mcm 2:aecccd48773a 168 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 169 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 170 aux |= _i2c.read ( _ADS111X_Addr, &cmd[1], 2U );
mcm 2:aecccd48773a 171
mcm 2:aecccd48773a 172 /* Mask it and update the register */
mcm 2:aecccd48773a 173 myConfig = cmd[1];
mcm 2:aecccd48773a 174 myConfig <<= 8U;
mcm 2:aecccd48773a 175 myConfig |= cmd[2];
mcm 2:aecccd48773a 176
mcm 2:aecccd48773a 177 myConfig &= ~CONFIG_MUX_MASK;
mcm 2:aecccd48773a 178 myConfig |= myADS111X.config.mux;
mcm 2:aecccd48773a 179 cmd[1] = (char)( myConfig >> 8U );
mcm 2:aecccd48773a 180 cmd[2] = (char)( myConfig );
mcm 2:aecccd48773a 181 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 182 }
mcm 2:aecccd48773a 183 else
mcm 2:aecccd48773a 184 {
mcm 2:aecccd48773a 185 return ADS111X_DEVICE_NOT_SUPPORTED;
mcm 2:aecccd48773a 186 }
mcm 2:aecccd48773a 187
mcm 2:aecccd48773a 188
mcm 2:aecccd48773a 189 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 190 {
mcm 2:aecccd48773a 191 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 192 }
mcm 2:aecccd48773a 193 else
mcm 2:aecccd48773a 194 {
mcm 2:aecccd48773a 195 return ADS111X_FAILURE;
mcm 2:aecccd48773a 196 }
mcm 2:aecccd48773a 197 }
mcm 2:aecccd48773a 198
mcm 2:aecccd48773a 199
mcm 2:aecccd48773a 200
mcm 2:aecccd48773a 201 /**
mcm 2:aecccd48773a 202 * @brief ADS111X_GetMux ( ADS111X_data_t* );
mcm 2:aecccd48773a 203 *
mcm 2:aecccd48773a 204 * @details It gets input multiplexer configuration.
mcm 2:aecccd48773a 205 *
mcm 2:aecccd48773a 206 * @param[in] N/A.
mcm 2:aecccd48773a 207 *
mcm 2:aecccd48773a 208 * @param[out] myADS111X: Input multiplexer configuration..
mcm 2:aecccd48773a 209 *
mcm 2:aecccd48773a 210 *
mcm 2:aecccd48773a 211 * @return Status of ADS111X_GetMux.
mcm 2:aecccd48773a 212 *
mcm 2:aecccd48773a 213 *
mcm 2:aecccd48773a 214 * @author Manuel Caballero
mcm 2:aecccd48773a 215 * @date 18/June/2020
mcm 2:aecccd48773a 216 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 217 * @pre N/A
mcm 2:aecccd48773a 218 * @warning ADS1015 only.
mcm 2:aecccd48773a 219 */
mcm 2:aecccd48773a 220 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetMux ( ADS111X_data_t* myADS111X )
mcm 2:aecccd48773a 221 {
mcm 2:aecccd48773a 222 char cmd[2] = { 0U };
mcm 2:aecccd48773a 223 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 224 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 225
mcm 2:aecccd48773a 226 /* Only ADS1015 supports this functionality */
mcm 2:aecccd48773a 227 if ( myADS111X->device == DEVICE_ADS1115 )
mcm 2:aecccd48773a 228 {
mcm 2:aecccd48773a 229 /* Read the register to mask it */
mcm 2:aecccd48773a 230 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 231 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 232 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 233
mcm 2:aecccd48773a 234 /* Parse the data */
mcm 2:aecccd48773a 235 myConfig = cmd[0];
mcm 2:aecccd48773a 236 myConfig <<= 8U;
mcm 2:aecccd48773a 237 myConfig |= cmd[1];
mcm 2:aecccd48773a 238 myADS111X->config.mux = (ADS111X_config_mux_t)( myConfig & CONFIG_MUX_MASK );
mcm 2:aecccd48773a 239 }
mcm 2:aecccd48773a 240 else
mcm 2:aecccd48773a 241 {
mcm 2:aecccd48773a 242 return ADS111X_DEVICE_NOT_SUPPORTED;
mcm 2:aecccd48773a 243 }
mcm 2:aecccd48773a 244
mcm 2:aecccd48773a 245
mcm 2:aecccd48773a 246 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 247 {
mcm 2:aecccd48773a 248 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 249 }
mcm 2:aecccd48773a 250 else
mcm 2:aecccd48773a 251 {
mcm 2:aecccd48773a 252 return ADS111X_FAILURE;
mcm 2:aecccd48773a 253 }
mcm 2:aecccd48773a 254 }
mcm 2:aecccd48773a 255
mcm 2:aecccd48773a 256
mcm 2:aecccd48773a 257
mcm 2:aecccd48773a 258 /**
mcm 2:aecccd48773a 259 * @brief ADS111X_SetGain ( ADS111X_data_t );
mcm 2:aecccd48773a 260 *
mcm 2:aecccd48773a 261 * @details It sets programmable gain amplifier.
mcm 2:aecccd48773a 262 *
mcm 2:aecccd48773a 263 * @param[in] myPGA: Programmable gain.
mcm 2:aecccd48773a 264 *
mcm 2:aecccd48773a 265 * @param[out] N/A.
mcm 2:aecccd48773a 266 *
mcm 2:aecccd48773a 267 *
mcm 2:aecccd48773a 268 * @return Status of ADS111X_SetGain.
mcm 2:aecccd48773a 269 *
mcm 2:aecccd48773a 270 *
mcm 2:aecccd48773a 271 * @author Manuel Caballero
mcm 2:aecccd48773a 272 * @date 18/June/2020
mcm 2:aecccd48773a 273 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 274 * @pre N/A
mcm 2:aecccd48773a 275 * @warning Not ADS1113.
mcm 2:aecccd48773a 276 */
mcm 2:aecccd48773a 277 ADS111X::ADS111X_status_t ADS111X::ADS111X_SetGain ( ADS111X_data_t myPGA )
mcm 2:aecccd48773a 278 {
mcm 2:aecccd48773a 279 char cmd[3] = { 0U };
mcm 2:aecccd48773a 280 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 281 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 282
mcm 2:aecccd48773a 283 /* Only ADS1115/ADS1114 supports this functionality */
mcm 2:aecccd48773a 284 if ( myPGA.device != DEVICE_ADS1113 )
mcm 2:aecccd48773a 285 {
mcm 2:aecccd48773a 286 /* Read the register to mask it */
mcm 2:aecccd48773a 287 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 288 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 289 aux |= _i2c.read ( _ADS111X_Addr, &cmd[1], 2U );
mcm 2:aecccd48773a 290
mcm 2:aecccd48773a 291 /* Mask it and update the register */
mcm 2:aecccd48773a 292 myConfig = cmd[1];
mcm 2:aecccd48773a 293 myConfig <<= 8U;
mcm 2:aecccd48773a 294 myConfig |= cmd[2];
mcm 2:aecccd48773a 295
mcm 2:aecccd48773a 296 myConfig &= ~CONFIG_PGA_MASK;
mcm 2:aecccd48773a 297 myConfig |= myPGA.config.pga;
mcm 2:aecccd48773a 298 cmd[1] = (char)( myConfig >> 8U );
mcm 2:aecccd48773a 299 cmd[2] = (char)( myConfig );
mcm 2:aecccd48773a 300 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 301 }
mcm 2:aecccd48773a 302 else
mcm 2:aecccd48773a 303 {
mcm 2:aecccd48773a 304 return ADS111X_DEVICE_NOT_SUPPORTED;
mcm 2:aecccd48773a 305 }
mcm 2:aecccd48773a 306
mcm 2:aecccd48773a 307
mcm 2:aecccd48773a 308 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 309 {
mcm 2:aecccd48773a 310 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 311 }
mcm 2:aecccd48773a 312 else
mcm 2:aecccd48773a 313 {
mcm 2:aecccd48773a 314 return ADS111X_FAILURE;
mcm 2:aecccd48773a 315 }
mcm 2:aecccd48773a 316 }
mcm 2:aecccd48773a 317
mcm 2:aecccd48773a 318
mcm 2:aecccd48773a 319
mcm 2:aecccd48773a 320 /**
mcm 2:aecccd48773a 321 * @brief ADS111X_GetGain ( ADS111X_data_t* );
mcm 2:aecccd48773a 322 *
mcm 2:aecccd48773a 323 * @details It gets programmable gain amplifier.
mcm 2:aecccd48773a 324 *
mcm 2:aecccd48773a 325 * @param[in] N/A.
mcm 2:aecccd48773a 326 *
mcm 2:aecccd48773a 327 * @param[out] myPGA: Programmable gain.
mcm 2:aecccd48773a 328 *
mcm 2:aecccd48773a 329 *
mcm 2:aecccd48773a 330 * @return Status of ADS111X_GetGain.
mcm 2:aecccd48773a 331 *
mcm 2:aecccd48773a 332 *
mcm 2:aecccd48773a 333 * @author Manuel Caballero
mcm 2:aecccd48773a 334 * @date 18/June/2020
mcm 2:aecccd48773a 335 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 336 * @pre N/A
mcm 2:aecccd48773a 337 * @warning Not ADS1113.
mcm 2:aecccd48773a 338 */
mcm 2:aecccd48773a 339 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetGain ( ADS111X_data_t* myPGA )
mcm 2:aecccd48773a 340 {
mcm 2:aecccd48773a 341 char cmd[2] = { 0U };
mcm 2:aecccd48773a 342 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 343 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 344
mcm 2:aecccd48773a 345 /* Only ADS1115/ADS1114 supports this functionality */
mcm 2:aecccd48773a 346 if ( myPGA->device != DEVICE_ADS1113 )
mcm 2:aecccd48773a 347 {
mcm 2:aecccd48773a 348 /* Read the register to mask it */
mcm 2:aecccd48773a 349 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 350 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 351 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 352
mcm 2:aecccd48773a 353 /* Parse the data */
mcm 2:aecccd48773a 354 myConfig = cmd[0];
mcm 2:aecccd48773a 355 myConfig <<= 8U;
mcm 2:aecccd48773a 356 myConfig |= cmd[1];
mcm 2:aecccd48773a 357 myPGA->config.pga = (ADS111X_config_pga_t)( myConfig & CONFIG_PGA_MASK );
mcm 2:aecccd48773a 358 }
mcm 2:aecccd48773a 359 else
mcm 2:aecccd48773a 360 {
mcm 2:aecccd48773a 361 return ADS111X_DEVICE_NOT_SUPPORTED;
mcm 2:aecccd48773a 362 }
mcm 2:aecccd48773a 363
mcm 2:aecccd48773a 364
mcm 2:aecccd48773a 365 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 366 {
mcm 2:aecccd48773a 367 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 368 }
mcm 2:aecccd48773a 369 else
mcm 2:aecccd48773a 370 {
mcm 2:aecccd48773a 371 return ADS111X_FAILURE;
mcm 2:aecccd48773a 372 }
mcm 2:aecccd48773a 373 }
mcm 2:aecccd48773a 374
mcm 2:aecccd48773a 375
mcm 2:aecccd48773a 376
mcm 2:aecccd48773a 377 /**
mcm 2:aecccd48773a 378 * @brief ADS111X_SetMode ( ADS111X_config_t );
mcm 2:aecccd48773a 379 *
mcm 2:aecccd48773a 380 * @details It sets the device operating mode.
mcm 2:aecccd48773a 381 *
mcm 2:aecccd48773a 382 * @param[in] myMode: Continuous/Single-shot mode conversion.
mcm 2:aecccd48773a 383 *
mcm 2:aecccd48773a 384 * @param[out] N/A.
mcm 2:aecccd48773a 385 *
mcm 2:aecccd48773a 386 *
mcm 2:aecccd48773a 387 * @return Status of ADS111X_SetMode.
mcm 2:aecccd48773a 388 *
mcm 2:aecccd48773a 389 *
mcm 2:aecccd48773a 390 * @author Manuel Caballero
mcm 2:aecccd48773a 391 * @date 18/June/2020
mcm 2:aecccd48773a 392 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 393 * @pre N/A
mcm 2:aecccd48773a 394 * @warning N/A.
mcm 2:aecccd48773a 395 */
mcm 2:aecccd48773a 396 ADS111X::ADS111X_status_t ADS111X::ADS111X_SetMode ( ADS111X_config_t myMode )
mcm 2:aecccd48773a 397 {
mcm 2:aecccd48773a 398 char cmd[3] = { 0U };
mcm 2:aecccd48773a 399 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 400 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 401
mcm 2:aecccd48773a 402 /* Read the register to mask it */
mcm 2:aecccd48773a 403 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 404 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 405 aux |= _i2c.read ( _ADS111X_Addr, &cmd[1], 2U );
mcm 2:aecccd48773a 406
mcm 2:aecccd48773a 407 /* Mask it and update the register */
mcm 2:aecccd48773a 408 myConfig = cmd[1];
mcm 2:aecccd48773a 409 myConfig <<= 8U;
mcm 2:aecccd48773a 410 myConfig |= cmd[2];
mcm 2:aecccd48773a 411
mcm 2:aecccd48773a 412 myConfig &= ~CONFIG_MODE_MASK;
mcm 2:aecccd48773a 413 myConfig |= myMode.mode;
mcm 2:aecccd48773a 414 cmd[1] = (char)( myConfig >> 8U );
mcm 2:aecccd48773a 415 cmd[2] = (char)( myConfig );
mcm 2:aecccd48773a 416 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 417
mcm 2:aecccd48773a 418
mcm 2:aecccd48773a 419
mcm 2:aecccd48773a 420 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 421 {
mcm 2:aecccd48773a 422 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 423 }
mcm 2:aecccd48773a 424 else
mcm 2:aecccd48773a 425 {
mcm 2:aecccd48773a 426 return ADS111X_FAILURE;
mcm 2:aecccd48773a 427 }
mcm 2:aecccd48773a 428 }
mcm 2:aecccd48773a 429
mcm 2:aecccd48773a 430
mcm 2:aecccd48773a 431
mcm 2:aecccd48773a 432 /**
mcm 2:aecccd48773a 433 * @brief ADS111X_GetMode ( ADS111X_config_t* );
mcm 2:aecccd48773a 434 *
mcm 2:aecccd48773a 435 * @details It gets the device operating mode.
mcm 2:aecccd48773a 436 *
mcm 2:aecccd48773a 437 * @param[in] N/A
mcm 2:aecccd48773a 438 *
mcm 2:aecccd48773a 439 * @param[out] myMode: Continuous/Single-shot mode conversion.
mcm 2:aecccd48773a 440 *
mcm 2:aecccd48773a 441 *
mcm 2:aecccd48773a 442 * @return Status of ADS111X_GetMode.
mcm 2:aecccd48773a 443 *
mcm 2:aecccd48773a 444 *
mcm 2:aecccd48773a 445 * @author Manuel Caballero
mcm 2:aecccd48773a 446 * @date 18/June/2020
mcm 2:aecccd48773a 447 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 448 * @pre N/A
mcm 2:aecccd48773a 449 * @warning N/A.
mcm 2:aecccd48773a 450 */
mcm 2:aecccd48773a 451 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetMode ( ADS111X_config_t* myMode )
mcm 2:aecccd48773a 452 {
mcm 2:aecccd48773a 453 char cmd[2] = { 0U };
mcm 2:aecccd48773a 454 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 455 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 456
mcm 2:aecccd48773a 457 /* Read the register to mask it */
mcm 2:aecccd48773a 458 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 459 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 460 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 461
mcm 2:aecccd48773a 462 /* Parse the data */
mcm 2:aecccd48773a 463 myConfig = cmd[0];
mcm 2:aecccd48773a 464 myConfig <<= 8U;
mcm 2:aecccd48773a 465 myConfig |= cmd[1];
mcm 2:aecccd48773a 466 myMode->mode = (ADS111X_config_mode_t)( myConfig & CONFIG_MODE_MASK );
mcm 2:aecccd48773a 467
mcm 2:aecccd48773a 468
mcm 2:aecccd48773a 469
mcm 2:aecccd48773a 470 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 471 {
mcm 2:aecccd48773a 472 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 473 }
mcm 2:aecccd48773a 474 else
mcm 2:aecccd48773a 475 {
mcm 2:aecccd48773a 476 return ADS111X_FAILURE;
mcm 2:aecccd48773a 477 }
mcm 2:aecccd48773a 478 }
mcm 2:aecccd48773a 479
mcm 2:aecccd48773a 480
mcm 2:aecccd48773a 481
mcm 2:aecccd48773a 482 /**
mcm 2:aecccd48773a 483 * @brief ADS111X_SetDataRate ( ADS111X_config_t );
mcm 2:aecccd48773a 484 *
mcm 2:aecccd48773a 485 * @details It sets the data rate.
mcm 2:aecccd48773a 486 *
mcm 2:aecccd48773a 487 * @param[in] myDR: Data rate.
mcm 2:aecccd48773a 488 *
mcm 2:aecccd48773a 489 * @param[out] N/A.
mcm 2:aecccd48773a 490 *
mcm 2:aecccd48773a 491 *
mcm 2:aecccd48773a 492 * @return Status of ADS111X_SetDataRate.
mcm 2:aecccd48773a 493 *
mcm 2:aecccd48773a 494 *
mcm 2:aecccd48773a 495 * @author Manuel Caballero
mcm 2:aecccd48773a 496 * @date 18/June/2020
mcm 2:aecccd48773a 497 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 498 * @pre N/A
mcm 2:aecccd48773a 499 * @warning N/A.
mcm 2:aecccd48773a 500 */
mcm 2:aecccd48773a 501 ADS111X::ADS111X_status_t ADS111X::ADS111X_SetDataRate ( ADS111X_config_t myDR )
mcm 2:aecccd48773a 502 {
mcm 2:aecccd48773a 503 char cmd[3] = { 0U };
mcm 2:aecccd48773a 504 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 505 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 506
mcm 2:aecccd48773a 507 /* Read the register to mask it */
mcm 2:aecccd48773a 508 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 509 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 510 aux |= _i2c.read ( _ADS111X_Addr, &cmd[1], 2U );
mcm 2:aecccd48773a 511
mcm 2:aecccd48773a 512 /* Mask it and update the register */
mcm 2:aecccd48773a 513 myConfig = cmd[1];
mcm 2:aecccd48773a 514 myConfig <<= 8U;
mcm 2:aecccd48773a 515 myConfig |= cmd[2];
mcm 2:aecccd48773a 516
mcm 2:aecccd48773a 517 myConfig &= ~CONFIG_DR_MASK;
mcm 2:aecccd48773a 518 myConfig |= myDR.dr;
mcm 2:aecccd48773a 519 cmd[1] = (char)( myConfig >> 8U );
mcm 2:aecccd48773a 520 cmd[2] = (char)( myConfig );
mcm 2:aecccd48773a 521 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 522
mcm 2:aecccd48773a 523
mcm 2:aecccd48773a 524
mcm 2:aecccd48773a 525 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 526 {
mcm 2:aecccd48773a 527 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 528 }
mcm 2:aecccd48773a 529 else
mcm 2:aecccd48773a 530 {
mcm 2:aecccd48773a 531 return ADS111X_FAILURE;
mcm 2:aecccd48773a 532 }
mcm 2:aecccd48773a 533 }
mcm 2:aecccd48773a 534
mcm 2:aecccd48773a 535
mcm 2:aecccd48773a 536
mcm 2:aecccd48773a 537 /**
mcm 2:aecccd48773a 538 * @brief ADS111X_GetDataRate ( ADS111X_config_t* );
mcm 2:aecccd48773a 539 *
mcm 2:aecccd48773a 540 * @details It gets the data rate.
mcm 2:aecccd48773a 541 *
mcm 2:aecccd48773a 542 * @param[in] N/A.
mcm 2:aecccd48773a 543 *
mcm 2:aecccd48773a 544 * @param[out] myDR: Data rate.
mcm 2:aecccd48773a 545 *
mcm 2:aecccd48773a 546 *
mcm 2:aecccd48773a 547 * @return Status of ADS111X_GetDataRate.
mcm 2:aecccd48773a 548 *
mcm 2:aecccd48773a 549 *
mcm 2:aecccd48773a 550 * @author Manuel Caballero
mcm 2:aecccd48773a 551 * @date 18/June/2020
mcm 2:aecccd48773a 552 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 553 * @pre N/A
mcm 2:aecccd48773a 554 * @warning N/A.
mcm 2:aecccd48773a 555 */
mcm 2:aecccd48773a 556 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetDataRate ( ADS111X_config_t* myDR )
mcm 2:aecccd48773a 557 {
mcm 2:aecccd48773a 558 char cmd[2] = { 0U };
mcm 2:aecccd48773a 559 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 560 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 561
mcm 2:aecccd48773a 562 /* Read the register to mask it */
mcm 2:aecccd48773a 563 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 564 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 565 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 566
mcm 2:aecccd48773a 567 /* Parse the data */
mcm 2:aecccd48773a 568 myConfig = cmd[0];
mcm 2:aecccd48773a 569 myConfig <<= 8U;
mcm 2:aecccd48773a 570 myConfig |= cmd[1];
mcm 2:aecccd48773a 571 myDR->dr = (ADS111X_config_dr_t)( myConfig & CONFIG_DR_MASK );
mcm 2:aecccd48773a 572
mcm 2:aecccd48773a 573
mcm 2:aecccd48773a 574
mcm 2:aecccd48773a 575 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 576 {
mcm 2:aecccd48773a 577 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 578 }
mcm 2:aecccd48773a 579 else
mcm 2:aecccd48773a 580 {
mcm 2:aecccd48773a 581 return ADS111X_FAILURE;
mcm 2:aecccd48773a 582 }
mcm 2:aecccd48773a 583 }
mcm 2:aecccd48773a 584
mcm 2:aecccd48773a 585
mcm 2:aecccd48773a 586
mcm 2:aecccd48773a 587 /**
mcm 2:aecccd48773a 588 * @brief ADS111X_SetComparator ( ADS111X_data_t );
mcm 2:aecccd48773a 589 *
mcm 2:aecccd48773a 590 * @details It sets the comparator configuration.
mcm 2:aecccd48773a 591 *
mcm 2:aecccd48773a 592 * @param[in] myCOMP: Comparator Mode/Polarity/Latching/Queue and disable.
mcm 2:aecccd48773a 593 *
mcm 2:aecccd48773a 594 * @param[out] N/A.
mcm 2:aecccd48773a 595 *
mcm 2:aecccd48773a 596 *
mcm 2:aecccd48773a 597 * @return Status of ADS111X_SetComparator.
mcm 2:aecccd48773a 598 *
mcm 2:aecccd48773a 599 *
mcm 2:aecccd48773a 600 * @author Manuel Caballero
mcm 2:aecccd48773a 601 * @date 18/June/2020
mcm 2:aecccd48773a 602 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 603 * @pre N/A
mcm 2:aecccd48773a 604 * @warning ADS1114 and ADS1115 only.
mcm 2:aecccd48773a 605 */
mcm 2:aecccd48773a 606 ADS111X::ADS111X_status_t ADS111X::ADS111X_SetComparator ( ADS111X_data_t myCOMP )
mcm 2:aecccd48773a 607 {
mcm 2:aecccd48773a 608 char cmd[3] = { 0U };
mcm 2:aecccd48773a 609 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 610 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 611
mcm 2:aecccd48773a 612 /* Only ADS1115/ADS1114 supports this functionality */
mcm 2:aecccd48773a 613 if ( myCOMP.device != DEVICE_ADS1113 )
mcm 2:aecccd48773a 614 {
mcm 2:aecccd48773a 615 /* Read the register to mask it */
mcm 2:aecccd48773a 616 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 617 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 618 aux |= _i2c.read ( _ADS111X_Addr, &cmd[1], 2U );
mcm 2:aecccd48773a 619
mcm 2:aecccd48773a 620 /* Mask it and update the register */
mcm 2:aecccd48773a 621 myConfig = cmd[1];
mcm 2:aecccd48773a 622 myConfig <<= 8U;
mcm 2:aecccd48773a 623 myConfig |= cmd[2];
mcm 2:aecccd48773a 624
mcm 2:aecccd48773a 625 myConfig &= ~( CONFIG_COMP_MODE_MASK | CONFIG_COMP_POL_MASK | CONFIG_COMP_LAT_MASK | CONFIG_COMP_QUE_MASK );
mcm 2:aecccd48773a 626 myConfig |= ( myCOMP.config.comp_mode | myCOMP.config.comp_pol | myCOMP.config.comp_lat | myCOMP.config.comp_que );
mcm 2:aecccd48773a 627 cmd[1] = (char)( myConfig >> 8U );
mcm 2:aecccd48773a 628 cmd[2] = (char)( myConfig );
mcm 2:aecccd48773a 629 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 630 }
mcm 2:aecccd48773a 631 else
mcm 2:aecccd48773a 632 {
mcm 2:aecccd48773a 633 return ADS111X_DEVICE_NOT_SUPPORTED;
mcm 2:aecccd48773a 634 }
mcm 2:aecccd48773a 635
mcm 2:aecccd48773a 636
mcm 2:aecccd48773a 637 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 638 {
mcm 2:aecccd48773a 639 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 640 }
mcm 2:aecccd48773a 641 else
mcm 2:aecccd48773a 642 {
mcm 2:aecccd48773a 643 return ADS111X_FAILURE;
mcm 2:aecccd48773a 644 }
mcm 2:aecccd48773a 645 }
mcm 2:aecccd48773a 646
mcm 2:aecccd48773a 647
mcm 2:aecccd48773a 648
mcm 2:aecccd48773a 649 /**
mcm 2:aecccd48773a 650 * @brief ADS111X_GetComparator ( ADS111X_data_t* );
mcm 2:aecccd48773a 651 *
mcm 2:aecccd48773a 652 * @details It gets the comparator configuration.
mcm 2:aecccd48773a 653 *
mcm 2:aecccd48773a 654 * @param[in] N/A.
mcm 2:aecccd48773a 655 *
mcm 2:aecccd48773a 656 * @param[out] myCOMP: Comparator Mode/Polarity/Latching/Queue and disable.
mcm 2:aecccd48773a 657 *
mcm 2:aecccd48773a 658 *
mcm 2:aecccd48773a 659 * @return Status of ADS111X_GetComparator.
mcm 2:aecccd48773a 660 *
mcm 2:aecccd48773a 661 *
mcm 2:aecccd48773a 662 * @author Manuel Caballero
mcm 2:aecccd48773a 663 * @date 18/June/2020
mcm 2:aecccd48773a 664 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 665 * @pre N/A
mcm 2:aecccd48773a 666 * @warning ADS1114 and ADS1115 only.
mcm 2:aecccd48773a 667 */
mcm 2:aecccd48773a 668 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetComparator ( ADS111X_data_t* myCOMP )
mcm 2:aecccd48773a 669 {
mcm 2:aecccd48773a 670 char cmd[2] = { 0U };
mcm 2:aecccd48773a 671 uint16_t myConfig = 0U;
mcm 2:aecccd48773a 672 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 673
mcm 2:aecccd48773a 674 /* Only ADS1115/ADS1114 supports this functionality */
mcm 2:aecccd48773a 675 if ( myCOMP->device != DEVICE_ADS1113 )
mcm 2:aecccd48773a 676 {
mcm 2:aecccd48773a 677 /* Read the register to mask it */
mcm 2:aecccd48773a 678 cmd[0] = ADS111X_CONFIG;
mcm 2:aecccd48773a 679 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 680 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 681
mcm 2:aecccd48773a 682 /* Parse the data */
mcm 2:aecccd48773a 683 myConfig = cmd[0];
mcm 2:aecccd48773a 684 myConfig <<= 8U;
mcm 2:aecccd48773a 685 myConfig |= cmd[1];
mcm 2:aecccd48773a 686
mcm 2:aecccd48773a 687 myCOMP->config.comp_mode = (ADS111X_config_comp_mode_t)( myConfig & CONFIG_COMP_MODE_MASK );
mcm 2:aecccd48773a 688 myCOMP->config.comp_pol = (ADS111X_config_comp_pol_t)( myConfig & CONFIG_COMP_POL_MASK );
mcm 2:aecccd48773a 689 myCOMP->config.comp_lat = (ADS111X_config_comp_lat_t)( myConfig & CONFIG_COMP_LAT_MASK );
mcm 2:aecccd48773a 690 myCOMP->config.comp_que = (ADS111X_config_comp_que_t)( myConfig & CONFIG_COMP_QUE_MASK );
mcm 2:aecccd48773a 691 }
mcm 2:aecccd48773a 692 else
mcm 2:aecccd48773a 693 {
mcm 2:aecccd48773a 694 return ADS111X_DEVICE_NOT_SUPPORTED;
mcm 2:aecccd48773a 695 }
mcm 2:aecccd48773a 696
mcm 2:aecccd48773a 697
mcm 2:aecccd48773a 698 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 699 {
mcm 2:aecccd48773a 700 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 701 }
mcm 2:aecccd48773a 702 else
mcm 2:aecccd48773a 703 {
mcm 2:aecccd48773a 704 return ADS111X_FAILURE;
mcm 2:aecccd48773a 705 }
mcm 2:aecccd48773a 706 }
mcm 2:aecccd48773a 707
mcm 2:aecccd48773a 708
mcm 2:aecccd48773a 709
mcm 2:aecccd48773a 710 /**
mcm 2:aecccd48773a 711 * @brief ADS111X_SetLowThresholdValue ( ADS111X_thresh_t );
mcm 2:aecccd48773a 712 *
mcm 2:aecccd48773a 713 * @details It sets the low threshold value.
mcm 2:aecccd48773a 714 *
mcm 2:aecccd48773a 715 * @param[in] myLoThres: low threshold value.
mcm 2:aecccd48773a 716 *
mcm 2:aecccd48773a 717 * @param[out] N/A.
mcm 2:aecccd48773a 718 *
mcm 2:aecccd48773a 719 *
mcm 2:aecccd48773a 720 * @return Status of ADS111X_SetLowThresholdValue.
mcm 2:aecccd48773a 721 *
mcm 2:aecccd48773a 722 *
mcm 2:aecccd48773a 723 * @author Manuel Caballero
mcm 2:aecccd48773a 724 * @date 18/June/2020
mcm 2:aecccd48773a 725 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 726 * @pre N/A
mcm 2:aecccd48773a 727 * @warning N/A.
mcm 2:aecccd48773a 728 */
mcm 2:aecccd48773a 729 ADS111X::ADS111X_status_t ADS111X::ADS111X_SetLowThresholdValue ( ADS111X_thresh_t myLoThres )
mcm 2:aecccd48773a 730 {
mcm 2:aecccd48773a 731 char cmd[3] = { 0U };
mcm 2:aecccd48773a 732 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 733
mcm 2:aecccd48773a 734 /* Update the register */
mcm 2:aecccd48773a 735 myLoThres.lo_thresh <<= 4U;
mcm 2:aecccd48773a 736
mcm 2:aecccd48773a 737 cmd[0] = ADS111X_LO_THRESH;
mcm 2:aecccd48773a 738 cmd[1] = (char)( myLoThres.lo_thresh >> 8U );
mcm 2:aecccd48773a 739 cmd[2] = (char)( myLoThres.lo_thresh );
mcm 2:aecccd48773a 740 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 741
mcm 2:aecccd48773a 742
mcm 2:aecccd48773a 743 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 744 {
mcm 2:aecccd48773a 745 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 746 }
mcm 2:aecccd48773a 747 else
mcm 2:aecccd48773a 748 {
mcm 2:aecccd48773a 749 return ADS111X_FAILURE;
mcm 2:aecccd48773a 750 }
mcm 2:aecccd48773a 751 }
mcm 2:aecccd48773a 752
mcm 2:aecccd48773a 753
mcm 2:aecccd48773a 754
mcm 2:aecccd48773a 755 /**
mcm 2:aecccd48773a 756 * @brief ADS111X_GetLowThresholdValue ( ADS111X_thresh_t );
mcm 2:aecccd48773a 757 *
mcm 2:aecccd48773a 758 * @details It gets the low threshold value.
mcm 2:aecccd48773a 759 *
mcm 2:aecccd48773a 760 * @param[in] N/A.
mcm 2:aecccd48773a 761 *
mcm 2:aecccd48773a 762 * @param[out] myLoThres: low threshold value.
mcm 2:aecccd48773a 763 *
mcm 2:aecccd48773a 764 *
mcm 2:aecccd48773a 765 * @return Status of ADS111X_GetLowThresholdValue.
mcm 2:aecccd48773a 766 *
mcm 2:aecccd48773a 767 *
mcm 2:aecccd48773a 768 * @author Manuel Caballero
mcm 2:aecccd48773a 769 * @date 18/June/2020
mcm 2:aecccd48773a 770 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 771 * @pre N/A
mcm 2:aecccd48773a 772 * @warning N/A.
mcm 2:aecccd48773a 773 */
mcm 2:aecccd48773a 774 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetLowThresholdValue ( ADS111X_thresh_t* myLoThres )
mcm 2:aecccd48773a 775 {
mcm 2:aecccd48773a 776 char cmd[2] = { 0U };
mcm 2:aecccd48773a 777 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 778
mcm 2:aecccd48773a 779 /* Read the register to mask it */
mcm 2:aecccd48773a 780 cmd[0] = ADS111X_LO_THRESH;
mcm 2:aecccd48773a 781 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 782 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 783
mcm 2:aecccd48773a 784 /* Parse the data */
mcm 2:aecccd48773a 785 myLoThres->lo_thresh = cmd[0];
mcm 2:aecccd48773a 786 myLoThres->lo_thresh <<= 8U;
mcm 2:aecccd48773a 787 myLoThres->lo_thresh |= cmd[1];
mcm 2:aecccd48773a 788
mcm 2:aecccd48773a 789
mcm 2:aecccd48773a 790
mcm 2:aecccd48773a 791 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 792 {
mcm 2:aecccd48773a 793 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 794 }
mcm 2:aecccd48773a 795 else
mcm 2:aecccd48773a 796 {
mcm 2:aecccd48773a 797 return ADS111X_FAILURE;
mcm 2:aecccd48773a 798 }
mcm 2:aecccd48773a 799 }
mcm 2:aecccd48773a 800
mcm 2:aecccd48773a 801
mcm 2:aecccd48773a 802
mcm 2:aecccd48773a 803 /**
mcm 2:aecccd48773a 804 * @brief ADS111X_SetHighThresholdValue ( ADS111X_thresh_t );
mcm 2:aecccd48773a 805 *
mcm 2:aecccd48773a 806 * @details It sets the high threshold value.
mcm 2:aecccd48773a 807 *
mcm 2:aecccd48773a 808 * @param[in] myHiThres: High threshold value.
mcm 2:aecccd48773a 809 *
mcm 2:aecccd48773a 810 * @param[out] N/A.
mcm 2:aecccd48773a 811 *
mcm 2:aecccd48773a 812 *
mcm 2:aecccd48773a 813 * @return Status of ADS111X_SetHighThresholdValue.
mcm 2:aecccd48773a 814 *
mcm 2:aecccd48773a 815 *
mcm 2:aecccd48773a 816 * @author Manuel Caballero
mcm 2:aecccd48773a 817 * @date 18/June/2020
mcm 2:aecccd48773a 818 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 819 * @pre N/A
mcm 2:aecccd48773a 820 * @warning N/A.
mcm 2:aecccd48773a 821 */
mcm 2:aecccd48773a 822 ADS111X::ADS111X_status_t ADS111X::ADS111X_SetHighThresholdValue ( ADS111X_thresh_t myHiThres )
mcm 2:aecccd48773a 823 {
mcm 2:aecccd48773a 824 char cmd[3] = { 0U };
mcm 2:aecccd48773a 825 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 826
mcm 2:aecccd48773a 827 /* Update the register */
mcm 2:aecccd48773a 828 myHiThres.hi_thresh <<= 4U;
mcm 2:aecccd48773a 829
mcm 2:aecccd48773a 830 cmd[0] = ADS111X_HI_THRESH;
mcm 2:aecccd48773a 831 cmd[1] = (char)( myHiThres.hi_thresh >> 8U );
mcm 2:aecccd48773a 832 cmd[2] = (char)( myHiThres.hi_thresh );
mcm 2:aecccd48773a 833 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:aecccd48773a 834
mcm 2:aecccd48773a 835
mcm 2:aecccd48773a 836
mcm 2:aecccd48773a 837 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 838 {
mcm 2:aecccd48773a 839 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 840 }
mcm 2:aecccd48773a 841 else
mcm 2:aecccd48773a 842 {
mcm 2:aecccd48773a 843 return ADS111X_FAILURE;
mcm 2:aecccd48773a 844 }
mcm 2:aecccd48773a 845 }
mcm 2:aecccd48773a 846
mcm 2:aecccd48773a 847
mcm 2:aecccd48773a 848
mcm 2:aecccd48773a 849 /**
mcm 2:aecccd48773a 850 * @brief ADS111X_GetHighThresholdValue ( ADS111X_thresh_t );
mcm 2:aecccd48773a 851 *
mcm 2:aecccd48773a 852 * @details It gets the high threshold value.
mcm 2:aecccd48773a 853 *
mcm 2:aecccd48773a 854 * @param[in] N/A.
mcm 2:aecccd48773a 855 *
mcm 2:aecccd48773a 856 * @param[out] myHiThres: High threshold value.
mcm 2:aecccd48773a 857 *
mcm 2:aecccd48773a 858 *
mcm 2:aecccd48773a 859 * @return Status of ADS111X_GetHighThresholdValue.
mcm 2:aecccd48773a 860 *
mcm 2:aecccd48773a 861 *
mcm 2:aecccd48773a 862 * @author Manuel Caballero
mcm 2:aecccd48773a 863 * @date 18/June/2020
mcm 2:aecccd48773a 864 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 865 * @pre N/A
mcm 2:aecccd48773a 866 * @warning N/A.
mcm 2:aecccd48773a 867 */
mcm 2:aecccd48773a 868 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetHighThresholdValue ( ADS111X_thresh_t* myHiThres )
mcm 2:aecccd48773a 869 {
mcm 2:aecccd48773a 870 char cmd[2] = { 0U };
mcm 2:aecccd48773a 871 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 872
mcm 2:aecccd48773a 873 /* Read the register to mask it */
mcm 2:aecccd48773a 874 cmd[0] = ADS111X_HI_THRESH;
mcm 2:aecccd48773a 875 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 876 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 877
mcm 2:aecccd48773a 878 /* Parse the data */
mcm 2:aecccd48773a 879 myHiThres->hi_thresh = cmd[0];
mcm 2:aecccd48773a 880 myHiThres->hi_thresh <<= 8U;
mcm 2:aecccd48773a 881 myHiThres->hi_thresh |= cmd[1];
mcm 2:aecccd48773a 882
mcm 2:aecccd48773a 883
mcm 2:aecccd48773a 884
mcm 2:aecccd48773a 885 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 886 {
mcm 2:aecccd48773a 887 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 888 }
mcm 2:aecccd48773a 889 else
mcm 2:aecccd48773a 890 {
mcm 2:aecccd48773a 891 return ADS111X_FAILURE;
mcm 2:aecccd48773a 892 }
mcm 2:aecccd48773a 893 }
mcm 2:aecccd48773a 894
mcm 2:aecccd48773a 895
mcm 2:aecccd48773a 896
mcm 2:aecccd48773a 897 /**
mcm 2:aecccd48773a 898 * @brief ADS111X_GetRawConversion ( ADS111X_conversion_t* );
mcm 2:aecccd48773a 899 *
mcm 2:aecccd48773a 900 * @details It gets the raw conversion value
mcm 2:aecccd48773a 901 *
mcm 2:aecccd48773a 902 * @param[in] N/A.
mcm 2:aecccd48773a 903 *
mcm 2:aecccd48773a 904 * @param[out] myRawD: Raw conversion value.
mcm 2:aecccd48773a 905 *
mcm 2:aecccd48773a 906 *
mcm 2:aecccd48773a 907 * @return Status of ADS111X_GetRawConversion.
mcm 2:aecccd48773a 908 *
mcm 2:aecccd48773a 909 *
mcm 2:aecccd48773a 910 * @author Manuel Caballero
mcm 2:aecccd48773a 911 * @date 18/June/2020
mcm 2:aecccd48773a 912 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 913 * @pre N/A
mcm 2:aecccd48773a 914 * @warning N/A.
mcm 2:aecccd48773a 915 */
mcm 2:aecccd48773a 916 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetRawConversion ( ADS111X_conversion_t* myRawD )
mcm 2:aecccd48773a 917 {
mcm 2:aecccd48773a 918 char cmd[2] = { 0U };
mcm 2:aecccd48773a 919 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 920
mcm 2:aecccd48773a 921 /* Read the register to mask it */
mcm 2:aecccd48773a 922 cmd[0] = ADS111X_CONVERSION;
mcm 2:aecccd48773a 923 aux |= _i2c.write ( _ADS111X_Addr, &cmd[0], 1U, true );
mcm 2:aecccd48773a 924 aux |= _i2c.read ( _ADS111X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:aecccd48773a 925
mcm 2:aecccd48773a 926 /* Parse the data */
mcm 2:aecccd48773a 927 myRawD->raw_conversion = cmd[0];
mcm 2:aecccd48773a 928 myRawD->raw_conversion <<= 8U;
mcm 2:aecccd48773a 929 myRawD->raw_conversion |= cmd[1];
mcm 2:aecccd48773a 930
mcm 2:aecccd48773a 931
mcm 2:aecccd48773a 932
mcm 2:aecccd48773a 933 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 934 {
mcm 2:aecccd48773a 935 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 936 }
mcm 2:aecccd48773a 937 else
mcm 2:aecccd48773a 938 {
mcm 2:aecccd48773a 939 return ADS111X_FAILURE;
mcm 2:aecccd48773a 940 }
mcm 2:aecccd48773a 941 }
mcm 2:aecccd48773a 942
mcm 2:aecccd48773a 943
mcm 2:aecccd48773a 944
mcm 2:aecccd48773a 945 /**
mcm 2:aecccd48773a 946 * @brief ADS111X_GetConversion ( ADS111X_data_t* );
mcm 2:aecccd48773a 947 *
mcm 2:aecccd48773a 948 * @details It gets the conversion value
mcm 2:aecccd48773a 949 *
mcm 2:aecccd48773a 950 * @param[in] N/A.
mcm 2:aecccd48773a 951 *
mcm 2:aecccd48773a 952 * @param[out] myD: Conversion value.
mcm 2:aecccd48773a 953 *
mcm 2:aecccd48773a 954 *
mcm 2:aecccd48773a 955 * @return Status of ADS111X_GetConversion.
mcm 2:aecccd48773a 956 *
mcm 2:aecccd48773a 957 *
mcm 2:aecccd48773a 958 * @author Manuel Caballero
mcm 2:aecccd48773a 959 * @date 18/June/2020
mcm 2:aecccd48773a 960 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 961 * @pre N/A
mcm 2:aecccd48773a 962 * @warning N/A.
mcm 2:aecccd48773a 963 */
mcm 2:aecccd48773a 964 ADS111X::ADS111X_status_t ADS111X::ADS111X_GetConversion ( ADS111X_data_t* myD )
mcm 2:aecccd48773a 965 {
mcm 2:aecccd48773a 966 double myGain = 0.0;
mcm 2:aecccd48773a 967 double myFactor = 0.0;
mcm 2:aecccd48773a 968 ADS111X_status_t aux = ADS111X_SUCCESS;
mcm 2:aecccd48773a 969
mcm 2:aecccd48773a 970 /* Get the raw conversion value */
mcm 2:aecccd48773a 971 aux = ADS111X_GetRawConversion ( &(myD->conversion) );
mcm 2:aecccd48773a 972
mcm 2:aecccd48773a 973 /* Set up the gain accordingly */
mcm 2:aecccd48773a 974 switch ( myD->device )
mcm 2:aecccd48773a 975 {
mcm 2:aecccd48773a 976 case DEVICE_ADS1113:
mcm 2:aecccd48773a 977 myGain = 2.048;
mcm 2:aecccd48773a 978 break;
mcm 2:aecccd48773a 979
mcm 2:aecccd48773a 980 default:
mcm 2:aecccd48773a 981 case DEVICE_ADS1114:
mcm 2:aecccd48773a 982 case DEVICE_ADS1115:
mcm 2:aecccd48773a 983 switch ( myD->config.pga )
mcm 2:aecccd48773a 984 {
mcm 2:aecccd48773a 985 case CONFIG_PGA_FSR_6_144_V:
mcm 2:aecccd48773a 986 myGain = 6.144;
mcm 2:aecccd48773a 987 break;
mcm 2:aecccd48773a 988
mcm 2:aecccd48773a 989 case CONFIG_PGA_FSR_4_096_V:
mcm 2:aecccd48773a 990 myGain = 4.096;
mcm 2:aecccd48773a 991 break;
mcm 2:aecccd48773a 992
mcm 2:aecccd48773a 993 default:
mcm 2:aecccd48773a 994 case CONFIG_PGA_FSR_2_048_V:
mcm 2:aecccd48773a 995 myGain = 2.048;
mcm 2:aecccd48773a 996 break;
mcm 2:aecccd48773a 997
mcm 2:aecccd48773a 998 case CONFIG_PGA_FSR_1_024_V:
mcm 2:aecccd48773a 999 myGain = 1.024;
mcm 2:aecccd48773a 1000 break;
mcm 2:aecccd48773a 1001
mcm 2:aecccd48773a 1002 case CONFIG_PGA_FSR_0_512_V:
mcm 2:aecccd48773a 1003 myGain = 0.512;
mcm 2:aecccd48773a 1004 break;
mcm 2:aecccd48773a 1005
mcm 2:aecccd48773a 1006 case CONFIG_PGA_FSR_0_256_V:
mcm 2:aecccd48773a 1007 myGain = 0.256;
mcm 2:aecccd48773a 1008 break;
mcm 2:aecccd48773a 1009 }
mcm 2:aecccd48773a 1010 break;
mcm 2:aecccd48773a 1011 }
mcm 2:aecccd48773a 1012
mcm 2:aecccd48773a 1013
mcm 2:aecccd48773a 1014 /* Check the scale */
mcm 2:aecccd48773a 1015 if ( myD->conversion.raw_conversion == 0x8000 )
mcm 2:aecccd48773a 1016 {
mcm 2:aecccd48773a 1017 myFactor = myGain;
mcm 2:aecccd48773a 1018 }
mcm 2:aecccd48773a 1019 else if ( myD->conversion.raw_conversion == 0x7FFF )
mcm 2:aecccd48773a 1020 {
mcm 2:aecccd48773a 1021 myFactor = ( myGain * ( 32768.0 - 1.0 ) ) / 32768.0;
mcm 2:aecccd48773a 1022 }
mcm 2:aecccd48773a 1023 else
mcm 2:aecccd48773a 1024 {
mcm 2:aecccd48773a 1025 myFactor = myGain / 32768.0;
mcm 2:aecccd48773a 1026 }
mcm 2:aecccd48773a 1027
mcm 2:aecccd48773a 1028
mcm 2:aecccd48773a 1029 /* Result */
mcm 2:aecccd48773a 1030 myD->conversion.conversion = (float)( myFactor * myD->conversion.raw_conversion );
mcm 2:aecccd48773a 1031
mcm 2:aecccd48773a 1032
mcm 2:aecccd48773a 1033 return aux;
mcm 2:aecccd48773a 1034 }
mcm 2:aecccd48773a 1035
mcm 2:aecccd48773a 1036
mcm 2:aecccd48773a 1037
mcm 2:aecccd48773a 1038 /**
mcm 2:aecccd48773a 1039 * @brief ADS111X_SoftReset ( void );
mcm 2:aecccd48773a 1040 *
mcm 2:aecccd48773a 1041 * @details It triggers a softreset.
mcm 2:aecccd48773a 1042 *
mcm 2:aecccd48773a 1043 * @param[in] N/A.
mcm 2:aecccd48773a 1044 *
mcm 2:aecccd48773a 1045 * @param[out] N/A.
mcm 2:aecccd48773a 1046 *
mcm 2:aecccd48773a 1047 *
mcm 2:aecccd48773a 1048 * @return Status of ADS111X_SoftReset.
mcm 2:aecccd48773a 1049 *
mcm 2:aecccd48773a 1050 *
mcm 2:aecccd48773a 1051 * @author Manuel Caballero
mcm 2:aecccd48773a 1052 * @date 18/June/2020
mcm 2:aecccd48773a 1053 * @version 18/June/2020 The ORIGIN
mcm 2:aecccd48773a 1054 * @pre N/A
mcm 2:aecccd48773a 1055 * @warning N/A.
mcm 2:aecccd48773a 1056 */
mcm 2:aecccd48773a 1057 ADS111X::ADS111X_status_t ADS111X::ADS111X_SoftReset ( void )
mcm 2:aecccd48773a 1058 {
mcm 2:aecccd48773a 1059 char cmd = 0U;
mcm 2:aecccd48773a 1060 uint32_t aux = I2C_SUCCESS;
mcm 2:aecccd48773a 1061
mcm 2:aecccd48773a 1062
mcm 2:aecccd48773a 1063 /* Update the register */
mcm 2:aecccd48773a 1064 cmd = ADS111X_RESET_COMMAND;
mcm 2:aecccd48773a 1065 aux |= _i2c.write ( 0x00, &cmd, 1U, false );
mcm 2:aecccd48773a 1066
mcm 2:aecccd48773a 1067
mcm 2:aecccd48773a 1068
mcm 2:aecccd48773a 1069 if ( aux == I2C_SUCCESS )
mcm 2:aecccd48773a 1070 {
mcm 2:aecccd48773a 1071 return ADS111X_SUCCESS;
mcm 2:aecccd48773a 1072 }
mcm 2:aecccd48773a 1073 else
mcm 2:aecccd48773a 1074 {
mcm 2:aecccd48773a 1075 return ADS111X_FAILURE;
mcm 2:aecccd48773a 1076 }
mcm 2:aecccd48773a 1077 }