Updated Adafruit Library

Fork of Adafruit_RTCLib by Neal Horman

Committer:
arsenalist
Date:
Thu Jun 08 15:26:26 2017 +0000
Revision:
2:f372b273d88f
Parent:
1:2c4e81ecda67
Use SoftI2C

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 1:2c4e81ecda67 7 * Also add support for access to the 56 bytes of
nkhorman 1:2c4e81ecda67 8 * user accessible battery backed ram.
nkhorman 0:7f90c8e04249 9 */
nkhorman 0:7f90c8e04249 10
nkhorman 0:7f90c8e04249 11 #include "mbed.h"
nkhorman 0:7f90c8e04249 12 #include "DS1307.h"
nkhorman 0:7f90c8e04249 13
nkhorman 0:7f90c8e04249 14 #define DS1307_ADDRESS 0xD0
nkhorman 0:7f90c8e04249 15
nkhorman 0:7f90c8e04249 16 ////////////////////////////////////////////////////////////////////////////////
nkhorman 0:7f90c8e04249 17 // RtcDs1307 implementation
nkhorman 0:7f90c8e04249 18
nkhorman 0:7f90c8e04249 19 static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
nkhorman 0:7f90c8e04249 20 static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
nkhorman 0:7f90c8e04249 21
arsenalist 2:f372b273d88f 22 RtcDs1307::RtcDs1307(SoftI2C &i2c) : mI2c(i2c)
nkhorman 0:7f90c8e04249 23 {
nkhorman 1:2c4e81ecda67 24 // Read the RTC ram into the object RAM image
nkhorman 0:7f90c8e04249 25 mRam[0]=8;
nkhorman 0:7f90c8e04249 26 if(mI2c.write(DS1307_ADDRESS,(const char *)&mRam[0],1,true) == 0)
nkhorman 0:7f90c8e04249 27 mI2c.read(DS1307_ADDRESS,(char *)&mRam[1],sizeof(mRam)-1);
nkhorman 0:7f90c8e04249 28 else
nkhorman 0:7f90c8e04249 29 memset(mRam,0,sizeof(mRam));
nkhorman 0:7f90c8e04249 30 }
nkhorman 0:7f90c8e04249 31
nkhorman 0:7f90c8e04249 32 bool RtcDs1307::commit()
nkhorman 0:7f90c8e04249 33 {
nkhorman 0:7f90c8e04249 34 mRam[0] = 8; // device register address
nkhorman 0:7f90c8e04249 35 return (mI2c.write(DS1307_ADDRESS,(const char *)mRam,sizeof(mRam)) == 0);
nkhorman 0:7f90c8e04249 36 }
nkhorman 0:7f90c8e04249 37
nkhorman 0:7f90c8e04249 38 bool RtcDs1307::isRunning()
nkhorman 0:7f90c8e04249 39 { uint8_t i = 0;
nkhorman 0:7f90c8e04249 40
nkhorman 0:7f90c8e04249 41 return (mI2c.write(DS1307_ADDRESS,(const char *)&i,sizeof(i),true) == 0
nkhorman 0:7f90c8e04249 42 && mI2c.read(DS1307_ADDRESS,(char *)&i,sizeof(i)) == 0
nkhorman 0:7f90c8e04249 43 && (i&0x80) == 0
nkhorman 0:7f90c8e04249 44 );
nkhorman 0:7f90c8e04249 45 }
nkhorman 0:7f90c8e04249 46
nkhorman 0:7f90c8e04249 47 bool RtcDs1307::adjust(const DateTime& dt)
nkhorman 0:7f90c8e04249 48 { uint8_t buf[9] =
nkhorman 0:7f90c8e04249 49 {
nkhorman 0:7f90c8e04249 50 0 // device register address
nkhorman 0:7f90c8e04249 51 ,bin2bcd(dt.second()&0x7F) // make sure bit 7 (CH - Clock Halt) is off or the clock will be stopped
nkhorman 0:7f90c8e04249 52 ,bin2bcd(dt.minute())
nkhorman 0:7f90c8e04249 53 ,bin2bcd(dt.hour()&0x3F) // force 24h mode
nkhorman 0:7f90c8e04249 54 ,bin2bcd(0)
nkhorman 0:7f90c8e04249 55 ,bin2bcd(dt.day())
nkhorman 0:7f90c8e04249 56 ,bin2bcd(dt.month())
nkhorman 0:7f90c8e04249 57 ,bin2bcd(dt.year() - 2000)
nkhorman 0:7f90c8e04249 58 ,0 // turn off SQWO
nkhorman 0:7f90c8e04249 59 };
nkhorman 0:7f90c8e04249 60
nkhorman 0:7f90c8e04249 61 return (mI2c.write(DS1307_ADDRESS,(const char *)buf,sizeof(buf)) == 0);
nkhorman 0:7f90c8e04249 62 }
nkhorman 0:7f90c8e04249 63
nkhorman 0:7f90c8e04249 64 DateTime RtcDs1307::now()
nkhorman 0:7f90c8e04249 65 { uint8_t buf[7] = {0};
nkhorman 0:7f90c8e04249 66
nkhorman 0:7f90c8e04249 67 if(mI2c.write(DS1307_ADDRESS,(const char *)&buf[0],1,true) == 0)
nkhorman 0:7f90c8e04249 68 mI2c.read(DS1307_ADDRESS,(char *)buf,sizeof(buf));
nkhorman 0:7f90c8e04249 69
nkhorman 0:7f90c8e04249 70 return DateTime (
nkhorman 0:7f90c8e04249 71 bcd2bin(buf[6]) + 2000 // y
nkhorman 0:7f90c8e04249 72 ,bcd2bin(buf[5]) // m
nkhorman 0:7f90c8e04249 73 ,bcd2bin(buf[4]) // d
nkhorman 0:7f90c8e04249 74 ,bcd2bin(buf[2] & 0x3F) // hh - mask off 24h mode
nkhorman 0:7f90c8e04249 75 ,bcd2bin(buf[1]) // mm
nkhorman 0:7f90c8e04249 76 ,bcd2bin(buf[0] & 0x7F) // ss - mask off CH - Clock Halt
nkhorman 0:7f90c8e04249 77 );
nkhorman 0:7f90c8e04249 78 }