|
@@ -0,0 +1,144 @@
|
|
|
+#include "main.h"
|
|
|
+
|
|
|
+/* Private defines & macro */
|
|
|
+/* i2c slave address of the DS3231 chip */
|
|
|
+#define DS3231_I2C_ADDR 0xD0
|
|
|
+
|
|
|
+/* timekeeping registers */
|
|
|
+#define DS3231_ADDR_TIME 0x00
|
|
|
+#define DS3231_ADDR_CALENDAR 0x03
|
|
|
+#define DS3231_ADDR_ALARM1 0x07
|
|
|
+#define DS3231_ADDR_ALARM2 0x0B
|
|
|
+#define DS3231_ADDR_CONTROL 0x0E
|
|
|
+#define DS3231_ADDR_STATUS 0x0F
|
|
|
+#define DS3231_ADDR_AGING_OFFSET 0x10
|
|
|
+#define DS3231_ADDR_TEMPERATURE 0x11
|
|
|
+
|
|
|
+/* control register bits */
|
|
|
+#define DS3231_A1IE 0x01
|
|
|
+#define DS3231_A2IE 0x02
|
|
|
+#define DS3231_INTCN 0x04
|
|
|
+#define DS3231_RS1 0x08
|
|
|
+#define DS3231_RS2 0x10
|
|
|
+#define DS3231_CONV 0x20
|
|
|
+#define DS3231_BBSQW 0x40
|
|
|
+#define DS3231_OSC_OSC 0x80
|
|
|
+
|
|
|
+/* control/status register bits */
|
|
|
+#define DS3231_A1F 0x01
|
|
|
+#define DS3231_A2F 0x02
|
|
|
+#define DS3231_BSY 0x04
|
|
|
+#define DS3231_EN32kHz 0x08
|
|
|
+#define DS3231_OSF 0x80
|
|
|
+
|
|
|
+/* square-wave output frequency */
|
|
|
+#define DS3231_1HZ 0x00
|
|
|
+#define DS3231_1024HZ DS3231_RS1
|
|
|
+#define DS3231_4096HZ DS3231_RS2
|
|
|
+#define DS3231_8192HZ (DS3231_RS1 | DS3231_RS2)
|
|
|
+
|
|
|
+/* number of bytes */
|
|
|
+#define DS3231_SIZE_TIME 3
|
|
|
+#define DS3231_SIZE_CALENDAR 4
|
|
|
+#define DS3231_SIZE_ALARM1 4
|
|
|
+#define DS3231_SIZE_ALARM2 3
|
|
|
+#define DS3231_SIZE_CONTROL 1
|
|
|
+#define DS3231_SIZE_STATUS 1
|
|
|
+#define DS3231_SIZE_AGOFFS 1
|
|
|
+#define DS3231_SIZE_TEMPERATURE 2
|
|
|
+#define DS3231_SIZE_ALL 19
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Initialization DS3231
|
|
|
+ */
|
|
|
+void RTC_Init(void) {
|
|
|
+ uint8_t buf[3] = {0};
|
|
|
+
|
|
|
+ /* Clear flags */
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ buf[0] = DS3231_1HZ; // set 1 Hz output squware
|
|
|
+ buf[1] = 0x0; // disable 32 kHz output
|
|
|
+
|
|
|
+ user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_CONTROL, buf, 2);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Reading all registers DS3231
|
|
|
+ */
|
|
|
+void RTC_ReadAll(rtc_t * data) {
|
|
|
+ Flag.I2C_RX_End = 0;
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ user_i2c_read(DS3231_I2C_ADDR, DS3231_ADDR_TIME, (uint8_t *)data, DS3231_SIZE_ALL);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Read Time "SS:MM:HH"
|
|
|
+ */
|
|
|
+void RTC_ReadTime(rtc_t * data) {
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ user_i2c_read(DS3231_I2C_ADDR, DS3231_ADDR_TIME, &(data->Sec), DS3231_SIZE_TIME);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Save time and calendar "SS:MM:HH wd dd/mm/yy"
|
|
|
+ */
|
|
|
+void RTC_WriteTimeCalendar(rtc_t * data) {
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_TIME, &(data->Sec), (DS3231_SIZE_TIME + DS3231_SIZE_CALENDAR));
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Save Time "SS:MM:HH"
|
|
|
+ */
|
|
|
+void RTC_WriteTime(rtc_t * data) {
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_TIME, &(data->Sec), DS3231_SIZE_TIME);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Save hours "HH"
|
|
|
+ */
|
|
|
+void RTC_WriteHH(rtc_t * data) {
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ user_i2c_write(DS3231_I2C_ADDR, (DS3231_ADDR_TIME + 2), &(data->Hr), 1);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Save hours & minutes "MM:HH"
|
|
|
+ */
|
|
|
+void RTC_WriteHHMM(rtc_t * data) {
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ user_i2c_write(DS3231_I2C_ADDR, (DS3231_ADDR_TIME + 1), &(data->Min), 2);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Save calendar "wd dd/mm/yy"
|
|
|
+ */
|
|
|
+void RTC_WriteCalendar(rtc_t * data) {
|
|
|
+ Flag.I2C_TX_End = 0;
|
|
|
+
|
|
|
+ user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_CALENDAR, &(data->WD), DS3231_SIZE_CALENDAR);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Convert BCD value to Binary
|
|
|
+ */
|
|
|
+uint8_t bcd2bin(uint8_t bcd)
|
|
|
+{
|
|
|
+ return (10 * (bcd >> 4) + (bcd & 0x0f));
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Convert Binary value to BCD
|
|
|
+ */
|
|
|
+uint8_t bin2bcd(uint8_t bin)
|
|
|
+{
|
|
|
+ return (((bin / 10 ) << 4) | (bin % 10));
|
|
|
+}
|