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 37 #define RTC_DS1307_EEPROM_ADDR 0x50 38 #define RTC_DS1307_EEPROM_SIZE 4096 40 void rtc_ds1307_setup(void) 48 uint8_t data[1] = {0};
49 const uint8_t address[] = {0x00};
58 uint16_t to_return = 0;
59 uint8_t data[1] = {0};
60 const uint16_t rtc_ds1307_rs[] = {1, 4096, 8192, 32768};
61 const uint8_t address[] = {0x07};
66 to_return = rtc_ds1307_rs[data[0]&0x03];
75 uint8_t to_return = 0;
76 uint8_t data[1] = {0};
77 const uint8_t address[] = {0x00};
81 to_return = ((data[0]&0x70)>>4)*10+(data[0]&0x0f);
87 uint8_t to_return = 0;
88 uint8_t data[1] = {0};
89 const uint8_t address[] = {0x01};
93 to_return = (data[0]>>4)*10+(data[0]&0x0f);
99 uint8_t to_return = 0;
100 uint8_t data[1] = {0};
101 const uint8_t address[] = {0x02};
109 to_return += ((data[0]&0x10)>>4)*10;
111 to_return = ((data[0]&0x30)>>4)*10;
113 to_return += (data[0]&0x0f);
119 uint8_t to_return = 0;
120 uint8_t data[1] = {0};
121 const uint8_t address[] = {0x03};
125 to_return = (data[0]&0x07);
131 uint8_t to_return = 0;
132 uint8_t data[1] = {0};
133 const uint8_t address[] = {0x04};
137 to_return = ((data[0]&0x30)>>4)*10+(data[0]&0x0f);
143 uint8_t to_return = 0;
144 uint8_t data[1] = {0};
145 const uint8_t address[] = {0x05};
149 to_return = ((data[0]&0x10)>>4)*10+(data[0]&0x0f);
155 uint8_t data[1] = {0};
156 const uint8_t address[] = {0x06};
160 uint8_t to_return = ((data[0]&0xf0)>>4)*10+(data[0]&0x0f);
166 static uint8_t time[7] = {0};
167 uint8_t data[7] = {0};
168 const uint8_t address[] = {0x00};
172 time[0] = ((data[0]&0x70)>>4)*10+(data[0]&0x0f);
173 time[1] = (data[1]>>4)*10+(data[1]&0x0f);
179 time[2] += ((data[2]&0x10)>>4)*10;
181 time[2] = ((data[2]&0x30)>>4)*10;
183 time[2] += (data[2]&0x0f);
184 time[3] = (data[3]&0x07);
185 time[4] = ((data[4]&0x30)>>4)*10+(data[4]&0x0f);
186 time[5] = ((data[5]&0x10)>>4)*10+(data[5]&0x0f);
187 time[6] = ((data[6]&0xf0)>>4)*10+(data[6]&0x0f);
194 if (data==NULL || length==0) {
197 if (start>55 || start+length>56) {
201 const uint8_t address[] = {0x08+start};
208 if (data==NULL || length==0) {
215 const uint8_t address[] = {start>>8, start};
221 uint8_t data[1] = {0};
222 const uint8_t address[] = {0x00};
232 uint8_t data[1] = {0};
233 const uint8_t address[] = {0x00};
243 uint8_t data[1] = {0};
263 const uint8_t address[] = {0x07};
272 uint8_t data[1] = {0};
273 const uint8_t address[] = {0x00};
278 data[0] |= (((seconds/10)%6)<<4)+(seconds%10);
288 uint8_t data[1] = {0};
289 data[0] = (((minutes/10)%6)<<4)+(minutes%10);
291 const uint8_t address[] = {0x01};
300 uint8_t data[1] = {0};
301 data[0] = (((hours/10)%3)<<4)+(hours%10);
303 const uint8_t address[] = {0x02};
309 if (day<1 || day>7) {
312 uint8_t data[1] = {0};
315 const uint8_t address[] = {0x03};
321 if (date<1 || date>31) {
324 uint8_t data[1] = {0};
325 data[0] = (((date/10)%4)<<4)+(date%10);
327 const uint8_t address[] = {0x04};
333 if (month<1 || month>12) {
336 uint8_t data[1] = {0};
337 data[0] = (((month/10)%2)<<4)+(month%10);
339 const uint8_t address[] = {0x05};
348 uint8_t data[1] = {0};
349 data[0] = (((year/10)%10)<<4)+(year%10);
351 const uint8_t address[] = {0x06};
355 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)
357 uint8_t data[7] = {0};
358 const uint8_t address[] = {0x00};
367 data[0] |= (((seconds/10)%6)<<4)+(seconds%10);
372 data[1] = (((minutes/10)%6)<<4)+(minutes%10);
377 data[2] = (((hours/10)%3)<<4)+(hours%10);
379 if (day<1 || day>7) {
384 if (date<1 || date>31) {
387 data[4] = (((date/10)%4)<<4)+(date%10);
389 if (month<1 || month>12) {
392 data[5] = (((month/10)%2)<<4)+(month%10);
397 data[6] = (((year/10)%10)<<4)+(year%10);
405 if (data==NULL || length==0) {
408 if (start>55 || start+length>56) {
411 const uint8_t address[] = {0x08+start};
418 if (data==NULL || length==0) {
427 const uint8_t address[] = {start>>8, 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_rom(uint16_t start, uint8_t *data, uint8_t length)
write to ROM on AT24Cxx EEPROM
bool rtc_ds1307_write_year(uint8_t year)
write year into RTC IC
#define RTC_DS1307_EEPROM_SIZE
EEPROM size in bytes (32kb/4096B for AT24C32, 32kb/8192B for AT24C64)
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)
bool rtc_ds1307_write_ram(uint8_t start, uint8_t *data, uint8_t length)
write to user RAM on RTC IC
#define RTC_DS1307_EEPROM_ADDR
AT24C32 EEPROM I2C address (0b1010xxx, xxx settable using pins), often also present on tiny RTC modul...
global definitions and methods (API)
uint8_t rtc_ds1307_read_month(void)
read month from RTC IC
bool i2c_master_read(uint8_t slave, const uint8_t *address, size_t address_size, uint8_t *data, size_t data_size)
read from I2C slave
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_seconds(uint8_t seconds)
write seconds into RTC IC
bool rtc_ds1307_read_rom(uint16_t start, uint8_t *data, uint16_t length)
read ROM from AT24Cxx EEPROM
bool rtc_ds1307_read_ram(uint8_t start, uint8_t *data, uint8_t length)
read user RAM from RTC IC
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
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
bool i2c_master_write(uint8_t slave, const uint8_t *address, size_t address_size, const uint8_t *data, size_t data_size)
write to I2C slave
uint8_t rtc_ds1307_read_minutes(void)
read minutes from RTC IC