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

Committer:
mcm
Date:
Fri Jun 19 10:23:27 2020 +0000
Revision:
4:7853bced749c
Parent:
3:4a9619b441f0
A bug was fixed, the device is chosen once it is declared the class on mBed. The driver was tested and it works as expected.

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 4:7853bced749c 165 if ( _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 4:7853bced749c 226 /* Only ADS1115 supports this functionality */
mcm 4:7853bced749c 227 if ( _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 4:7853bced749c 284 if ( _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 4:7853bced749c 346 if ( _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 4:7853bced749c 613 if ( _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 4:7853bced749c 675 if ( _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 3:4a9619b441f0 966 float myGain = 0.0;
mcm 3:4a9619b441f0 967 float 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 3:4a9619b441f0 971 aux = ADS111X::ADS111X_GetRawConversion ( &myD->conversion );
mcm 2:aecccd48773a 972
mcm 2:aecccd48773a 973 /* Set up the gain accordingly */
mcm 3:4a9619b441f0 974 switch ( _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 3:4a9619b441f0 1018 myD->conversion.conversion = (float)( -myFactor );
mcm 2:aecccd48773a 1019 }
mcm 2:aecccd48773a 1020 else if ( myD->conversion.raw_conversion == 0x7FFF )
mcm 2:aecccd48773a 1021 {
mcm 2:aecccd48773a 1022 myFactor = ( myGain * ( 32768.0 - 1.0 ) ) / 32768.0;
mcm 3:4a9619b441f0 1023 myD->conversion.conversion = (float)( myFactor );
mcm 2:aecccd48773a 1024 }
mcm 2:aecccd48773a 1025 else
mcm 2:aecccd48773a 1026 {
mcm 3:4a9619b441f0 1027 myFactor = (float)( myGain / 32768.0 );
mcm 3:4a9619b441f0 1028 myD->conversion.conversion = (float)( myFactor * myD->conversion.raw_conversion );
mcm 2:aecccd48773a 1029 }
mcm 2:aecccd48773a 1030
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 }