Digital Thermometer and Memory
DS1624.cpp@4:61eb7429c086, 2018-02-06 (annotated)
- Committer:
- mcm
- Date:
- Tue Feb 06 11:12:40 2018 +0000
- Revision:
- 4:61eb7429c086
- Parent:
- 3:3a26cd3cd594
The driver was completed and tested, it works as expected ( NUCLEO-L152RE platform was used for test )
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 1:fc952e73a23e | 1 | /** |
mcm | 1:fc952e73a23e | 2 | * @brief DS1624.h |
mcm | 1:fc952e73a23e | 3 | * @details Digital Thermometer and Memory. |
mcm | 1:fc952e73a23e | 4 | * Function file. |
mcm | 1:fc952e73a23e | 5 | * |
mcm | 1:fc952e73a23e | 6 | * |
mcm | 1:fc952e73a23e | 7 | * @return NA |
mcm | 1:fc952e73a23e | 8 | * |
mcm | 1:fc952e73a23e | 9 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 10 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 11 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 12 | * @pre NaN. |
mcm | 1:fc952e73a23e | 13 | * @warning NaN |
mcm | 1:fc952e73a23e | 14 | * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). |
mcm | 1:fc952e73a23e | 15 | */ |
mcm | 1:fc952e73a23e | 16 | |
mcm | 1:fc952e73a23e | 17 | #include "DS1624.h" |
mcm | 1:fc952e73a23e | 18 | |
mcm | 1:fc952e73a23e | 19 | |
mcm | 1:fc952e73a23e | 20 | DS1624::DS1624 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ) |
mcm | 1:fc952e73a23e | 21 | : _i2c ( sda, scl ) |
mcm | 1:fc952e73a23e | 22 | , _DS1624_Addr ( addr ) |
mcm | 1:fc952e73a23e | 23 | { |
mcm | 1:fc952e73a23e | 24 | _i2c.frequency( freq ); |
mcm | 1:fc952e73a23e | 25 | } |
mcm | 1:fc952e73a23e | 26 | |
mcm | 1:fc952e73a23e | 27 | |
mcm | 1:fc952e73a23e | 28 | DS1624::~DS1624() |
mcm | 1:fc952e73a23e | 29 | { |
mcm | 1:fc952e73a23e | 30 | } |
mcm | 1:fc952e73a23e | 31 | |
mcm | 1:fc952e73a23e | 32 | |
mcm | 1:fc952e73a23e | 33 | |
mcm | 1:fc952e73a23e | 34 | /** |
mcm | 1:fc952e73a23e | 35 | * @brief DS1624_StartConvertTemperature ( void ) |
mcm | 1:fc952e73a23e | 36 | * |
mcm | 1:fc952e73a23e | 37 | * @details It triggers a new temperature conversion. |
mcm | 1:fc952e73a23e | 38 | * |
mcm | 1:fc952e73a23e | 39 | * @param[in] N/A. |
mcm | 1:fc952e73a23e | 40 | * |
mcm | 1:fc952e73a23e | 41 | * @param[out] N/A. |
mcm | 1:fc952e73a23e | 42 | * |
mcm | 1:fc952e73a23e | 43 | * |
mcm | 1:fc952e73a23e | 44 | * @return Status of DS1624_StartConvertTemperature. |
mcm | 1:fc952e73a23e | 45 | * |
mcm | 1:fc952e73a23e | 46 | * |
mcm | 1:fc952e73a23e | 47 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 48 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 49 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 50 | * @pre Temperature Conversion Time ( t_TC ) 200ms maximum. |
mcm | 1:fc952e73a23e | 51 | * @warning N/A. |
mcm | 1:fc952e73a23e | 52 | */ |
mcm | 1:fc952e73a23e | 53 | DS1624::DS1624_status_t DS1624::DS1624_StartConvertTemperature ( void ) |
mcm | 1:fc952e73a23e | 54 | { |
mcm | 1:fc952e73a23e | 55 | char cmd = DS1624_START_CONVERT_T; |
mcm | 1:fc952e73a23e | 56 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 57 | |
mcm | 1:fc952e73a23e | 58 | |
mcm | 1:fc952e73a23e | 59 | // It triggers a new temperature conversion |
mcm | 1:fc952e73a23e | 60 | aux = _i2c.write ( _DS1624_Addr, &cmd, 1, false ); |
mcm | 1:fc952e73a23e | 61 | |
mcm | 1:fc952e73a23e | 62 | |
mcm | 1:fc952e73a23e | 63 | |
mcm | 1:fc952e73a23e | 64 | |
mcm | 1:fc952e73a23e | 65 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 66 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 67 | else |
mcm | 1:fc952e73a23e | 68 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 69 | } |
mcm | 1:fc952e73a23e | 70 | |
mcm | 1:fc952e73a23e | 71 | |
mcm | 1:fc952e73a23e | 72 | /** |
mcm | 1:fc952e73a23e | 73 | * @brief DS1624_StopConvertTemperature ( void ) |
mcm | 1:fc952e73a23e | 74 | * |
mcm | 1:fc952e73a23e | 75 | * @details It halts the temperature conversion. |
mcm | 1:fc952e73a23e | 76 | * |
mcm | 1:fc952e73a23e | 77 | * @param[in] N/A. |
mcm | 1:fc952e73a23e | 78 | * |
mcm | 1:fc952e73a23e | 79 | * @param[out] N/A. |
mcm | 1:fc952e73a23e | 80 | * |
mcm | 1:fc952e73a23e | 81 | * |
mcm | 1:fc952e73a23e | 82 | * @return Status of DS1624_StopConvertTemperature. |
mcm | 1:fc952e73a23e | 83 | * |
mcm | 1:fc952e73a23e | 84 | * |
mcm | 1:fc952e73a23e | 85 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 86 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 87 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 88 | * @pre In continuous conversion mode, a StopConvertT command halt |
mcm | 1:fc952e73a23e | 89 | * a continuous conversion. To restart, the StartConvertT |
mcm | 1:fc952e73a23e | 90 | * command must be issued. In one-shot mode, a StartConvertT command |
mcm | 1:fc952e73a23e | 91 | * must be issued for every temperature reading desired. |
mcm | 1:fc952e73a23e | 92 | * @warning N/A. |
mcm | 1:fc952e73a23e | 93 | */ |
mcm | 1:fc952e73a23e | 94 | DS1624::DS1624_status_t DS1624::DS1624_StopConvertTemperature ( void ) |
mcm | 1:fc952e73a23e | 95 | { |
mcm | 1:fc952e73a23e | 96 | char cmd = DS1624_STOP_CONVERT_T; |
mcm | 1:fc952e73a23e | 97 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 98 | |
mcm | 1:fc952e73a23e | 99 | |
mcm | 1:fc952e73a23e | 100 | // It sends the command |
mcm | 1:fc952e73a23e | 101 | aux = _i2c.write ( _DS1624_Addr, &cmd, 1, false ); |
mcm | 1:fc952e73a23e | 102 | |
mcm | 1:fc952e73a23e | 103 | |
mcm | 1:fc952e73a23e | 104 | |
mcm | 1:fc952e73a23e | 105 | |
mcm | 1:fc952e73a23e | 106 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 107 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 108 | else |
mcm | 1:fc952e73a23e | 109 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 110 | } |
mcm | 1:fc952e73a23e | 111 | |
mcm | 1:fc952e73a23e | 112 | |
mcm | 1:fc952e73a23e | 113 | |
mcm | 1:fc952e73a23e | 114 | /** |
mcm | 1:fc952e73a23e | 115 | * @brief DS1624_ReadRawTemperature ( DS1624_vector_data_t* ) |
mcm | 1:fc952e73a23e | 116 | * |
mcm | 1:fc952e73a23e | 117 | * @details It reads the last raw temperature conversion result. |
mcm | 1:fc952e73a23e | 118 | * |
mcm | 1:fc952e73a23e | 119 | * @param[in] N/A. |
mcm | 1:fc952e73a23e | 120 | * |
mcm | 1:fc952e73a23e | 121 | * @param[out] myRawTemperature: Raw temperature ( two bytes ). |
mcm | 1:fc952e73a23e | 122 | * |
mcm | 1:fc952e73a23e | 123 | * |
mcm | 1:fc952e73a23e | 124 | * @return Status of DS1624_ReadRawTemperature. |
mcm | 1:fc952e73a23e | 125 | * |
mcm | 1:fc952e73a23e | 126 | * |
mcm | 1:fc952e73a23e | 127 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 128 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 129 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 130 | * @pre DONE bit needs to be checked before calling this function. |
mcm | 1:fc952e73a23e | 131 | * @warning N/A. |
mcm | 1:fc952e73a23e | 132 | */ |
mcm | 1:fc952e73a23e | 133 | DS1624::DS1624_status_t DS1624::DS1624_ReadRawTemperature ( DS1624_vector_data_t* myRawTemperature ) |
mcm | 1:fc952e73a23e | 134 | { |
mcm | 1:fc952e73a23e | 135 | char cmd[] = { DS1624_READ_TEMPERATURE, 0 }; |
mcm | 1:fc952e73a23e | 136 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 137 | |
mcm | 1:fc952e73a23e | 138 | |
mcm | 1:fc952e73a23e | 139 | |
mcm | 1:fc952e73a23e | 140 | // It sends the command and gets the result otherwise |
mcm | 1:fc952e73a23e | 141 | aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true ); |
mcm | 1:fc952e73a23e | 142 | aux = _i2c.read ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) ); |
mcm | 1:fc952e73a23e | 143 | |
mcm | 1:fc952e73a23e | 144 | |
mcm | 1:fc952e73a23e | 145 | // Parse the data |
mcm | 1:fc952e73a23e | 146 | myRawTemperature->MSBTemperature = cmd[0]; |
mcm | 1:fc952e73a23e | 147 | myRawTemperature->LSBTemperature = cmd[1]; |
mcm | 1:fc952e73a23e | 148 | |
mcm | 1:fc952e73a23e | 149 | |
mcm | 1:fc952e73a23e | 150 | |
mcm | 1:fc952e73a23e | 151 | |
mcm | 1:fc952e73a23e | 152 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 153 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 154 | else |
mcm | 1:fc952e73a23e | 155 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 156 | } |
mcm | 1:fc952e73a23e | 157 | |
mcm | 1:fc952e73a23e | 158 | |
mcm | 1:fc952e73a23e | 159 | |
mcm | 1:fc952e73a23e | 160 | /** |
mcm | 1:fc952e73a23e | 161 | * @brief DS1624_ReadTemperature ( DS1624_vector_data_t* ) |
mcm | 1:fc952e73a23e | 162 | * |
mcm | 1:fc952e73a23e | 163 | * @details It reads the last current temperature conversion result. |
mcm | 1:fc952e73a23e | 164 | * |
mcm | 1:fc952e73a23e | 165 | * @param[in] N/A. |
mcm | 1:fc952e73a23e | 166 | * |
mcm | 1:fc952e73a23e | 167 | * @param[out] myTemperature: Current temperature. |
mcm | 1:fc952e73a23e | 168 | * |
mcm | 1:fc952e73a23e | 169 | * |
mcm | 1:fc952e73a23e | 170 | * @return Status of DS1624_ReadTemperature. |
mcm | 1:fc952e73a23e | 171 | * |
mcm | 1:fc952e73a23e | 172 | * |
mcm | 1:fc952e73a23e | 173 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 174 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 175 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 176 | * @pre This function updates the raw temperature variables. |
mcm | 1:fc952e73a23e | 177 | * @pre DONE bit needs to be checked before calling this function. |
mcm | 1:fc952e73a23e | 178 | * @warning N/A. |
mcm | 1:fc952e73a23e | 179 | */ |
mcm | 1:fc952e73a23e | 180 | DS1624::DS1624_status_t DS1624::DS1624_ReadTemperature ( DS1624_vector_data_t* myTemperature ) |
mcm | 1:fc952e73a23e | 181 | { |
mcm | 1:fc952e73a23e | 182 | char cmd[] = { DS1624_READ_TEMPERATURE, 0 }; |
mcm | 1:fc952e73a23e | 183 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 184 | uint32_t i = 0; |
mcm | 1:fc952e73a23e | 185 | |
mcm | 1:fc952e73a23e | 186 | |
mcm | 1:fc952e73a23e | 187 | |
mcm | 1:fc952e73a23e | 188 | // It sends the command and gets the result otherwise |
mcm | 1:fc952e73a23e | 189 | aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true ); |
mcm | 1:fc952e73a23e | 190 | aux = _i2c.read ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) ); |
mcm | 1:fc952e73a23e | 191 | |
mcm | 1:fc952e73a23e | 192 | |
mcm | 1:fc952e73a23e | 193 | // Update the raw temperature value |
mcm | 1:fc952e73a23e | 194 | myTemperature->MSBTemperature = cmd[0]; |
mcm | 1:fc952e73a23e | 195 | myTemperature->LSBTemperature = cmd[1]; |
mcm | 1:fc952e73a23e | 196 | |
mcm | 1:fc952e73a23e | 197 | |
mcm | 1:fc952e73a23e | 198 | // Calculate the current temperature |
mcm | 1:fc952e73a23e | 199 | // Check if the temperature is positive or negative |
mcm | 1:fc952e73a23e | 200 | if ( ( myTemperature->MSBTemperature & MSB_TEMPERATURE_SIGN_BIT_MASK ) == MSB_TEMPERATURE_SIGN_BIT_NEGATIVE ) |
mcm | 1:fc952e73a23e | 201 | { |
mcm | 1:fc952e73a23e | 202 | // The temperature is NEGATIVE |
mcm | 1:fc952e73a23e | 203 | myTemperature->MSBTemperature -= 1; |
mcm | 1:fc952e73a23e | 204 | myTemperature->MSBTemperature = ~myTemperature->MSBTemperature; |
mcm | 1:fc952e73a23e | 205 | |
mcm | 1:fc952e73a23e | 206 | myTemperature->LSBTemperature -= 1; |
mcm | 1:fc952e73a23e | 207 | myTemperature->LSBTemperature = ( ~myTemperature->LSBTemperature & 0xF0 ); |
mcm | 1:fc952e73a23e | 208 | |
mcm | 1:fc952e73a23e | 209 | myTemperature->Temperature = ( -1.0 * myTemperature->MSBTemperature ); |
mcm | 1:fc952e73a23e | 210 | } |
mcm | 1:fc952e73a23e | 211 | else |
mcm | 1:fc952e73a23e | 212 | { |
mcm | 1:fc952e73a23e | 213 | // The temperature is POSITIVE |
mcm | 1:fc952e73a23e | 214 | myTemperature->Temperature = myTemperature->MSBTemperature; |
mcm | 1:fc952e73a23e | 215 | } |
mcm | 1:fc952e73a23e | 216 | |
mcm | 1:fc952e73a23e | 217 | |
mcm | 1:fc952e73a23e | 218 | // Update the decimal value |
mcm | 1:fc952e73a23e | 219 | for ( i = 0; i < ( myTemperature->LSBTemperature >> 4 ); i++ ) |
mcm | 1:fc952e73a23e | 220 | myTemperature->Temperature += DS1624_TEMPERATURE_RESOLUTION; |
mcm | 1:fc952e73a23e | 221 | |
mcm | 1:fc952e73a23e | 222 | |
mcm | 1:fc952e73a23e | 223 | |
mcm | 1:fc952e73a23e | 224 | |
mcm | 1:fc952e73a23e | 225 | |
mcm | 1:fc952e73a23e | 226 | |
mcm | 1:fc952e73a23e | 227 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 228 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 229 | else |
mcm | 1:fc952e73a23e | 230 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 231 | } |
mcm | 1:fc952e73a23e | 232 | |
mcm | 1:fc952e73a23e | 233 | |
mcm | 1:fc952e73a23e | 234 | |
mcm | 1:fc952e73a23e | 235 | /** |
mcm | 1:fc952e73a23e | 236 | * @brief DS1624_GetStatusRegister ( DS1624_vector_data_t* ) |
mcm | 1:fc952e73a23e | 237 | * |
mcm | 1:fc952e73a23e | 238 | * @details It reads the CONFIGURATION/STATUS register. |
mcm | 1:fc952e73a23e | 239 | * |
mcm | 1:fc952e73a23e | 240 | * @param[in] N/A. |
mcm | 1:fc952e73a23e | 241 | * |
mcm | 1:fc952e73a23e | 242 | * @param[out] myStatusRegister: Current Status register value. |
mcm | 1:fc952e73a23e | 243 | * |
mcm | 1:fc952e73a23e | 244 | * |
mcm | 1:fc952e73a23e | 245 | * @return Status of DS1624_GetStatusRegister. |
mcm | 1:fc952e73a23e | 246 | * |
mcm | 1:fc952e73a23e | 247 | * |
mcm | 1:fc952e73a23e | 248 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 249 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 250 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 251 | * @pre N/A. |
mcm | 1:fc952e73a23e | 252 | * @warning N/A. |
mcm | 1:fc952e73a23e | 253 | */ |
mcm | 1:fc952e73a23e | 254 | DS1624::DS1624_status_t DS1624::DS1624_GetStatusRegister ( DS1624_vector_data_t* myStatusRegister ) |
mcm | 1:fc952e73a23e | 255 | { |
mcm | 1:fc952e73a23e | 256 | char cmd = DS1624_ACCESS_CONFIG; |
mcm | 1:fc952e73a23e | 257 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 258 | |
mcm | 1:fc952e73a23e | 259 | |
mcm | 1:fc952e73a23e | 260 | // It sends the command and gets the result |
mcm | 1:fc952e73a23e | 261 | aux = _i2c.write ( _DS1624_Addr, &cmd, 1, true ); |
mcm | 1:fc952e73a23e | 262 | aux = _i2c.read ( _DS1624_Addr, &myStatusRegister->Control_Status_Register, 1 ); |
mcm | 1:fc952e73a23e | 263 | |
mcm | 1:fc952e73a23e | 264 | |
mcm | 1:fc952e73a23e | 265 | |
mcm | 1:fc952e73a23e | 266 | |
mcm | 1:fc952e73a23e | 267 | |
mcm | 1:fc952e73a23e | 268 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 269 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 270 | else |
mcm | 1:fc952e73a23e | 271 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 272 | } |
mcm | 1:fc952e73a23e | 273 | |
mcm | 1:fc952e73a23e | 274 | |
mcm | 1:fc952e73a23e | 275 | |
mcm | 1:fc952e73a23e | 276 | /** |
mcm | 1:fc952e73a23e | 277 | * @brief DS1624_SetConversionMode ( DS1624_access_config_1shot_t ) |
mcm | 1:fc952e73a23e | 278 | * |
mcm | 1:fc952e73a23e | 279 | * @details It sets 1SHOT/Continuous temperature conversion mode. |
mcm | 1:fc952e73a23e | 280 | * |
mcm | 1:fc952e73a23e | 281 | * @param[in] myConversionMode: ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION: 1SHOT temperature conversion mode |
mcm | 1:fc952e73a23e | 282 | * ACCESS_CONFIG_1SHOT_CONTINUOUSLY_TEMPERATURE_CONVERSION: Continuous temperature conversion mode. |
mcm | 1:fc952e73a23e | 283 | * |
mcm | 1:fc952e73a23e | 284 | * @param[out] N/A. |
mcm | 1:fc952e73a23e | 285 | * |
mcm | 1:fc952e73a23e | 286 | * |
mcm | 1:fc952e73a23e | 287 | * @return Status of DS1624_SetConversionMode. |
mcm | 1:fc952e73a23e | 288 | * |
mcm | 1:fc952e73a23e | 289 | * |
mcm | 1:fc952e73a23e | 290 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 291 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 292 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 293 | * @pre N/A |
mcm | 1:fc952e73a23e | 294 | * @warning Since the configuration register is implemented in |
mcm | 1:fc952e73a23e | 295 | * EEPROM, writes to the register require 10ms to complete. |
mcm | 1:fc952e73a23e | 296 | * After issuing a command to write to the configuration register, |
mcm | 1:fc952e73a23e | 297 | * no further accesses to the DS1624 should be made for at least 10ms. |
mcm | 1:fc952e73a23e | 298 | */ |
mcm | 1:fc952e73a23e | 299 | DS1624::DS1624_status_t DS1624::DS1624_SetConversionMode ( DS1624_access_config_1shot_t myConversionMode ) |
mcm | 1:fc952e73a23e | 300 | { |
mcm | 1:fc952e73a23e | 301 | char cmd[] = { DS1624_ACCESS_CONFIG, 0 }; |
mcm | 1:fc952e73a23e | 302 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 303 | |
mcm | 1:fc952e73a23e | 304 | |
mcm | 1:fc952e73a23e | 305 | // It sends the command and gets the result |
mcm | 1:fc952e73a23e | 306 | aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true ); |
mcm | 1:fc952e73a23e | 307 | aux = _i2c.read ( _DS1624_Addr, &cmd[1], 1 ); |
mcm | 1:fc952e73a23e | 308 | |
mcm | 1:fc952e73a23e | 309 | |
mcm | 1:fc952e73a23e | 310 | // Mask the bit and check which mode to use |
mcm | 1:fc952e73a23e | 311 | cmd[1] &= ~ACCESS_CONFIG_1SHOT_MASK; |
mcm | 1:fc952e73a23e | 312 | |
mcm | 1:fc952e73a23e | 313 | if ( myConversionMode == ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION ) |
mcm | 1:fc952e73a23e | 314 | { |
mcm | 1:fc952e73a23e | 315 | // 1SHOT Mode |
mcm | 1:fc952e73a23e | 316 | cmd[1] |= ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION; |
mcm | 1:fc952e73a23e | 317 | } |
mcm | 1:fc952e73a23e | 318 | else |
mcm | 1:fc952e73a23e | 319 | { |
mcm | 1:fc952e73a23e | 320 | // Continuously Mode |
mcm | 1:fc952e73a23e | 321 | cmd[1] &= ~ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION; |
mcm | 1:fc952e73a23e | 322 | } |
mcm | 1:fc952e73a23e | 323 | |
mcm | 1:fc952e73a23e | 324 | |
mcm | 1:fc952e73a23e | 325 | // Update the CONFIGURATION/STATUS register |
mcm | 1:fc952e73a23e | 326 | aux = _i2c.write ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 1:fc952e73a23e | 327 | |
mcm | 1:fc952e73a23e | 328 | |
mcm | 1:fc952e73a23e | 329 | |
mcm | 1:fc952e73a23e | 330 | |
mcm | 1:fc952e73a23e | 331 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 332 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 333 | else |
mcm | 1:fc952e73a23e | 334 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 335 | } |
mcm | 1:fc952e73a23e | 336 | |
mcm | 1:fc952e73a23e | 337 | |
mcm | 1:fc952e73a23e | 338 | |
mcm | 1:fc952e73a23e | 339 | /** |
mcm | 1:fc952e73a23e | 340 | * @brief DS1624_IsTemperatureConversionDone ( DS1624_vector_data_t* ) |
mcm | 1:fc952e73a23e | 341 | * |
mcm | 1:fc952e73a23e | 342 | * @details It checks if a temperature conversion is done. |
mcm | 1:fc952e73a23e | 343 | * |
mcm | 1:fc952e73a23e | 344 | * @param[in] N/A. |
mcm | 1:fc952e73a23e | 345 | * |
mcm | 1:fc952e73a23e | 346 | * @param[out] myTemperatureConversionStatus: Temperature conversion bit: |
mcm | 1:fc952e73a23e | 347 | * ACCESS_CONFIG_DONE_CONVERSION_COMPLETE |
mcm | 1:fc952e73a23e | 348 | * ACCESS_CONFIG_DONE_CONVERSION_IN_PROGRESS. |
mcm | 1:fc952e73a23e | 349 | * |
mcm | 1:fc952e73a23e | 350 | * |
mcm | 1:fc952e73a23e | 351 | * @return Status of DS1624_IsTemperatureConversionDone. |
mcm | 1:fc952e73a23e | 352 | * |
mcm | 1:fc952e73a23e | 353 | * |
mcm | 1:fc952e73a23e | 354 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 355 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 356 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 357 | * @pre N/A. |
mcm | 1:fc952e73a23e | 358 | * @warning N/A. |
mcm | 1:fc952e73a23e | 359 | */ |
mcm | 1:fc952e73a23e | 360 | DS1624::DS1624_status_t DS1624::DS1624_IsTemperatureConversionDone ( DS1624_access_config_done_t* myTemperatureConversionStatus ) |
mcm | 1:fc952e73a23e | 361 | { |
mcm | 1:fc952e73a23e | 362 | char cmd[] = { DS1624_ACCESS_CONFIG, 0 }; |
mcm | 1:fc952e73a23e | 363 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 364 | |
mcm | 1:fc952e73a23e | 365 | |
mcm | 1:fc952e73a23e | 366 | // It sends the command and gets the result |
mcm | 1:fc952e73a23e | 367 | aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true ); |
mcm | 1:fc952e73a23e | 368 | aux = _i2c.read ( _DS1624_Addr, &cmd[1], 1 ); |
mcm | 1:fc952e73a23e | 369 | |
mcm | 1:fc952e73a23e | 370 | |
mcm | 1:fc952e73a23e | 371 | // Update the value |
mcm | 1:fc952e73a23e | 372 | *myTemperatureConversionStatus = ( DS1624_access_config_done_t )( cmd[1] & ACCESS_CONFIG_DONE_MASK ); |
mcm | 1:fc952e73a23e | 373 | |
mcm | 1:fc952e73a23e | 374 | |
mcm | 1:fc952e73a23e | 375 | |
mcm | 1:fc952e73a23e | 376 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 377 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 378 | else |
mcm | 1:fc952e73a23e | 379 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 380 | } |
mcm | 1:fc952e73a23e | 381 | |
mcm | 1:fc952e73a23e | 382 | |
mcm | 1:fc952e73a23e | 383 | |
mcm | 1:fc952e73a23e | 384 | /** |
mcm | 3:3a26cd3cd594 | 385 | * @brief DS1624_ReadBytesEEPROM ( char , char* , uint8_t ) |
mcm | 1:fc952e73a23e | 386 | * |
mcm | 1:fc952e73a23e | 387 | * @details It reads a certain number of bytes from EEPROM memory. |
mcm | 1:fc952e73a23e | 388 | * |
mcm | 1:fc952e73a23e | 389 | * @param[in] myStartingAddress: Starting address to read the EEPROM memory. |
mcm | 1:fc952e73a23e | 390 | * @param[in] myLength: Amount of bytes to read. |
mcm | 1:fc952e73a23e | 391 | * |
mcm | 1:fc952e73a23e | 392 | * @param[out] myReadBytesEEPROM: Read values from EEPROM memory. |
mcm | 1:fc952e73a23e | 393 | * |
mcm | 1:fc952e73a23e | 394 | * |
mcm | 1:fc952e73a23e | 395 | * @return Status of DS1624_ReadBytesEEPROM. |
mcm | 1:fc952e73a23e | 396 | * |
mcm | 1:fc952e73a23e | 397 | * |
mcm | 1:fc952e73a23e | 398 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 399 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 400 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 401 | * @pre N/A. |
mcm | 1:fc952e73a23e | 402 | * @warning When the address pointer reaches the end of the 256-byte memory space ( address FFh ) |
mcm | 1:fc952e73a23e | 403 | * it increments from the end of the memory back to the first location of the memory |
mcm | 1:fc952e73a23e | 404 | * ( address 00h ). |
mcm | 1:fc952e73a23e | 405 | */ |
mcm | 1:fc952e73a23e | 406 | DS1624::DS1624_status_t DS1624::DS1624_ReadBytesEEPROM ( char myStartingAddress, char* myReadBytesEEPROM, uint8_t myLength ) |
mcm | 1:fc952e73a23e | 407 | { |
mcm | 1:fc952e73a23e | 408 | char cmd[] = { DS1624_ACCESS_MEMORY, 0 }; |
mcm | 1:fc952e73a23e | 409 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 410 | |
mcm | 1:fc952e73a23e | 411 | |
mcm | 1:fc952e73a23e | 412 | |
mcm | 1:fc952e73a23e | 413 | // It sends the command, the address location and gets the result |
mcm | 1:fc952e73a23e | 414 | cmd[1] = myStartingAddress; |
mcm | 1:fc952e73a23e | 415 | aux = _i2c.write ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), true ); |
mcm | 1:fc952e73a23e | 416 | aux = _i2c.read ( _DS1624_Addr, myReadBytesEEPROM, myLength ); |
mcm | 1:fc952e73a23e | 417 | |
mcm | 1:fc952e73a23e | 418 | |
mcm | 1:fc952e73a23e | 419 | |
mcm | 1:fc952e73a23e | 420 | |
mcm | 1:fc952e73a23e | 421 | |
mcm | 1:fc952e73a23e | 422 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 423 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 424 | else |
mcm | 1:fc952e73a23e | 425 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 426 | } |
mcm | 1:fc952e73a23e | 427 | |
mcm | 1:fc952e73a23e | 428 | |
mcm | 1:fc952e73a23e | 429 | |
mcm | 1:fc952e73a23e | 430 | /** |
mcm | 3:3a26cd3cd594 | 431 | * @brief DS1624_WriteBytesEEPROM ( char , char , uint8_t ) |
mcm | 1:fc952e73a23e | 432 | * |
mcm | 1:fc952e73a23e | 433 | * @details It writes a certain number of bytes to EEPROM memory. |
mcm | 1:fc952e73a23e | 434 | * |
mcm | 1:fc952e73a23e | 435 | * @param[in] myStartingAddress: Starting address to write the EEPROM memory. |
mcm | 1:fc952e73a23e | 436 | * @param[in] myWriteBytesEEPROM: Bytes to write to the EEPROM memory. |
mcm | 1:fc952e73a23e | 437 | * @param[in] myLength: Amount of bytes to write. |
mcm | 1:fc952e73a23e | 438 | * |
mcm | 1:fc952e73a23e | 439 | * @param[out] N/A. |
mcm | 1:fc952e73a23e | 440 | * |
mcm | 1:fc952e73a23e | 441 | * |
mcm | 1:fc952e73a23e | 442 | * @return Status of DS1624_WriteBytesEEPROM. |
mcm | 1:fc952e73a23e | 443 | * |
mcm | 1:fc952e73a23e | 444 | * |
mcm | 1:fc952e73a23e | 445 | * @author Manuel Caballero |
mcm | 1:fc952e73a23e | 446 | * @date 31/January/2018 |
mcm | 1:fc952e73a23e | 447 | * @version 31/January/2018 The ORIGIN |
mcm | 1:fc952e73a23e | 448 | * @pre N/A. |
mcm | 1:fc952e73a23e | 449 | * @warning The STOP condition causes the DS1624 to initiate the write to EEPROM sequence. |
mcm | 1:fc952e73a23e | 450 | * @warning If the starting address is 00 and the incoming data is 00 11 22 33 44 55 66 77 88 99, |
mcm | 1:fc952e73a23e | 451 | * the result is mem00=88 mem01=99 mem02=22 mem03=33 mem04=44 mem05=55 mem06=66 mem07=77. |
mcm | 1:fc952e73a23e | 452 | * The data wraps around and overwrites itself. |
mcm | 3:3a26cd3cd594 | 453 | * @warning EEPROM Write Cycle Time: 50ms ( maximum ). The user must take care of this time!. |
mcm | 1:fc952e73a23e | 454 | */ |
mcm | 1:fc952e73a23e | 455 | DS1624::DS1624_status_t DS1624::DS1624_WriteBytesEEPROM ( char myStartingAddress, char myWriteBytesEEPROM[], uint8_t myLength ) |
mcm | 1:fc952e73a23e | 456 | { |
mcm | 3:3a26cd3cd594 | 457 | char cmd[ myLength + 2 ]; |
mcm | 3:3a26cd3cd594 | 458 | uint32_t i = 0; |
mcm | 1:fc952e73a23e | 459 | uint32_t aux = 0; |
mcm | 1:fc952e73a23e | 460 | |
mcm | 1:fc952e73a23e | 461 | |
mcm | 3:3a26cd3cd594 | 462 | // Prepare COMMANDS |
mcm | 3:3a26cd3cd594 | 463 | cmd[0] = DS1624_ACCESS_MEMORY; |
mcm | 1:fc952e73a23e | 464 | cmd[1] = myStartingAddress; |
mcm | 1:fc952e73a23e | 465 | |
mcm | 3:3a26cd3cd594 | 466 | // Prepare the payload to be stored into the EEPROM memory |
mcm | 3:3a26cd3cd594 | 467 | for ( i = 2 ; i < ( myLength + 2 ); i++ ) |
mcm | 3:3a26cd3cd594 | 468 | cmd[ i ] = myWriteBytesEEPROM[ i - 2 ]; |
mcm | 3:3a26cd3cd594 | 469 | |
mcm | 3:3a26cd3cd594 | 470 | // It sends the command, the address location as well as the payload |
mcm | 3:3a26cd3cd594 | 471 | aux = _i2c.write ( _DS1624_Addr, &cmd[0], myLength + 2, false ); |
mcm | 1:fc952e73a23e | 472 | |
mcm | 1:fc952e73a23e | 473 | |
mcm | 1:fc952e73a23e | 474 | |
mcm | 1:fc952e73a23e | 475 | |
mcm | 1:fc952e73a23e | 476 | if ( aux == I2C_SUCCESS ) |
mcm | 1:fc952e73a23e | 477 | return DS1624_SUCCESS; |
mcm | 1:fc952e73a23e | 478 | else |
mcm | 1:fc952e73a23e | 479 | return DS1624_FAILURE; |
mcm | 1:fc952e73a23e | 480 | } |