student_with_profs_snec / DS_3231

DS_3231.h

Committer:
snec_student
Date:
2022-03-06
Revision:
0:d801ad2b1422

File content as of revision 0:d801ad2b1422:

#include "mbed.h"

#ifndef DS_3231_H
#define DS_3211_H



#define DS3231_I2C_ADRS 0x68
#define I2C_WRITE 0
#define I2C_READ  1

#define AM_PM     (1 << 5)
#define MODE      (1 << 6)
#define DY_DT     (1 << 6)
#define ALRM_MASK (1 << 7)

/** definition d'une structure de type temps
* DS_3231_time_t - Structure permettant de cntenir un temps
* Membres:
* - uint32_t seconds - Use decimal value. Member fx's convert to BCD
* - uint32_t minutes - Use decimal value. Member fx's convert to BCD
* - uint32_t hours   - Use decimal value. Member fx's convert to BCD
* - bool am_pm      - TRUE for PM, same logic as datashee
* - bool mode       - TRUE for 12 hour, same logic as datasheet */
typedef struct { //
    uint32_t seconds;       //valeur des secondes
    uint32_t minutes;       //valeur des minutes
    uint32_t hours;         //valeur des heures
    bool am_pm;             // 0 pour AM, 1 pour PM
    bool mode;              // 0 pour format 24 heures, 1 pour format 12 heures
} DS_3231_time_t;

/**definition d'une structure de type alarme
* Members:
* - uint32_t seconds - Use decimal value. Member fx's convert to BCD 
* - uint32_t minutes - Use decimal value. Member fx's convert to BCD 
* - uint32_t hours   - Use decimal value. Member fx's convert to BCD 
* - uint32_t day     - Use decimal value. Member fx's convert to BCD 
* - uint32_t date    - Use decimal value. Member fx's convert to BCD 
* - bool am1        - Flag for setting alarm rate
* - bool am2        - Flag for setting alarm rate
* - bool am3        - Flag for setting alarm rate
* - bool am4        - Flag for setting alarm rate
* - bool am_pm      - TRUE for PM, same logic as datasheet
* - bool mode       - TRUE for 12 hour, same logic as datasheet
* - bool dy_dt      - TRUE for Day, same logic as datasheet
*/
typedef struct
{
    //Seconds and am1 not used for alarm2
    uint32_t seconds; 
    uint32_t minutes; 
    uint32_t hours; 
    uint32_t day; 
    uint32_t date; 
    bool am1; 
    bool am2;
    bool am3;
    bool am4;
    bool am_pm; 
    bool mode; 
    bool dy_dt;
}DS_3231_alrm_t;

/**Definition des registres de configuration et d'etat
* Members:
* - uint8_t control - Binary data for read/write of control register 
* - uint8_t status  - Binary data  for read/write of status register 
*/
typedef struct
{
    uint8_t control; 
    uint8_t status; 
}DS_3231_cntl_stat_t;
        

/******************************************************************//**
* Ds3231 Class
**********************************************************************/
class DS_3231
{
    uint8_t w_adrs, r_adrs; // declaration des adresses I2C en ecriture et en lecture
public :

    /**
     * ds3231_regs_t - enumerated DS3231 registers
     */
    typedef enum {
        SECONDS,
        MINUTES,
        HOURS,
        DAY,
        DATE,
        MONTH,
        YEAR,
        ALRM1_SECONDS,
        ALRM1_MINUTES,
        ALRM1_HOURS,
        ALRM1_DAY_DATE,
        ALRM2_MINUTES,
        ALRM2_HOURS,
        ALRM2_DAY_DATE,
        CONTROL,
        STATUS,
        AGING_OFFSET, //don't touch this register
        MSB_TEMP,
        LSB_TEMP
    } DS3231_regs_t;

// constructeur avec 2 broches I2C
    DS_3231 (PinName SDA, PinName SCL);

// ecrire l'horaire sur l'horloge
// arguments : structure de type horaire
// cette fonction renvoie 0 si opération OK,1  si capteur absent
    uint16_t set_time(DS_3231_time_t time);

// Lire l'horaire sur l'horloge
// arguments : pointeur vers une structure de type horaire
// cette fonction renvoie 0 si opération OK,1  si capteur absent
    uint16_t get_time(DS_3231_time_t* time);

// programmer une alarme sur l'horloge
// arguments : structure de type alarme, numero de la voie alarme 0/1 pour alrm1/2
// cette fonction renvoie 0 si opération OK,1  si capteur absent
    uint16_t set_alarm(DS_3231_alrm_t alarm, bool one_r_two);
    
// programmer les registres d'etat et de controle sur l'horloge
// arguments : structure de type registre de controle/etat
// cette fonction renvoie 0 si opération OK,1  si pb
// Example:
        /* //do not use 0xAA, see datasheet for appropriate data 
        * ds3231_cntl_stat_t data = {0xAA, 0xAA}; 
        *
        * rtn_val = rtc.set_cntl_stat_reg(data);
        *
        * @endcode
        **************************************************************/
        uint16_t set_cntl_stat_reg(DS_3231_cntl_stat_t data);

// raz flag alarme

        char raz_alm1();


private :
    /**********************************************************//**
    * Conversion d'un uint8_t en bcd
    * argument: valeur de la valeur à convertir en BDC (0 à 255)
    * valeur retournée :  = valeur convertie en BCD
    * par exemple unint16_t toto = uchar_2_bcd(323); => toto = 0x323
    **************************************************************/
    uint16_t uchar_2_bcd(uint8_t data);
    // la classe possede en interne :
    I2C i2c; // un composant I2C que l'on nommera i2c
    // unsigned char adr_I2C=0x32; // une adresse I2C


/**********************************************************//**
* Conversion d'un bcd en uint8_t
* argument: valeur de la valeur à convertir en BCD
* valeur retournée :  = valeur convertie en uint8
* par exemple :
**************************************************************/
uint8_t bcd_2_uchar(uint8_t bcd);
};
#endif