Updated Adafruit Library
Fork of Adafruit_RTCLib by
DS1307.cpp@0:7f90c8e04249, 2012-07-17 (annotated)
- 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?
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 | 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 | } |