Adafruit_RTCLib

Fork of Adafruit_RTCLib by Neal Horman

Committer:
nkhorman
Date:
Tue Jul 17 05:49:20 2012 +0000
Revision:
0:7f90c8e04249
Child:
1:2c4e81ecda67
land the adafruit rtc library with changes for LPC1768

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nkhorman 0:7f90c8e04249 1 // Code by JeeLabs http://news.jeelabs.org/code/
nkhorman 0:7f90c8e04249 2 // Released to the public domain! Enjoy!
nkhorman 0:7f90c8e04249 3
nkhorman 0:7f90c8e04249 4 /*
nkhorman 0:7f90c8e04249 5 * Taken from https://github.com/adafruit/RTClib
nkhorman 0:7f90c8e04249 6 * and modified for LPC1768 by Neal Horman July 2012
nkhorman 0:7f90c8e04249 7 */
nkhorman 0:7f90c8e04249 8
nkhorman 0:7f90c8e04249 9 #include "mbed.h"
nkhorman 0:7f90c8e04249 10 #include "DS1307.h"
nkhorman 0:7f90c8e04249 11
nkhorman 0:7f90c8e04249 12 #define DS1307_ADDRESS 0xD0
nkhorman 0:7f90c8e04249 13
nkhorman 0:7f90c8e04249 14 ////////////////////////////////////////////////////////////////////////////////
nkhorman 0:7f90c8e04249 15 // RtcDs1307 implementation
nkhorman 0:7f90c8e04249 16
nkhorman 0:7f90c8e04249 17 static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
nkhorman 0:7f90c8e04249 18 static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
nkhorman 0:7f90c8e04249 19
nkhorman 0:7f90c8e04249 20 RtcDs1307::RtcDs1307(I2C &i2c) : mI2c(i2c)
nkhorman 0:7f90c8e04249 21 {
nkhorman 0:7f90c8e04249 22 mRam[0]=8;
nkhorman 0:7f90c8e04249 23 if(mI2c.write(DS1307_ADDRESS,(const char *)&mRam[0],1,true) == 0)
nkhorman 0:7f90c8e04249 24 mI2c.read(DS1307_ADDRESS,(char *)&mRam[1],sizeof(mRam)-1);
nkhorman 0:7f90c8e04249 25 else
nkhorman 0:7f90c8e04249 26 memset(mRam,0,sizeof(mRam));
nkhorman 0:7f90c8e04249 27 }
nkhorman 0:7f90c8e04249 28
nkhorman 0:7f90c8e04249 29 bool RtcDs1307::commit()
nkhorman 0:7f90c8e04249 30 {
nkhorman 0:7f90c8e04249 31 mRam[0] = 8; // device register address
nkhorman 0:7f90c8e04249 32 return (mI2c.write(DS1307_ADDRESS,(const char *)mRam,sizeof(mRam)) == 0);
nkhorman 0:7f90c8e04249 33 }
nkhorman 0:7f90c8e04249 34
nkhorman 0:7f90c8e04249 35 bool RtcDs1307::isRunning()
nkhorman 0:7f90c8e04249 36 { uint8_t i = 0;
nkhorman 0:7f90c8e04249 37
nkhorman 0:7f90c8e04249 38 return (mI2c.write(DS1307_ADDRESS,(const char *)&i,sizeof(i),true) == 0
nkhorman 0:7f90c8e04249 39 && mI2c.read(DS1307_ADDRESS,(char *)&i,sizeof(i)) == 0
nkhorman 0:7f90c8e04249 40 && (i&0x80) == 0
nkhorman 0:7f90c8e04249 41 );
nkhorman 0:7f90c8e04249 42 }
nkhorman 0:7f90c8e04249 43
nkhorman 0:7f90c8e04249 44 bool RtcDs1307::adjust(const DateTime& dt)
nkhorman 0:7f90c8e04249 45 { uint8_t buf[9] =
nkhorman 0:7f90c8e04249 46 {
nkhorman 0:7f90c8e04249 47 0 // device register address
nkhorman 0:7f90c8e04249 48 ,bin2bcd(dt.second()&0x7F) // make sure bit 7 (CH - Clock Halt) is off or the clock will be stopped
nkhorman 0:7f90c8e04249 49 ,bin2bcd(dt.minute())
nkhorman 0:7f90c8e04249 50 ,bin2bcd(dt.hour()&0x3F) // force 24h mode
nkhorman 0:7f90c8e04249 51 ,bin2bcd(0)
nkhorman 0:7f90c8e04249 52 ,bin2bcd(dt.day())
nkhorman 0:7f90c8e04249 53 ,bin2bcd(dt.month())
nkhorman 0:7f90c8e04249 54 ,bin2bcd(dt.year() - 2000)
nkhorman 0:7f90c8e04249 55 ,0 // turn off SQWO
nkhorman 0:7f90c8e04249 56 };
nkhorman 0:7f90c8e04249 57
nkhorman 0:7f90c8e04249 58 return (mI2c.write(DS1307_ADDRESS,(const char *)buf,sizeof(buf)) == 0);
nkhorman 0:7f90c8e04249 59 }
nkhorman 0:7f90c8e04249 60
nkhorman 0:7f90c8e04249 61 DateTime RtcDs1307::now()
nkhorman 0:7f90c8e04249 62 { uint8_t buf[7] = {0};
nkhorman 0:7f90c8e04249 63
nkhorman 0:7f90c8e04249 64 if(mI2c.write(DS1307_ADDRESS,(const char *)&buf[0],1,true) == 0)
nkhorman 0:7f90c8e04249 65 mI2c.read(DS1307_ADDRESS,(char *)buf,sizeof(buf));
nkhorman 0:7f90c8e04249 66
nkhorman 0:7f90c8e04249 67 return DateTime (
nkhorman 0:7f90c8e04249 68 bcd2bin(buf[6]) + 2000 // y
nkhorman 0:7f90c8e04249 69 ,bcd2bin(buf[5]) // m
nkhorman 0:7f90c8e04249 70 ,bcd2bin(buf[4]) // d
nkhorman 0:7f90c8e04249 71 ,bcd2bin(buf[2] & 0x3F) // hh - mask off 24h mode
nkhorman 0:7f90c8e04249 72 ,bcd2bin(buf[1]) // mm
nkhorman 0:7f90c8e04249 73 ,bcd2bin(buf[0] & 0x7F) // ss - mask off CH - Clock Halt
nkhorman 0:7f90c8e04249 74 );
nkhorman 0:7f90c8e04249 75 }