Arduino-RTC
Real-Time Clock (RTC) library for Arduino
DS1302.h
Go to the documentation of this file.
1 
19 #ifndef DS1302_H
20 #define DS1302_H
21 
22 #include "GPIO.h"
23 #include "RTC.h"
24 
25 #ifndef CHARBITS
26 #define CHARBITS 8
27 #endif
28 
52 template<BOARD::pin_t CS_PIN, BOARD::pin_t SDA_PIN, BOARD::pin_t CLK_PIN>
53 class DS1302 {
54 public:
56  static const size_t RAM_MAX = 31;
57 
63  {
64  m_cs.output();
65  m_cs.low();
66  m_sda.output();
67  m_clk.output();
68  m_clk.low();
69  }
70 
76  void get_time(struct tm& now)
77  {
78  // Burst read clock and calender from device
79  rtc_t rtc;
80  m_cs.high();
81  write(RTC_BURST | READ);
82  m_sda.input();
83  uint8_t* rp = (uint8_t*) &rtc;
84  for (size_t i = 0; i < sizeof(rtc); i++, rp++)
85  *rp = read();
86  m_sda.output();
87  m_cs.low();
88 
89  // Convert to standard time structure
90  now.tm_sec = rtc.seconds;
91  now.tm_min = rtc.minutes;
92  now.tm_hour = rtc.hours;
93  now.tm_mday = rtc.date;
94  now.tm_wday = rtc.day - 1;
95  now.tm_mon = rtc.month - 1;
96  now.tm_year = rtc.year + 100;
97  }
98 
104  void set_time(struct tm& now)
105  {
106  // Convert from standard time structure, and add write disable
107  rtc_t rtc;
108  rtc.seconds = now.tm_sec;
109  rtc.minutes = now.tm_min;
110  rtc.hours = now.tm_hour;
111  rtc.date = now.tm_mday;
112  rtc.day = now.tm_wday + 1;
113  rtc.month = now.tm_mon + 1;
114  rtc.year = now.tm_year - 100;
115  rtc.wp = 0x80;
116 
117  // Burst write clock and calender to device
118  write_enable();
119  m_cs.high();
120  write(RTC_BURST | WRITE);
121  uint8_t* rp = (uint8_t*) &rtc;
122  for (size_t i = 0; i < sizeof(rtc); i++, rp++)
123  write(*rp);
124  m_cs.low();
125  }
126 
131  __attribute__((always_inline))
132  {
133  write(WP, 0x00);
134  }
135 
140  __attribute__((always_inline))
141  {
142  write(WP, 0x80);
143  }
144 
149  uint8_t read_ram(uint8_t addr)
150  __attribute__((always_inline))
151  {
152  return (read(RAM_START | (addr & ADDR_MASK)));
153  }
154 
161  void write_ram(uint8_t addr, uint8_t data)
162  __attribute__((always_inline))
163  {
164  write(RAM_START | (addr & ADDR_MASK), data);
165  }
166 
173  void read_ram(void* buf, size_t size)
174  {
175  if (size == 0) return;
176  uint8_t* bp = (uint8_t*) buf;
177  if (size > RAM_MAX) size = RAM_MAX;
178  m_cs.high();
179  write(RAM_BURST | READ);
180  m_sda.input();
181  do *bp++ = read(); while (--size);
182  m_sda.output();
183  m_cs.low();
184  }
185 
193  void write_ram(void* buf, size_t size)
194  {
195  if (size == 0) return;
196  uint8_t* bp = (uint8_t*) buf;
197  if (size > RAM_MAX) size = RAM_MAX;
198  write_enable();
199  m_cs.high();
200  write(RAM_BURST | WRITE);
201  do write(*bp++); while (--size);
202  m_cs.low();
203  write_disable();
204  }
205 
206 protected:
208  static const uint8_t RAM_START = 32;
209 
211  static const uint8_t WP = 0x07;
212 
214  enum {
215  WRITE = 0x80,
216  READ = 0x81,
217  RTC_BURST = 0xbe,
218  RAM_BURST = 0xfe,
219  ADDR_MASK = 0x3f
220  } __attribute__((packed));
221 
225  struct rtc_t {
233  uint8_t wp;
234  } __attribute__((packed));
235 
236  GPIO<CS_PIN> m_cs;
237  GPIO<SDA_PIN> m_sda;
238  GPIO<CLK_PIN> m_clk;
239 
246  uint8_t read(uint8_t addr)
247  {
248  addr = ((addr << 1) | READ);
249  uint8_t res = 0;
250  m_cs.high();
251  write(addr);
252  m_sda.input();
253  res = read();
254  m_sda.output();
255  m_cs.low();
256  return (res);
257  }
258 
265  void write(uint8_t addr, uint8_t data)
266  {
267  addr = ((addr << 1) | WRITE);
268  m_cs.high();
269  write(addr);
270  write(data);
271  m_cs.low();
272  }
273 
280  uint8_t read()
281  {
282  uint8_t mask = 0x01;
283  uint8_t res = 0;
284  do {
285  res |= (m_sda ? mask : 0x00);
286  m_clk.toggle();
287  __asm__ __volatile__("nop");
288  mask <<= 1;
289  m_clk.toggle();
290  __asm__ __volatile__("nop");
291  } while (mask);
292  return (res);
293  }
294 
300  void write(uint8_t data)
301  {
302  uint8_t mask = 0x01;
303  do {
304  m_sda = data & mask;
305  __asm__ __volatile__("nop");
306  m_clk.toggle();
307  __asm__ __volatile__("nop");
308  mask <<= 1;
309  m_clk.toggle();
310  } while (mask);
311  }
312 };
313 
314 #endif
int8_t tm_mday
Day in Month [1-31].
Definition: time.h:40
int8_t tm_min
Minutes [0-59].
Definition: time.h:38
bcd_t seconds
00-59 Seconds.
Definition: DS1302.h:226
DS1302()
Definition: DS1302.h:62
Read/write bit in write mode.
Definition: DS1302.h:215
uint8_t read()
Definition: DS1302.h:280
RTC register burst transfer.
Definition: DS1302.h:217
void get_time(struct tm &now)
Definition: DS1302.h:76
uint8_t read(uint8_t addr)
Definition: DS1302.h:246
bcd_t minutes
00-59 Minutes.
Definition: DS1302.h:227
void read_ram(void *buf, size_t size)
Definition: DS1302.h:173
void write_ram(uint8_t addr, uint8_t data)
Definition: DS1302.h:161
GPIO< SDA_PIN > m_sda
Serial data, bidirectional.
Definition: DS1302.h:237
static const size_t RAM_MAX
Definition: DS1302.h:56
bcd_t hours
00-23 Hours.
Definition: DS1302.h:228
void write(uint8_t data)
Definition: DS1302.h:300
int16_t tm_year
Years since 1900.
Definition: time.h:43
int8_t tm_sec
Seconds [0-60].
Definition: time.h:37
DS1302< BOARD::D11, BOARD::D12, BOARD::D13 > rtc
Definition: RAM.ino:5
void set_time(struct tm &now)
Definition: DS1302.h:104
bcd_t date
01-31 Date.
Definition: DS1302.h:229
bcd_t year
00-99 Year.
Definition: DS1302.h:232
uint8_t wp
Write protect register.
Definition: DS1302.h:233
void write_disable()
Definition: DS1302.h:139
int8_t tm_hour
Hours [0-23].
Definition: time.h:39
uint8_t read_ram(uint8_t addr)
Definition: DS1302.h:149
int8_t tm_wday
Days since Sunday [0-6].
Definition: time.h:41
void write_ram(void *buf, size_t size)
Definition: DS1302.h:193
RAM burst transfer.
Definition: DS1302.h:218
Mask address bits.
Definition: DS1302.h:219
Definition: time.h:36
GPIO< CLK_PIN > m_clk
Clock for synchronized data.
Definition: DS1302.h:238
Read/write bit in read mode.
Definition: DS1302.h:216
void write_enable()
Definition: DS1302.h:130
static const uint8_t RAM_START
Definition: DS1302.h:208
GPIO< CS_PIN > m_cs
Chip select, asserted high.
Definition: DS1302.h:236
int8_t tm_mon
0-11 Months since January [0-11].
Definition: time.h:42
Definition: DS1302.h:53
void write(uint8_t addr, uint8_t data)
Definition: DS1302.h:265
bcd_t month
01-12 Month.
Definition: DS1302.h:230
Definition: bcd.h:25
bcd_t day
01-07 Day.
Definition: DS1302.h:231
static const uint8_t WP
Definition: DS1302.h:211