Code to interface with the MCP7940 Real time clock. Supports getting and setting the time in 24 hour format

Committer:
MichaelW
Date:
Fri Oct 02 11:36:17 2015 +0000
Revision:
2:941a59078507
Parent:
1:8f330348d96b
Added some documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MichaelW 1:8f330348d96b 1 #include "MCP7940.h"
MichaelW 1:8f330348d96b 2
MichaelW 1:8f330348d96b 3 MCP7940::MCP7940(PinName sda, PinName scl):Clock(sda, scl){
MichaelW 1:8f330348d96b 4 _addr = 0xDE; // 1101 111x
MichaelW 1:8f330348d96b 5 Clock.frequency(100000);
MichaelW 1:8f330348d96b 6 _YearStart = 2000;
MichaelW 1:8f330348d96b 7 }
MichaelW 1:8f330348d96b 8 MCP7940::MCP7940(PinName sda, PinName scl, int StartYear):Clock(sda, scl){
MichaelW 1:8f330348d96b 9 _addr = 0xDE; // 1101 111x
MichaelW 1:8f330348d96b 10 Clock.frequency(100000);
MichaelW 1:8f330348d96b 11 _YearStart = StartYear;
MichaelW 1:8f330348d96b 12 }
MichaelW 1:8f330348d96b 13
MichaelW 1:8f330348d96b 14 char MCP7940::IntToBCD(char Data){
MichaelW 1:8f330348d96b 15 char Tens = Data / 10;
MichaelW 1:8f330348d96b 16 char Units = Data % 10;
MichaelW 1:8f330348d96b 17 char BCD = (Tens << 4 | Units);
MichaelW 1:8f330348d96b 18 return(BCD);
MichaelW 1:8f330348d96b 19 }
MichaelW 1:8f330348d96b 20 char MCP7940::BCDtoInt(char Data){
MichaelW 1:8f330348d96b 21 char Value;
MichaelW 1:8f330348d96b 22 Value = (((Data & 0xF0 ) >> 4) * 10) + (((Data & 0x0F )));
MichaelW 1:8f330348d96b 23 return(Value);
MichaelW 1:8f330348d96b 24 }
MichaelW 1:8f330348d96b 25
MichaelW 1:8f330348d96b 26 int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins){
MichaelW 1:8f330348d96b 27 return(setTime(Year, Month, Day, Hour, Mins, 0, 0));
MichaelW 1:8f330348d96b 28 }
MichaelW 1:8f330348d96b 29 int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins, int Secs){
MichaelW 1:8f330348d96b 30 return(setTime(Year, Month, Day, Hour, Mins, Secs, 0));
MichaelW 1:8f330348d96b 31 }
MichaelW 1:8f330348d96b 32 int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins, int Secs, int MiliSecs){
MichaelW 1:8f330348d96b 33 return(setTime(Year, Month, Day, Hour, Mins, Secs, 0,1));
MichaelW 1:8f330348d96b 34 }
MichaelW 1:8f330348d96b 35 int MCP7940::setTime(int Year, int Month, int Day, int Hour, int Mins, int Secs, int MiliSecs, int DayOfWeek){
MichaelW 1:8f330348d96b 36 _Day = Day;
MichaelW 1:8f330348d96b 37 _Month = Month;
MichaelW 1:8f330348d96b 38 _Year = Year;
MichaelW 1:8f330348d96b 39 _Hour = Hour;
MichaelW 1:8f330348d96b 40 _Minutes = Mins;
MichaelW 1:8f330348d96b 41 _Seconds = Secs;
MichaelW 1:8f330348d96b 42 _MilliSeconds = MiliSecs;
MichaelW 1:8f330348d96b 43 _DayOfWeek = DayOfWeek;
MichaelW 1:8f330348d96b 44 return(setTime());
MichaelW 1:8f330348d96b 45 }
MichaelW 1:8f330348d96b 46 void MCP7940::StartClock(){
MichaelW 1:8f330348d96b 47 char cmd[8];
MichaelW 1:8f330348d96b 48 cmd[0] = 0x00; // The start register
MichaelW 1:8f330348d96b 49 cmd[1] = 0x00;
MichaelW 1:8f330348d96b 50
MichaelW 1:8f330348d96b 51 Clock.start();
MichaelW 1:8f330348d96b 52 Clock.write(_addr,cmd,1) ;
MichaelW 1:8f330348d96b 53 Clock.read(_addr, cmd, 1);
MichaelW 1:8f330348d96b 54
MichaelW 1:8f330348d96b 55 //Cmd 0 now contains the value of the seconds regsiter
MichaelW 1:8f330348d96b 56 cmd[1] = cmd[0] & 0x7F; //Move the seconds register value and clear the top bit
MichaelW 1:8f330348d96b 57 cmd[0] = 0x00; //Set write location
MichaelW 1:8f330348d96b 58 // Clock.write(_addr,cmd,2);
MichaelW 1:8f330348d96b 59 cmd[1] = cmd[1] | 0x80 ; //Now set the top bit
MichaelW 1:8f330348d96b 60 Clock.write(_addr,cmd,2); //Write to Reg 0x00 the value with top bit set
MichaelW 1:8f330348d96b 61 Clock.stop();
MichaelW 1:8f330348d96b 62
MichaelW 1:8f330348d96b 63 }
MichaelW 1:8f330348d96b 64 int MCP7940::setDefaultTime(){
MichaelW 1:8f330348d96b 65 _Day = 1;
MichaelW 1:8f330348d96b 66 _Month = 10;
MichaelW 1:8f330348d96b 67 _Year = 2015;
MichaelW 1:8f330348d96b 68 _Hour = 1;
MichaelW 1:8f330348d96b 69 _Minutes = 0;
MichaelW 1:8f330348d96b 70 _Seconds = 0;
MichaelW 1:8f330348d96b 71 _MilliSeconds = 0;
MichaelW 1:8f330348d96b 72 _DayOfWeek = 1;
MichaelW 1:8f330348d96b 73 return(setTime());
MichaelW 1:8f330348d96b 74 }
MichaelW 1:8f330348d96b 75 int MCP7940::setTime(){
MichaelW 1:8f330348d96b 76 //Write time to the Device
MichaelW 1:8f330348d96b 77 char cmd[8];
MichaelW 1:8f330348d96b 78 cmd[0] = 0x00; // The start register
MichaelW 1:8f330348d96b 79 cmd[1] = IntToBCD(_Seconds);
MichaelW 1:8f330348d96b 80 cmd[2] = IntToBCD(_Minutes);
MichaelW 1:8f330348d96b 81 cmd[3] = IntToBCD(_Hour);
MichaelW 1:8f330348d96b 82 cmd[4] = IntToBCD(_DayOfWeek) | 0x80; //NB this will clear the PWR Fail and set VBat Enable
MichaelW 1:8f330348d96b 83 cmd[5] = IntToBCD(_Day);
MichaelW 1:8f330348d96b 84 cmd[6] = IntToBCD(_Month);
MichaelW 1:8f330348d96b 85 cmd[7] = IntToBCD(_Year - _YearStart);
MichaelW 1:8f330348d96b 86
MichaelW 1:8f330348d96b 87 Clock.start();
MichaelW 1:8f330348d96b 88 Clock.write(_addr, cmd, 8);
MichaelW 1:8f330348d96b 89 Clock.stop();
MichaelW 1:8f330348d96b 90
MichaelW 1:8f330348d96b 91 return(1);
MichaelW 1:8f330348d96b 92 }
MichaelW 1:8f330348d96b 93 int MCP7940::getTime(){
MichaelW 1:8f330348d96b 94
MichaelW 1:8f330348d96b 95 char cmd[7];
MichaelW 1:8f330348d96b 96 cmd[0] = 0x00;
MichaelW 1:8f330348d96b 97
MichaelW 1:8f330348d96b 98 Clock.start();
MichaelW 1:8f330348d96b 99 //Set the position to Reg 0x00
MichaelW 1:8f330348d96b 100 Clock.write(_addr, cmd, 1);
MichaelW 1:8f330348d96b 101 //Read 7 bytes from 0x00
MichaelW 1:8f330348d96b 102 Clock.read(_addr, cmd, 7);
MichaelW 1:8f330348d96b 103 Clock.stop();
MichaelW 1:8f330348d96b 104
MichaelW 1:8f330348d96b 105 //printf("%i %i %i %i %i %i %i\r\n", cmd[0], cmd[1],cmd[2],cmd[3],cmd[4], cmd[5], cmd[6]);
MichaelW 1:8f330348d96b 106
MichaelW 1:8f330348d96b 107 //Convert into numbers - note have to mask out the configuration bits as well
MichaelW 1:8f330348d96b 108 _Day = BCDtoInt(cmd[4] & 0x3F);
MichaelW 1:8f330348d96b 109 _Month = BCDtoInt(cmd[5] & 0x1F);
MichaelW 1:8f330348d96b 110 _Year = BCDtoInt(cmd[6] & 0xFF) + _YearStart;
MichaelW 1:8f330348d96b 111 _Hour = BCDtoInt(cmd[2] & 0x3F); //Should handle 12 or 24 hour here.
MichaelW 1:8f330348d96b 112 _Minutes = BCDtoInt(cmd[1] & 0x7F);
MichaelW 1:8f330348d96b 113 _Seconds = BCDtoInt(cmd[0] & 0x7F);
MichaelW 1:8f330348d96b 114 _DayOfWeek = BCDtoInt(cmd[3] & 0x07);
MichaelW 1:8f330348d96b 115 _MilliSeconds = 0;
MichaelW 1:8f330348d96b 116 //printf("Day: %i Month: %i Year: %i Hour: %i Minute: %i Second: %i\r\n", _Day, _Month,_Year,_Hour,_Minutes, _Seconds);
MichaelW 1:8f330348d96b 117 return(0);
MichaelW 1:8f330348d96b 118 }
MichaelW 1:8f330348d96b 119 char * MCP7940::TimeStamp(){
MichaelW 1:8f330348d96b 120 TimeStamp(_TimeStamp);
MichaelW 1:8f330348d96b 121 return(_TimeStamp);
MichaelW 1:8f330348d96b 122 }
MichaelW 1:8f330348d96b 123 void MCP7940::TimeStamp(char * buf){
MichaelW 1:8f330348d96b 124 getTime();
MichaelW 1:8f330348d96b 125 sprintf(buf,"%04i-%02i-%02iT%02i:%02i:%02i",_Year, _Month,_Day,_Hour,_Minutes,_Seconds);
MichaelW 1:8f330348d96b 126 }
MichaelW 1:8f330348d96b 127 void MCP7940::niceTimeStamp(char * buf){
MichaelW 1:8f330348d96b 128 getTime();
MichaelW 1:8f330348d96b 129 sprintf(buf,"%02i/%02i/%04i %02i:%02i:%02i",_Day, _Month,_Year,_Hour,_Minutes,_Seconds);
MichaelW 1:8f330348d96b 130 }
MichaelW 1:8f330348d96b 131 void MCP7940::niceDate(char * buf){
MichaelW 1:8f330348d96b 132 getTime();
MichaelW 1:8f330348d96b 133 sprintf(buf,"%02i-%02i-%04i",_Day, _Month,_Year);
MichaelW 1:8f330348d96b 134 }
MichaelW 1:8f330348d96b 135 void MCP7940::niceTime(char * buf){
MichaelW 1:8f330348d96b 136 getTime();
MichaelW 1:8f330348d96b 137 sprintf(buf,"%02i:%02i:%02i",_Hour,_Minutes,_Seconds);
MichaelW 1:8f330348d96b 138 }
MichaelW 1:8f330348d96b 139
MichaelW 1:8f330348d96b 140 int MCP7940::Day(){
MichaelW 1:8f330348d96b 141 return(_Day);
MichaelW 1:8f330348d96b 142 }
MichaelW 1:8f330348d96b 143 int MCP7940::Month(){
MichaelW 1:8f330348d96b 144 return(_Month);
MichaelW 1:8f330348d96b 145 }
MichaelW 1:8f330348d96b 146 int MCP7940::Year(){
MichaelW 1:8f330348d96b 147 return(_Year);
MichaelW 1:8f330348d96b 148 }
MichaelW 1:8f330348d96b 149 int MCP7940::Hour(){
MichaelW 1:8f330348d96b 150 return(_Hour);
MichaelW 1:8f330348d96b 151 }
MichaelW 1:8f330348d96b 152 int MCP7940::Minutes(){
MichaelW 1:8f330348d96b 153 return(_Minutes);
MichaelW 1:8f330348d96b 154
MichaelW 1:8f330348d96b 155 }
MichaelW 1:8f330348d96b 156 int MCP7940::Seconds(){
MichaelW 1:8f330348d96b 157 return(_Seconds);
MichaelW 1:8f330348d96b 158 }
MichaelW 1:8f330348d96b 159 int MCP7940::MilliSeconds(){
MichaelW 1:8f330348d96b 160 return(_MilliSeconds);
MichaelW 1:8f330348d96b 161 }
MichaelW 1:8f330348d96b 162 int MCP7940::DayOfWeek(){
MichaelW 1:8f330348d96b 163 return(_DayOfWeek);
MichaelW 1:8f330348d96b 164 }
MichaelW 1:8f330348d96b 165