Manuel Caballero / MCP9808

Dependents:   mbed-os5-F303-18650-Manager-tp4056

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MCP9808.h Source File

MCP9808.h

00001 /**
00002  * @brief       MCP9808.h
00003  * @details     ±0.5°C Maximum Accuracy Digital Temperature Sensor.
00004  *              Header file.
00005  *
00006  *
00007  * @return      N/A
00008  *
00009  * @author      Manuel Caballero
00010  * @date        25/April/2019
00011  * @version     25/April/2019    The ORIGIN
00012  * @pre         N/A.
00013  * @warning     N/A
00014  * @pre         This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). All rights reserved.
00015  */
00016 #ifndef MCP9808_H
00017 #define MCP9808_H
00018 
00019 #include "mbed.h"
00020 
00021 
00022 /**
00023     Example:
00024 @code
00025 #include "mbed.h"
00026 #include "MCP9808.h"
00027 
00028 MCP9808 myMCP9808 ( p28, p27, MCP9808::MCP9808_ADDRESS_0, 400000 );             // I2C_SDA | I2C_SCL
00029 Serial pc         ( USBTX, USBRX );                                             // tx, rx
00030 
00031 DigitalOut  myled   ( LED1 );
00032 Ticker      newAction;
00033 
00034 
00035 
00036 // @brief Constants.
00037 
00038 
00039 // @brief Variables.
00040 volatile uint32_t myState;                                                      // State that indicates when to perform a new sample
00041 
00042 
00043 
00044 // @brief   FUNCTION PROTOTYPES
00045 void    changeDATA     ( void );
00046 
00047 
00048 
00049 
00050 //@brief FUNCTION FOR APPLICATION MAIN ENTRY.
00051 int main()
00052 {
00053     MCP9808::MCP9808_status_t aux;
00054     MCP9808::MCP9808_config_reg_t  myMCP9808_Config;
00055     MCP9808::MCP9808_data_t        myMCP9808_Data;
00056 
00057     pc.baud ( 115200 );
00058 
00059 
00060     myled   =   1;
00061     wait(3);
00062     myled   =   0;
00063 
00064     // Shutdown the device, low-power mode enabled
00065     aux  =   myMCP9808.MCP9808_GetCONFIG ( &myMCP9808_Config );
00066 
00067     myMCP9808_Config.shdn  =   MCP9808::CONFIG_SHDN_SHUTDOWN;
00068     aux  =   myMCP9808.MCP9808_SetCONFIG ( myMCP9808_Config );
00069 
00070     // Get manufacturer ID
00071     aux  =   myMCP9808.MCP9808_GetManufacturerID ( &myMCP9808_Data );
00072 
00073     // Get device ID and device revision
00074     aux  =   myMCP9808.MCP9808_GetDeviceID ( &myMCP9808_Data );
00075 
00076     // Configure the device
00077      //  - T_UPPER and T_LOWER limit hysteresis at 0C
00078      //  - Continuous conversion mode
00079      //  - T_CRIT unlocked
00080      //  - Window lock unlocked
00081      //  - Alert output control disabled
00082      //  - Alert output select: Alert for T_UPPER, T_LOWER and T_CRIT
00083      //  - Alert output polaruty: Active-low
00084      //  - Alert output mode: Comparator output
00085      //
00086     myMCP9808_Config.t_hyst      =   MCP9808::CONFIG_T_HYST_0_C;
00087     myMCP9808_Config.shdn        =   MCP9808::CONFIG_SHDN_CONTINUOUS_CONVERSION;
00088     myMCP9808_Config.t_crit      =   MCP9808::CONFIG_CRIT_LOCK_UNLOCKED;
00089     myMCP9808_Config.t_win_lock  =   MCP9808::CONFIG_WIN_LOCK_UNLOCKED;
00090     myMCP9808_Config.alert_cnt   =   MCP9808::CONFIG_ALERT_CNT_DISABLED;
00091     myMCP9808_Config.alert_sel   =   MCP9808::CONFIG_ALERT_SEL_TUPPER_TLOWER_TCRIT;
00092     myMCP9808_Config.alert_pol   =   MCP9808::CONFIG_ALERT_POL_ACTIVE_LOW;
00093     myMCP9808_Config.alert_mod   =   MCP9808::CONFIG_ALERT_MOD_COMPARATOR_OUTPUT;
00094     aux  =   myMCP9808.MCP9808_SetCONFIG ( myMCP9808_Config );
00095 
00096     // Set resolution: +0.0625C ( t_CON ~ 250ms )
00097     myMCP9808_Data.resolution  =   MCP9808::RESOLUTION_0_0625_C;
00098     aux  =   myMCP9808.MCP9808_SetResolution ( myMCP9808_Data );
00099 
00100 
00101     myState  =   0UL;                                                           // Reset the variable
00102     newAction.attach( &changeDATA, 1U );                                        // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
00103 
00104 
00105     // Let the callbacks take care of everything
00106     while(1) {
00107         sleep();
00108 
00109         if ( myState == 1UL ) {
00110             myled = 1U;
00111 
00112             // Get ambient temperature
00113             aux  =   myMCP9808.MCP9808_GetTA ( &myMCP9808_Data );
00114 
00115             // Send data through the UART
00116             pc.printf ( "T: %0.4f C\r\n", myMCP9808_Data.t_a );
00117 
00118 
00119             // Reset the variables
00120             myState  =   0UL;
00121             myled    =   0U;
00122         }
00123     }
00124 }
00125 
00126 
00127  // @brief       changeDATA ( void  )
00128  //
00129  // @details     It changes myState variable
00130  //
00131  // @param[in]    N/A
00132  //
00133  // @param[out]   N/A.
00134  //
00135  // @return       N/A.
00136  //
00137  //
00138  // @author      Manuel Caballero
00139  // @date        25/April/2019
00140  // @version     25/April/2019   The ORIGIN
00141  // @pre         N/A
00142  // @warning     N/A.
00143  //
00144 void changeDATA ( void )
00145 {
00146     myState  =   1UL;
00147 }
00148 @endcode
00149 */
00150 
00151 
00152 /*!
00153  Library for the MCP9808 ±0.5°C Maximum Accuracy Digital Temperature Sensor.
00154 */
00155 class MCP9808
00156 {
00157 public:
00158     /**
00159     * @brief   DEFAULT ADDRESSES
00160     */
00161     typedef enum {
00162         MCP9808_ADDRESS_0      =   ( 0b0011000 << 1U ),        /*!<   I2C slave address byte: A2A1A0: 000          */
00163         MCP9808_ADDRESS_1      =   ( 0b0011001 << 1U ),        /*!<   I2C slave address byte: A2A1A0: 001          */
00164         MCP9808_ADDRESS_2      =   ( 0b0011010 << 1U ),        /*!<   I2C slave address byte: A2A1A0: 010          */
00165         MCP9808_ADDRESS_3      =   ( 0b0011011 << 1U ),        /*!<   I2C slave address byte: A2A1A0: 011          */
00166         MCP9808_ADDRESS_4      =   ( 0b0011100 << 1U ),        /*!<   I2C slave address byte: A2A1A0: 100          */
00167         MCP9808_ADDRESS_5      =   ( 0b0011101 << 1U ),        /*!<   I2C slave address byte: A2A1A0: 101          */
00168         MCP9808_ADDRESS_6      =   ( 0b0011110 << 1U ),        /*!<   I2C slave address byte: A2A1A0: 110          */
00169         MCP9808_ADDRESS_7      =   ( 0b0011111 << 1U )         /*!<   I2C slave address byte: A2A1A0: 111          */
00170     } MCP9808_addresses_t;
00171 
00172 
00173 
00174     /**
00175       * @brief   REGISTERS
00176       */
00177     typedef enum {
00178         MCP9808_CONFIG           =   0x01,           /*!<  CONFIG register                               */
00179         MCP9808_TUPPER           =   0x02,           /*!<  T_UPPER register                              */
00180         MCP9808_TLOWER           =   0x03,           /*!<  T_LOWER register                              */
00181         MCP9808_TCRIT            =   0x04,           /*!<  T_CRIT register                               */
00182         MCP9808_TA               =   0x05,           /*!<  T_A register                                  */
00183         MCP9808_MANUFACTURER_ID  =   0x06,           /*!<  Manufacturer ID register                      */
00184         MCP9808_DEVICE_ID        =   0x07,           /*!<  Device ID/Revision register                   */
00185         MCP9808_RESOLUTION       =   0x08            /*!<  Resolution register                           */
00186     } MCP9808_registers_t;
00187 
00188 
00189 
00190     /**
00191       * @brief   CONFIG Register
00192       */
00193     /* T_HYST <9:10>: TUPPER AND TLOWER LIMIT HYSTERESIS BITS
00194      *    NOTE:
00195      *      · This bit can not be altered when either of the Lock bits are set ( bit 6 and bit 7 )
00196      *      · This bit can be programmed in Shutdown mode
00197      */
00198     typedef enum {
00199         CONFIG_T_HYST_MASK                 =   ( 0b11 << 9U ),   /*!<  T_HYST mask                                     */
00200         CONFIG_T_HYST_0_C                  =   ( 0b00 << 9U ),   /*!<  T_HYST: 0C                          [ Default ] */
00201         CONFIG_T_HYST_1_5_C                =   ( 0b01 << 9U ),   /*!<  T_HYST: +1.5C                                   */
00202         CONFIG_T_HYST_3_0_C                =   ( 0b10 << 9U ),   /*!<  T_HYST: +3.0C                                   */
00203         CONFIG_T_HYST_6_0_C                =   ( 0b11 << 9U ),   /*!<  T_HYST: +6.0C                                   */
00204     } MCP9808_config_thyst_t;
00205 
00206 
00207 
00208     /* SHDN <8>: SHUTDOWN MODE BIT
00209      *    NOTE:
00210      *      · This bit can not be set to '1' when either of the Lock bits are set ( bit 6 and bit 7 ), however,
00211      *        it can be cleared to '0' for continuous conversion while locked.
00212      */
00213     typedef enum {
00214         CONFIG_SHDN_MASK                   =   ( 1U << 8U ),     /*!<  SHDN mask                                       */
00215         CONFIG_SHDN_CONTINUOUS_CONVERSION  =   ( 0U << 8U ),     /*!<  SHDN: Continuous conversion         [ Default ] */
00216         CONFIG_SHDN_SHUTDOWN               =   ( 1U << 8U )      /*!<  SHDN: Shutdown ( Low-power mode )               */
00217     } MCP9808_config_shdn_t ;
00218 
00219 
00220 
00221     /* CRIT_LOCK <7>: T_CRIT LOCKED BIT
00222      *    NOTE: N/A.
00223      */
00224     typedef enum {
00225         CONFIG_CRIT_LOCK_MASK              =   ( 1U << 7U ),     /*!<  CRIT_LOCK mask                                  */
00226         CONFIG_CRIT_LOCK_UNLOCKED          =   ( 0U << 7U ),     /*!<  T_CRIT register can be written      [ Default ] */
00227         CONFIG_CRIT_LOCK_LOCKED            =   ( 1U << 7U )      /*!<  T_CRIT register can not be written              */
00228     } MCP9808_config_crit_lock_t ;
00229 
00230 
00231 
00232     /* WIN_LOCK <6>: CORRECTION INTERRUPT ENABLE
00233      *    NOTE: N/A.
00234      */
00235     typedef enum {
00236         CONFIG_WIN_LOCK_MASK               =   ( 1U << 6U ),     /*!<  WIN_LOCK mask                                   */
00237         CONFIG_WIN_LOCK_UNLOCKED           =   ( 0U << 6U ),     /*!<  TUPPER and TLOWER can be written    [ Default ] */
00238         CONFIG_WIN_LOCK_LOCKED             =   ( 1U << 6U )      /*!<  TUPPER and TLOWER can not be written            */
00239     } MCP9808_config_win_lock_t ;
00240 
00241 
00242 
00243     /* INT_CLEAR <5>: INTERRUPT CLEAR BIT
00244      *    NOTE:
00245      *      · This bit can not be set to '1' in Shutdown mode, but it can be cleared after the device enters Shutdown mode
00246      */
00247     typedef enum {
00248         CONFIG_INT_CLEAR_MASK               =   ( 1U << 5U ),     /*!<  INT_CLEAR mask                                 */
00249         CONFIG_INT_CLEAR_NO_EFFECT          =   ( 0U << 5U ),     /*!<  No effect                          [ Default ] */
00250         CONFIG_INT_CLEAR_CLEAR_INT_OUTPUT   =   ( 1U << 5U )      /*!<  Clear interrupt output, when read, returns '0' */
00251     } MCP9808_conf_int_clear_t ;
00252 
00253 
00254 
00255     /* ALERT_STAT <4>: ALERT OUTPUT STATUS BIT
00256      *    NOTE: N/A.
00257      */
00258     typedef enum {
00259         CONFIG_ALERT_STAT_MASK               =   ( 1U << 4U ),     /*!<  ALERT_STAT mask                               */
00260         CONFIG_ALERT_STAT_NOT_ASSERTED       =   ( 0U << 4U ),     /*!<  ALERT_STAT is not asserted        [ Default ] */
00261         CONFIG_ALERT_STAT_ASSERTED           =   ( 1U << 4U )      /*!<  ALERT_STAT is asserted                        */
00262     } MCP9808_config_alert_stat_t ;
00263 
00264 
00265 
00266     /* ALERT_CNT <3>: ALERT OUTPUT CONTROL BIT
00267      *    NOTE: N/A.
00268      */
00269     typedef enum {
00270         CONFIG_ALERT_CNT_MASK                =   ( 1U << 3U ),     /*!<  ALERT_CNT mask                               */
00271         CONFIG_ALERT_CNT_DISABLED            =   ( 0U << 3U ),     /*!<  ALERT_CNT disabled               [ Default ] */
00272         CONFIG_ALERT_CNT_ENABLED             =   ( 1U << 3U )      /*!<  ALERT_CNT enabled                            */
00273     } MCP9808_config_alert_cnt_t ;
00274 
00275 
00276 
00277     /* ALERT_SEL <2>: ALERT OUTPUT SELECT BIT
00278      *    NOTE: N/A.
00279      */
00280     typedef enum {
00281         CONFIG_ALERT_SEL_MASK                  =   ( 1U << 2U ),   /*!<  ALERT_SEL mask                                            */
00282         CONFIG_ALERT_SEL_TUPPER_TLOWER_TCRIT   =   ( 0U << 2U ),   /*!<  Alert output for T_UPPER, T_LOWER and T_CRIT  [ Default ] */
00283         CONFIG_ALERT_SEL_TA_GREATER_TCRIT      =   ( 1U << 2U )    /*!<  Alert output for T_A greater T_CRIT                       */
00284     } MCP9808_config_alert_sel_t ;
00285 
00286 
00287 
00288     /* ALERT_POL <1>: ALERT OUTPUT POLARITY BIT
00289      *    NOTE: N/A.
00290      */
00291     typedef enum {
00292         CONFIG_ALERT_POL_MASK                =   ( 1U << 1U ),     /*!<  ALERT_POL mask                               */
00293         CONFIG_ALERT_POL_ACTIVE_LOW          =   ( 0U << 1U ),     /*!<  ALERT_POL active-low             [ Default ] */
00294         CONFIG_ALERT_POL_ACTIVE_HIGH         =   ( 1U << 1U )      /*!<  ALERT_POL active-high                        */
00295     } MCP9808_config_alert_pol_t ;
00296 
00297 
00298 
00299     /* ALERT_MOD <0>: ALERT OUTPUT MODE BIT
00300      *    NOTE: N/A.
00301      */
00302     typedef enum {
00303         CONFIG_ALERT_MOD_MASK                =   ( 1U << 0U ),     /*!<  ALERT_MOD mask                               */
00304         CONFIG_ALERT_MOD_COMPARATOR_OUTPUT   =   ( 0U << 0U ),     /*!<  ALERT_MOD comparator output      [ Default ] */
00305         CONFIG_ALERT_MOD_INTERRUPT_OUTPUT    =   ( 1U << 0U )      /*!<  ALERT_MOD interrupt output                   */
00306     } MCP9808_config_alert_mod_t ;
00307 
00308 
00309 
00310 
00311     /**
00312       * @brief   T_UPPER/T_LOWER/T_CRIT TEMPERATURE LIMIT REGISTERS
00313       */
00314     /* SIGN <12>: SIGN BIT
00315      *    NOTE: N/A.
00316      */
00317     typedef enum {
00318         TEMPERATURE_LIMIT_SIGN_MASK          =   ( 1U << 12U ),    /*!<  SIGN mask                                   */
00319         TEMPERATURE_LIMIT_SIGN_TA_POSITIVE   =   ( 0U << 12U ),    /*!<  T_A greater or iqual 0C         [ Default ] */
00320         TEMPERATURE_LIMIT_SIGN_TA_NEGATIVE   =   ( 1U << 12U )     /*!<  T_A lower 0C                                */
00321     } MCP9808_temperature_limit_sign_t;
00322 
00323 
00324 
00325     /* INTEGRAL <8:4>: TEMPERATURE INTEGRAL BOUNDARY PART
00326      *    NOTE: N/A.
00327      */
00328     typedef enum {
00329         TEMPERATURE_LIMIT_INTEGRAL_PART_MASK   =   ( 0b11111111 << 4U ) /*!<  Temperature limit, integral part mask    */
00330     } MCP9808_temperature_limit_integral_boundary_t ;
00331 
00332 
00333 
00334     /* DECIMAL <3:2>: TEMPERATURE DECIMAL BOUNDARY PART
00335      *    NOTE: N/A.
00336      */
00337     typedef enum {
00338         TEMPERATURE_LIMIT_DECIMAL_PART_MASK    =   ( 0b11 << 2U ),   /*!<  Temperature limit, decimal part mask       */
00339         TEMPERATURE_LIMIT_DECIMAL_PART_0_00C   =   ( 0b00 << 2U ),   /*!<  Temperature limit, decimal part: 0.00C     */
00340         TEMPERATURE_LIMIT_DECIMAL_PART_0_25C   =   ( 0b01 << 2U ),   /*!<  Temperature limit, decimal part: 0.25C     */
00341         TEMPERATURE_LIMIT_DECIMAL_PART_0_50C   =   ( 0b10 << 2U ),   /*!<  Temperature limit, decimal part: 0.50C     */
00342         TEMPERATURE_LIMIT_DECIMAL_PART_0_75C   =   ( 0b11 << 2U )    /*!<  Temperature limit, decimal part: 0.75C     */
00343     } MCP9808_temperature_limit_decimal_boundary_t ;
00344 
00345 
00346 
00347 
00348     /**
00349       * @brief   T_A AMBIENT TEMPERATURE REGISTERS
00350       */
00351     /* TA_VS_TCRIT <15>
00352      *    NOTE: N/A.
00353      */
00354     typedef enum {
00355         T_A_TA_VS_TCRIT_MASK                     =   ( 1U << 15U ),  /*!<  T_A mask                                    */
00356         T_A_TA_VS_TCRIT_TA_LOWER_TCRIT           =   ( 0U << 15U ),  /*!<  T_A lower T_CRIT                            */
00357         T_A_TA_VS_TCRIT_TA_GREATER_EQUAL_TCRIT   =   ( 1U << 15U )   /*!<  T_A greater or equal T_CRIT                 */
00358     } MCP9808_t_a_ta_vs_tcrit_t;
00359 
00360 
00361 
00362     /* TA_VS_TUPPER <14>
00363      *    NOTE: N/A.
00364      */
00365     typedef enum {
00366         T_A_TA_VS_TUPPER_MASK                      =   ( 1U << 14U ),  /*!<  T_A mask                                    */
00367         T_A_TA_VS_TUPPER_TA_LOWER__IQUAL_TUPPER    =   ( 0U << 14U ),  /*!<  T_A lower or equal T_UPPER                  */
00368         T_A_TA_VS_TUPPER_TA_GREATER_TUPPER         =   ( 1U << 14U )   /*!<  T_A greater T_UPPER                         */
00369     } MCP9808_t_a_ta_vs_tupper_t ;
00370 
00371 
00372 
00373     /* TA_VS_LOWER <13>
00374      *    NOTE: N/A.
00375      */
00376     typedef enum {
00377         T_A_TA_VS_TLOWER_MASK                      =   ( 1U << 13U ),  /*!<  T_A mask                                    */
00378         T_A_TA_VS_TLOWER_TA_LOWER_TLOWER           =   ( 1U << 13U ),  /*!<  T_A lower or equal T_LOWER                  */
00379         T_A_TA_VS_TLOWER_TA_GREATER_EQUAL_TLOWER   =   ( 0U << 13U )   /*!<  T_A greater T_LOWER                         */
00380     } MCP9808_t_a_ta_vs_tlower_t ;
00381 
00382 
00383 
00384     /* TA_SIGN <12>
00385      *    NOTE: N/A.
00386      */
00387     typedef enum {
00388         T_A_TA_SIGN_MASK                           =   ( 1U << 12U ),  /*!<  T_A SIGN mask                               */
00389         T_A_TA_SIGN_POSITIVE                       =   ( 0U << 12U ),  /*!<  T_A positive                                */
00390         T_A_TA_SIGN_NEGATIVE                       =   ( 1U << 12U )   /*!<  T_A negative                                */
00391     } MCP9808_t_a_sign_t ;
00392 
00393 
00394 
00395     /* TA_INTEGRAL <11:4>
00396      *    NOTE: N/A.
00397      */
00398     typedef enum {
00399         T_A_TA_INTEGRAL_PART_MASK          =   ( 0b11111111 << 4U )    /*!<  T_A integral part                         */
00400     } MCP9808_t_a_integral_t ;
00401 
00402 
00403 
00404     /* TA_DECIMAL <3:0>
00405      *    NOTE: N/A.
00406      */
00407     typedef enum {
00408         T_A_TA_DECIMAL_PART_MASK          =   ( 0b1111 << 0U )         /*!<  T_A decimal part                         */
00409     } MCP9808_t_a_decimal_t ;
00410 
00411 
00412 
00413 
00414     /**
00415       * @brief   RESOLUTION REGISTER
00416       */
00417     /* RESOLUTION <1:0>
00418      *    NOTE: N/A.
00419      */
00420     typedef enum {
00421         RESOLUTION_MASK                    =   ( 0b11 << 0U ),         /*!<  Resolution mask                       */
00422         RESOLUTION_0_5_C                   =   ( 0b00 << 0U ),         /*!<  Resolution: +0.5C                     */
00423         RESOLUTION_0_25_C                  =   ( 0b01 << 0U ),         /*!<  Resolution: +0.25C                    */
00424         RESOLUTION_0_125_C                 =   ( 0b10 << 0U ),         /*!<  Resolution: +0.125C                   */
00425         RESOLUTION_0_0625_C                =   ( 0b11 << 0U )          /*!<  Resolution: +0.0625C      [ Default ] */
00426     } MCP9808_resolution_t;
00427 
00428 
00429 
00430 
00431 
00432 
00433 #ifndef MCP9808_VECTOR_STRUCT_H
00434 #define MCP9808_VECTOR_STRUCT_H
00435     typedef struct {
00436         MCP9808_config_thyst_t      t_hyst;           /*!<  Temperature Limit Hysteresis  */
00437         MCP9808_config_shdn_t        shdn;             /*!<  Shutdown mode                 */
00438         MCP9808_config_crit_lock_t   t_crit;           /*!<  T_CRIT lock bit               */
00439         MCP9808_config_win_lock_t    t_win_lock;       /*!<  Win. Lock bit                 */
00440         MCP9808_conf_int_clear_t     int_clear;        /*!<  Interrupt clear bit           */
00441         MCP9808_config_alert_stat_t  alert_stat;       /*!<  Alert output status bit       */
00442         MCP9808_config_alert_cnt_t   alert_cnt;        /*!<  Alert Output control bit      */
00443         MCP9808_config_alert_sel_t   alert_sel;        /*!<  Alert Output select bit       */
00444         MCP9808_config_alert_pol_t   alert_pol;        /*!<  Alert Output polarity bit     */
00445         MCP9808_config_alert_mod_t   alert_mod;        /*!<  Alert Output mode bit         */
00446     } MCP9808_config_reg_t;
00447 
00448 
00449     typedef struct {
00450         float                       t_a;              /*!<  Ambient temperature value     */
00451         uint16_t                    t_a_raw;          /*!<  Raw ambient temperature value */
00452 
00453         MCP9808_t_a_sign_t           t_a_sign;         /*!<  Ambient temperature sign      */
00454         MCP9808_t_a_ta_vs_tcrit_t   ta_vs_tcrit;      /*!<  T_A vs T_CRIT  result         */
00455         MCP9808_t_a_ta_vs_tupper_t   ta_vs_tupper;     /*!<  T_A vs T_UPPER result         */
00456         MCP9808_t_a_ta_vs_tlower_t   ta_vs_tlower;     /*!<  T_A vs T_LOWER result         */
00457 
00458         MCP9808_resolution_t        resolution;       /*!<  Device resolution             */
00459 
00460         float                       t_upper;          /*!<  T_UPPER limit                 */
00461         float                       t_lower;          /*!<  T_LOWER limit                 */
00462         float                       t_crit;           /*!<  T_CRIT limit                  */
00463 
00464         uint16_t                    manufacturerID;   /*!<  Manufacturer ID               */
00465         uint8_t                     deviceID;         /*!<  Device ID                     */
00466         uint8_t                     deviceRevision;   /*!<  Device Revision               */
00467     } MCP9808_data_t;
00468 #endif
00469 
00470 
00471     /**
00472       * @brief   INTERNAL CONSTANTS
00473       */
00474     typedef enum {
00475         MCP9808_SUCCESS    =       0U,
00476         MCP9808_FAILURE    =       1U,
00477         I2C_SUCCESS         =       0U                   /*!<   I2C communication was fine        */
00478     } MCP9808_status_t;
00479 
00480 
00481 
00482 
00483     /** Create an MCP9808 object connected to the specified I2C pins.
00484       *
00485       * @param sda     I2C data pin
00486       * @param scl     I2C clock pin
00487       * @param addr    I2C slave address
00488       * @param freq    I2C frequency
00489       */
00490     MCP9808 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
00491 
00492     /** Delete MCP9808 object.
00493      */
00494     ~MCP9808();
00495 
00496     /** It gets CONFIG register value.
00497     */
00498     MCP9808_status_t MCP9808_GetCONFIG          ( MCP9808_config_reg_t* myCONFIG                              );
00499 
00500     /** It sets CONFIG register value.
00501       */
00502     MCP9808_status_t MCP9808_SetCONFIG          ( MCP9808_config_reg_t myCONFIG                               );
00503 
00504     /** It sets temperature limit for: T_UPPER, T_LOWER or T_CRIT.
00505       */
00506     MCP9808_status_t MCP9808_SetT_Limit         ( MCP9808_registers_t myTLimit, MCP9808_data_t myTValue_Limit );
00507 
00508     /** It gets temperature limit for: T_UPPER, T_LOWER or T_CRIT.
00509       */
00510     MCP9808_status_t MCP9808_GetT_Limit         ( MCP9808_registers_t myTLimit, MCP9808_data_t* myTValue_Limit);
00511 
00512     /** It gets ambient temperature register ( raw value ).
00513       */
00514     MCP9808_status_t MCP9808_GetRawTA           ( MCP9808_data_t* myRawTA                                     );
00515 
00516     /** It gets ambient temperature register ( Celsius degrees ).
00517       */
00518     MCP9808_status_t MCP9808_GetTA              ( MCP9808_data_t* myTA                                        );
00519 
00520     /** It gets manufacturer ID.
00521       */
00522     MCP9808_status_t MCP9808_GetManufacturerID  ( MCP9808_data_t* myManufacturerID                            );
00523 
00524     /** It gets both device ID and device revision.
00525       */
00526     MCP9808_status_t MCP9808_GetDeviceID        ( MCP9808_data_t* myDeviceID                                  );
00527 
00528     /** It sets the sensor resolution.
00529       */
00530     MCP9808_status_t MCP9808_SetResolution      ( MCP9808_data_t myResolution                                 );
00531 
00532     /** It gets the sensor resolution.
00533       */
00534     MCP9808_status_t MCP9808_GetResolution      ( MCP9808_data_t* myResolution                                );
00535 
00536 
00537 
00538 
00539 private:
00540     I2C      _i2c;
00541     uint32_t _MCP9808_Addr;
00542 };
00543 
00544 #endif