You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

719 lines
22 KiB

/**
* Copyright (c) 2015 - present LibDriver All rights reserved
*
* The MIT License (MIT)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* @file driver_ds3231.h
* @brief driver ds3231 header file
* @version 2.0.0
* @author Shifeng Li
* @date 2021-03-15
*
* <h3>history</h3>
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td>2021/03/15 <td>2.0 <td>Shifeng Li <td>format the code
* <tr><td>2020/11/30 <td>1.0 <td>Shifeng Li <td>first upload
* </table>
*/
#ifndef DRIVER_DS3231_H
#define DRIVER_DS3231_H
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#ifdef __cplusplus
extern "C"{
#endif
/**
* @defgroup ds3231_driver ds3231 driver function
* @brief ds3231 driver modules
* @{
*/
/**
* @addtogroup ds3231_base_driver
* @{
*/
/**
* @brief ds3231 bool enumeration definition
*/
typedef enum
{
DS3231_BOOL_FALSE = 0x00, /**< disable function */
DS3231_BOOL_TRUE = 0x01, /**< enable function */
} ds3231_bool_t;
/**
* @brief ds3231 alarm enumeration definition
*/
typedef enum
{
DS3231_ALARM_1 = 0x00, /**< alarm 1 */
DS3231_ALARM_2 = 0x01, /**< alarm 2 */
} ds3231_alarm_t;
/**
* @brief ds3231 am pm enumeration definition
*/
typedef enum
{
DS3231_AM = 0x00, /**< am */
DS3231_PM = 0x01, /**< pm */
} ds3231_am_pm_t;
/**
* @brief ds3231 pin enumeration definition
*/
typedef enum
{
DS3231_PIN_SQUARE_WAVE = 0x00, /**< square wave pin */
DS3231_PIN_INTERRUPT = 0x01, /**< interrupt pin */
} ds3231_pin_t;
/**
* @brief ds3231 format enumeration definition
*/
typedef enum
{
DS3231_FORMAT_12H = 0x01, /**< 12h format */
DS3231_FORMAT_24H = 0x00, /**< 24h format */
} ds3231_format_t;
/**
* @brief ds3231 alarm1 enumeration definition
*/
typedef enum
{
DS3231_STATUS_ALARM_2 = (1 << 1), /**< alarm 2 status */
DS3231_STATUS_ALARM_1 = (1 << 0), /**< alarm 1 status */
} ds3231_status_t;
/**
* @}
*/
/**
* @addtogroup ds3231_alarm_driver
* @{
*/
/**
* @brief ds3231 alarm1 enumeration definition
*/
typedef enum
{
DS3231_ALARM1_MODE_ONCE_A_SECOND = 0x0F, /**< interrupt once a second */
DS3231_ALARM1_MODE_SECOND_MATCH = 0x0E, /**< interrupt second match */
DS3231_ALARM1_MODE_MINUTE_SECOND_MATCH = 0x0C, /**< interrupt minute second match */
DS3231_ALARM1_MODE_HOUR_MINUTE_SECOND_MATCH = 0x08, /**< interrupt hour minute second match */
DS3231_ALARM1_MODE_DATE_HOUR_MINUTE_SECOND_MATCH = 0x00, /**< interrupt date hour minute second match */
DS3231_ALARM1_MODE_WEEK_HOUR_MINUTE_SECOND_MATCH = 0x10, /**< interrupt week hour minute second match */
} ds3231_alarm1_mode_t;
/**
* @brief ds3231 alarm2 enumeration definition
*/
typedef enum
{
DS3231_ALARM2_MODE_ONCE_A_MINUTE = 0x07, /**< interrupt once a minute */
DS3231_ALARM2_MODE_MINUTE_MATCH = 0x06, /**< interrupt minute match */
DS3231_ALARM2_MODE_HOUR_MINUTE_MATCH = 0x04, /**< interrupt hour minute match */
DS3231_ALARM2_MODE_DATE_HOUR_MINUTE_MATCH = 0x00, /**< interrupt data hour minute match */
DS3231_ALARM2_MODE_WEEK_HOUR_MINUTE_MATCH = 0x10, /**< interrupt week hour minute match */
} ds3231_alarm2_mode_t;
/**
* @}
*/
/**
* @addtogroup ds3231_base_driver
* @{
*/
/**
* @brief ds3231 time structure definition
*/
typedef struct ds3231_time_s
{
uint16_t year; /**< year */
uint8_t month; /**< month */
uint8_t week; /**< week */
uint8_t date; /**< date */
uint8_t hour; /**< hour */
uint8_t minute; /**< minute */
uint8_t second; /**< second */
ds3231_format_t format; /**< data format */
ds3231_am_pm_t am_pm; /**< am pm */
} ds3231_time_t;
/**
* @brief ds3231 handle structure definition
*/
typedef struct ds3231_handle_s
{
uint8_t (*iic_init)(void); /**< point to an iic_init function address */
uint8_t (*iic_deinit)(void); /**< point to an iic_deinit function address */
uint8_t (*iic_write)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len); /**< point to an iic_write function address */
uint8_t (*iic_read)(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len); /**< point to an iic_read function address */
void (*debug_print)(const char *const fmt, ...); /**< point to a debug_print function address */
void (*receive_callback)(uint8_t type); /**< point to a receive_callback function address */
void (*delay_ms)(uint32_t ms); /**< point to a delay_ms function address */
uint8_t inited; /**< inited flag */
} ds3231_handle_t;
/**
* @brief ds3231 information structure definition
*/
typedef struct ds3231_info_s
{
char chip_name[32]; /**< chip name */
char manufacturer_name[32]; /**< manufacturer name */
char interface[8]; /**< chip interface name */
float supply_voltage_min_v; /**< chip min supply voltage */
float supply_voltage_max_v; /**< chip max supply voltage */
float max_current_ma; /**< chip max current */
float temperature_min; /**< chip min operating temperature */
float temperature_max; /**< chip max operating temperature */
uint32_t driver_version; /**< driver version */
} ds3231_info_t;
/**
* @}
*/
/**
* @defgroup ds3231_link_driver ds3231 link driver function
* @brief ds3231 link driver modules
* @ingroup ds3231_driver
* @{
*/
/**
* @brief initialize ds3231_handle_t structure
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] STRUCTURE is ds3231_handle_t
* @note none
*/
#define DRIVER_DS3231_LINK_INIT(HANDLE, STRUCTURE) memset(HANDLE, 0, sizeof(STRUCTURE))
/**
* @brief link iic_init function
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] FUC points to an iic_init function address
* @note none
*/
#define DRIVER_DS3231_LINK_IIC_INIT(HANDLE, FUC) (HANDLE)->iic_init = FUC
/**
* @brief link iic_deinit function
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] FUC points to an iic_deinit function address
* @note none
*/
#define DRIVER_DS3231_LINK_IIC_DEINIT(HANDLE, FUC) (HANDLE)->iic_deinit = FUC
/**
* @brief link iic_read function
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] FUC points to an iic_read function address
* @note none
*/
#define DRIVER_DS3231_LINK_IIC_READ(HANDLE, FUC) (HANDLE)->iic_read = FUC
/**
* @brief link iic_write function
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] FUC points to an iic_write function address
* @note none
*/
#define DRIVER_DS3231_LINK_IIC_WRITE(HANDLE, FUC) (HANDLE)->iic_write = FUC
/**
* @brief link delay_ms function
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] FUC points to a delay_ms function address
* @note none
*/
#define DRIVER_DS3231_LINK_DELAY_MS(HANDLE, FUC) (HANDLE)->delay_ms = FUC
/**
* @brief link debug_print function
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] FUC points to a debug_print function address
* @note none
*/
#define DRIVER_DS3231_LINK_DEBUG_PRINT(HANDLE, FUC) (HANDLE)->debug_print = FUC
/**
* @brief link receive_callback function
* @param[in] HANDLE points to a ds3231 handle structure
* @param[in] FUC points to a receive_callback function address
* @note none
*/
#define DRIVER_DS3231_LINK_RECEIVE_CALLBACK(HANDLE, FUC) (HANDLE)->receive_callback = FUC
/**
* @}
*/
/**
* @defgroup ds3231_base_driver ds3231 base driver function
* @brief ds3231 base driver modules
* @ingroup ds3231_driver
* @{
*/
/**
* @brief get chip's information
* @param[out] *info points to a ds3231 info structure
* @return status code
* - 0 success
* - 2 handle is NULL
* @note none
*/
uint8_t ds3231_info(ds3231_info_t *info);
/**
* @brief initialize the chip
* @param[in] *handle points to a ds3231 handle structure
* @return status code
* - 0 success
* - 1 iic initialization failed
* - 2 handle is NULL
* - 3 linked functions is NULL
* @note none
*/
uint8_t ds3231_init(ds3231_handle_t *handle);
/**
* @brief close the chip
* @param[in] *handle points to a ds3231 handle structure
* @return status code
* - 0 success
* - 1 iic deinit failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_deinit(ds3231_handle_t *handle);
/**
* @brief irq handler
* @param[in] *handle points to a ds3231 handle structure
* @return status code
* - 0 success
* - 1 run failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_irq_handler(ds3231_handle_t *handle);
/**
* @brief set the current time
* @param[in] *handle points to a ds3231 handle structure
* @param[in] *t points to a time structure
* @return status code
* - 0 success
* - 1 set time failed
* - 2 handle or time is NULL
* - 3 handle is not initialized
* - 4 time is invalid
* @note none
*/
uint8_t ds3231_set_time(ds3231_handle_t *handle, ds3231_time_t *t);
/**
* @brief get the current time
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *t points to a time structure
* @return status code
* - 0 success
* - 1 get time failed
* - 2 handle or time is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_time(ds3231_handle_t *handle, ds3231_time_t *t);
/**
* @brief enable or disable the oscillator
* @param[in] *handle points to a ds3231 handle structure
* @param[in] enable is a bool value
* @return status code
* - 0 success
* - 1 set oscillator failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_oscillator(ds3231_handle_t *handle, ds3231_bool_t enable);
/**
* @brief get the chip oscillator status
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *enable points to a bool value buffer
* @return status code
* - 0 success
* - 1 get oscillator failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_oscillator(ds3231_handle_t *handle, ds3231_bool_t *enable);
/**
* @brief get the chip status
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *status points to a chip status buffer
* @return status code
* - 0 success
* - 1 get status failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_status(ds3231_handle_t *handle, uint8_t *status);
/**
* @}
*/
/**
* @defgroup ds3231_advance_driver ds3231 advance driver function
* @brief ds3231 advance driver modules
* @ingroup ds3231_driver
* @{
*/
/**
* @brief set the chip pin function
* @param[in] *handle points to a ds3231 handle structure
* @param[in] pin is the pin's function
* @return status code
* - 0 success
* - 1 set pin failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_pin(ds3231_handle_t *handle, ds3231_pin_t pin);
/**
* @brief get the chip pin function
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *pin points to a pin's function buffer
* @return status code
* - 0 success
* - 1 get pin failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_pin(ds3231_handle_t *handle, ds3231_pin_t *pin);
/**
* @brief enable or disable the square wave output
* @param[in] *handle points to a ds3231 handle structure
* @param[in] enable is a bool value
* @return status code
* - 0 success
* - 1 set square wave failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_square_wave(ds3231_handle_t *handle, ds3231_bool_t enable);
/**
* @brief get the square wave output status
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *enable points to a bool value buffer
* @return status code
* - 0 success
* - 1 get square wave failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_square_wave(ds3231_handle_t *handle, ds3231_bool_t *enable);
/**
* @brief enable or disable the 32KHz output
* @param[in] *handle points to a ds3231 handle structure
* @param[in] enable is a bool value
* @return status code
* - 0 success
* - 1 set 32khz output failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_32khz_output(ds3231_handle_t *handle, ds3231_bool_t enable);
/**
* @brief get the 32KHz output status
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *enable points to a bool value buffer
* @return status code
* - 0 success
* - 1 get 32khz output failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_32khz_output(ds3231_handle_t *handle, ds3231_bool_t *enable);
/**
* @brief get the chip temperature
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *raw points to a raw temperature buffer
* @param[out] *s points to a converted temperature buffer
* @return status code
* - 0 success
* - 1 get temperature failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_temperature(ds3231_handle_t *handle, int16_t *raw, float *s);
/**
* @brief set the chip aging offset
* @param[in] *handle points to a ds3231 handle structure
* @param[in] offset is time aging offset
* @return status code
* - 0 success
* - 1 set aging offset failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_aging_offset(ds3231_handle_t *handle, int8_t offset);
/**
* @brief get the chip aging offset
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *offset points to a time aging offset buffer
* @return status code
* - 0 success
* - 1 get aging offset failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_aging_offset(ds3231_handle_t *handle, int8_t *offset);
/**
* @brief convert a aging offset value to a register raw data
* @param[in] *handle points to a ds3231 handle structure
* @param[in] offset is a converted aging offset value
* @param[out] *reg points to a register raw buffer
* @return status code
* - 0 success
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_aging_offset_convert_to_register(ds3231_handle_t *handle, float offset, int8_t *reg);
/**
* @brief convert a register raw data to a converted aging offset data
* @param[in] *handle points to a ds3231 handle structure
* @param[in] reg is the register raw data
* @param[out] *offset points to a converted aging offset buffer
* @return status code
* - 0 success
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_aging_offset_convert_to_data(ds3231_handle_t *handle, int8_t reg, float *offset);
/**
* @}
*/
/**
* @defgroup ds3231_alarm_driver ds3231 alarm driver function
* @brief ds3231 alarm driver modules
* @ingroup ds3231_driver
* @{
*/
/**
* @brief enable or disable the alarm interrupt
* @param[in] *handle points to a ds3231 handle structure
* @param[in] alarm is the alarm number
* @param[in] enable is a bool value
* @return status code
* - 0 success
* - 1 set alarm interrupt failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_alarm_interrupt(ds3231_handle_t *handle, ds3231_alarm_t alarm, ds3231_bool_t enable);
/**
* @brief get the alarm interrupt status
* @param[in] *handle points to a ds3231 handle structure
* @param[in] alarm is the alarm number
* @param[out] *enable points to a bool value buffer
* @return status code
* - 0 success
* - 1 get alarm interrupt failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_alarm_interrupt(ds3231_handle_t *handle, ds3231_alarm_t alarm, ds3231_bool_t *enable);
/**
* @brief set the alarm1 time
* @param[in] *handle points to a ds3231 handle structure
* @param[in] *t points to a time structure
* @param[in] mode is the alarm1 interrupt mode
* @return status code
* - 0 success
* - 1 set alarm1 failed
* - 2 handle or time is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_alarm1(ds3231_handle_t *handle, ds3231_time_t *t, ds3231_alarm1_mode_t mode);
/**
* @brief get the alarm1 time
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *t points to a time structure
* @param[out] *mode points to an alarm1 interrupt mode buffer
* @return status code
* - 0 success
* - 1 get alarm1 failed
* - 2 handle or time is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_alarm1(ds3231_handle_t *handle, ds3231_time_t *t, ds3231_alarm1_mode_t *mode);
/**
* @brief set the alarm2 time
* @param[in] *handle points to a ds3231 handle structure
* @param[in] *t points to a time structure
* @param[in] mode is the alarm2 interrupt mode
* @return status code
* - 0 success
* - 1 set alarm2 failed
* - 2 handle or time is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_alarm2(ds3231_handle_t *handle, ds3231_time_t *t, ds3231_alarm2_mode_t mode);
/**
* @brief get the alarm2 time
* @param[in] *handle points to a ds3231 handle structure
* @param[out] *t points to a time structure
* @param[out] *mode points to an alarm2 interrupt mode buffer
* @return status code
* - 0 success
* - 1 get alarm2 failed
* - 2 handle or time is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_alarm2(ds3231_handle_t *handle, ds3231_time_t *t, ds3231_alarm2_mode_t *mode);
/**
* @brief clear the alarm flag
* @param[in] *handle points to a ds3231 handle structure
* @param[in] alarm is the alarm number
* @return status code
* - 0 success
* - 1 alarm clear failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_alarm_clear(ds3231_handle_t *handle, ds3231_alarm_t alarm);
/**
* @}
*/
/**
* @defgroup ds3231_extern_driver ds3231 extern driver function
* @brief ds3231 extern driver modules
* @ingroup ds3231_driver
* @{
*/
/**
* @brief set the chip register
* @param[in] *handle points to a ds3231 handle structure
* @param[in] reg is the iic register address
* @param[in] *buf points to a data buffer
* @param[in] len is the data buffer length
* @return status code
* - 0 success
* - 1 write failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_set_reg(ds3231_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len);
/**
* @brief get the chip register
* @param[in] *handle points to a ds3231 handle structure
* @param[in] reg is the iic register address
* @param[out] *buf points to a data buffer
* @param[in] len is the data buffer length
* @return status code
* - 0 success
* - 1 read failed
* - 2 handle is NULL
* - 3 handle is not initialized
* @note none
*/
uint8_t ds3231_get_reg(ds3231_handle_t *handle, uint8_t reg, uint8_t *buf, uint16_t len);
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif