28 #include <libopencm3/stm32/rcc.h> 29 #include <libopencm3/stm32/gpio.h> 30 #include <libopencm3/stm32/i2c.h> 36 #define RTC_DS1307_I2C_ADDR 0x68 38 void rtc_ds1307_setup(void) 46 uint8_t data[1] = {0};
47 const uint8_t address[] = {0x00};
56 uint16_t to_return = 0;
57 uint8_t data[1] = {0};
58 const uint16_t rtc_ds1307_rs[] = {1, 4096, 8192, 32768};
59 const uint8_t address[] = {0x07};
64 to_return = rtc_ds1307_rs[data[0]&0x03];
73 uint8_t to_return = 0;
74 uint8_t data[1] = {0};
75 const uint8_t address[] = {0x00};
79 to_return = ((data[0]&0x70)>>4)*10+(data[0]&0x0f);
85 uint8_t to_return = 0;
86 uint8_t data[1] = {0};
87 const uint8_t address[] = {0x01};
91 to_return = (data[0]>>4)*10+(data[0]&0x0f);
97 uint8_t to_return = 0;
98 uint8_t data[1] = {0};
99 const uint8_t address[] = {0x02};
107 to_return += ((data[0]&0x10)>>4)*10;
109 to_return = ((data[0]&0x30)>>4)*10;
111 to_return += (data[0]&0x0f);
117 uint8_t to_return = 0;
118 uint8_t data[1] = {0};
119 const uint8_t address[] = {0x03};
123 to_return = (data[0]&0x07);
129 uint8_t to_return = 0;
130 uint8_t data[1] = {0};
131 const uint8_t address[] = {0x04};
135 to_return = ((data[0]&0x30)>>4)*10+(data[0]&0x0f);
141 uint8_t to_return = 0;
142 uint8_t data[1] = {0};
143 const uint8_t address[] = {0x05};
147 to_return = ((data[0]&0x10)>>4)*10+(data[0]&0x0f);
153 uint8_t data[1] = {0};
154 const uint8_t address[] = {0x06};
158 uint8_t to_return = ((data[0]&0xf0)>>4)*10+(data[0]&0x0f);
164 static uint8_t time[7] = {0};
165 uint8_t data[7] = {0};
166 const uint8_t address[] = {0x00};
170 time[0] = ((data[0]&0x70)>>4)*10+(data[0]&0x0f);
171 time[1] = (data[1]>>4)*10+(data[1]&0x0f);
177 time[2] += ((data[2]&0x10)>>4)*10;
179 time[2] = ((data[2]&0x30)>>4)*10;
181 time[2] += (data[2]&0x0f);
182 time[3] = (data[3]&0x07);
183 time[4] = ((data[4]&0x30)>>4)*10+(data[4]&0x0f);
184 time[5] = ((data[5]&0x10)>>4)*10+(data[5]&0x0f);
185 time[6] = ((data[6]&0xf0)>>4)*10+(data[6]&0x0f);
192 if (data==NULL || length==0) {
195 if (start>55 || start+length>56) {
199 const uint8_t address[] = {0x08+start};
205 uint8_t data[1] = {0};
206 const uint8_t address[] = {0x00};
216 uint8_t data[1] = {0};
217 const uint8_t address[] = {0x00};
227 uint8_t data[1] = {0};
247 const uint8_t address[] = {0x07};
256 uint8_t data[1] = {0};
257 const uint8_t address[] = {0x00};
262 data[0] |= (((seconds/10)%6)<<4)+(seconds%10);
272 uint8_t data[1] = {0};
273 data[0] = (((minutes/10)%6)<<4)+(minutes%10);
275 const uint8_t address[] = {0x01};
284 uint8_t data[1] = {0};
285 data[0] = (((hours/10)%3)<<4)+(hours%10);
287 const uint8_t address[] = {0x02};
293 if (day<1 || day>7) {
296 uint8_t data[1] = {0};
299 const uint8_t address[] = {0x03};
305 if (date<1 || date>31) {
308 uint8_t data[1] = {0};
309 data[0] = (((date/10)%4)<<4)+(date%10);
311 const uint8_t address[] = {0x04};
317 if (month<1 || month>12) {
320 uint8_t data[1] = {0};
321 data[0] = (((month/10)%2)<<4)+(month%10);
323 const uint8_t address[] = {0x05};
332 uint8_t data[1] = {0};
333 data[0] = (((year/10)%10)<<4)+(year%10);
335 const uint8_t address[] = {0x06};
339 bool rtc_ds1307_write_time(uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t day, uint8_t date, uint8_t month, uint8_t year)
341 uint8_t data[7] = {0};
342 const uint8_t address[] = {0x00};
351 data[0] |= (((seconds/10)%6)<<4)+(seconds%10);
356 data[1] = (((minutes/10)%6)<<4)+(minutes%10);
361 data[2] = (((hours/10)%3)<<4)+(hours%10);
363 if (day<1 || day>7) {
368 if (date<1 || date>31) {
371 data[4] = (((date/10)%4)<<4)+(date%10);
373 if (month<1 || month>12) {
376 data[5] = (((month/10)%2)<<4)+(month%10);
381 data[6] = (((year/10)%10)<<4)+(year%10);
389 if (data==NULL || length==0) {
392 if (start>55 || start+length>56) {
395 const uint8_t address[] = {0x08+start};
library to communicate using I2C as master (API)
bool rtc_ds1307_write_date(uint8_t date)
write date into RTC IC
bool rtc_ds1307_write_time(uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t day, uint8_t date, uint8_t month, uint8_t year)
write time into RTC IC
bool rtc_ds1307_write_year(uint8_t year)
write year into RTC IC
bool rtc_ds1307_oscillator_enable(void)
enable RTC IC oscillator
uint16_t rtc_ds1307_read_square_wave(void)
read square wave output frequency (in Hz)
bool rtc_ds1307_write_month(uint8_t month)
write month into RTC IC
bool rtc_ds1307_write_minutes(uint8_t minutes)
write minutes into RTC IC
#define RTC_DS1307_I2C_ADDR
DS1307 I2C address (fixed to 0b1101000)
global definitions and methods (API)
uint8_t rtc_ds1307_read_month(void)
read month from RTC IC
bool rtc_ds1307_read_ram(uint8_t *data, uint8_t start, uint8_t length)
read user RAM from RTC IC
uint8_t rtc_ds1307_read_year(void)
read year from RTC IC
uint8_t * rtc_ds1307_read_time(void)
read time from RTC IC
uint8_t rtc_ds1307_read_seconds(void)
read seconds from RTC IC
bool rtc_ds1307_oscillator_disable(void)
disable RTC IC oscillator
bool rtc_ds1307_write_day(uint8_t day)
write day into RTC IC
bool rtc_ds1307_write_hours(uint8_t hours)
write hours into RTC IC
uint8_t rtc_ds1307_read_date(void)
read date from RTC IC
bool rtc_ds1307_write_ram(uint8_t *data, uint8_t start, uint8_t length)
write user RAM from RTC IC
bool rtc_ds1307_write_seconds(uint8_t seconds)
write seconds into RTC IC
bool i2c_master_read(uint8_t *data, size_t data_size)
read data
void i2c_master_setup(bool fast)
setup I2C peripheral
uint8_t rtc_ds1307_read_day(void)
read day from RTC IC
#define LENGTH(x)
get the length of an array
bool rtc_ds1307_oscillator_disabled(void)
verify if oscillator is disabled
bool i2c_master_write(const uint8_t *data, size_t data_size)
write data
library to communicate with the Maxim DS1307 I2C RTC IC (API)
bool rtc_ds1307_write_square_wave(uint16_t frequency)
write square wave output frequency (in Hz)
uint8_t rtc_ds1307_read_hours(void)
read hours from RTC IC
uint8_t rtc_ds1307_read_minutes(void)
read minutes from RTC IC