Updated Adafruit Library
Fork of Adafruit_RTCLib by
DS1307.cpp@1:2c4e81ecda67, 2012-07-18 (annotated)
- Committer:
- nkhorman
- Date:
- Wed Jul 18 01:28:21 2012 +0000
- Revision:
- 1:2c4e81ecda67
- Parent:
- 0:7f90c8e04249
- Child:
- 2:f372b273d88f
fix / add comments
Who changed what in which revision?
User | Revision | Line number | New 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 | |
nkhorman | 0:7f90c8e04249 | 22 | RtcDs1307::RtcDs1307(I2C &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 | } |