Real Time Clock ds1302 library

Committer:
gcibeira
Date:
Fri Dec 03 18:01:36 2010 +0000
Revision:
0:be8d71b29b37

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gcibeira 0:be8d71b29b37 1 /*
gcibeira 0:be8d71b29b37 2 Copyright (c) 2010 Cibeira Gerardo
gcibeira 0:be8d71b29b37 3 */
gcibeira 0:be8d71b29b37 4
gcibeira 0:be8d71b29b37 5 #include "ds1302.h"
gcibeira 0:be8d71b29b37 6 #include "mbed.h"
gcibeira 0:be8d71b29b37 7
gcibeira 0:be8d71b29b37 8 //constructor
gcibeira 0:be8d71b29b37 9 ds1302::ds1302(PinName pinSCLK,PinName pinIO,PinName pinRST) : SCLK(pinSCLK),IO(pinIO),RST(pinRST) {}
gcibeira 0:be8d71b29b37 10
gcibeira 0:be8d71b29b37 11 //methods
gcibeira 0:be8d71b29b37 12 void ds1302::write_byte(BYTE cmd)
gcibeira 0:be8d71b29b37 13 {
gcibeira 0:be8d71b29b37 14 BYTE i;
gcibeira 0:be8d71b29b37 15 IO.output();
gcibeira 0:be8d71b29b37 16 for(i=0;i<=7;i++)
gcibeira 0:be8d71b29b37 17 {
gcibeira 0:be8d71b29b37 18 IO = (cmd >> i) & 0x01;
gcibeira 0:be8d71b29b37 19 wait_us(1);
gcibeira 0:be8d71b29b37 20 SCLK=1;
gcibeira 0:be8d71b29b37 21 wait_us(1);
gcibeira 0:be8d71b29b37 22 SCLK=0;
gcibeira 0:be8d71b29b37 23 }
gcibeira 0:be8d71b29b37 24 IO.input();
gcibeira 0:be8d71b29b37 25 }
gcibeira 0:be8d71b29b37 26
gcibeira 0:be8d71b29b37 27 void ds1302::write(BYTE cmd, BYTE data)
gcibeira 0:be8d71b29b37 28 {
gcibeira 0:be8d71b29b37 29 RST=1;
gcibeira 0:be8d71b29b37 30 wait_us(1);
gcibeira 0:be8d71b29b37 31 write_byte(cmd);
gcibeira 0:be8d71b29b37 32 write_byte(data);
gcibeira 0:be8d71b29b37 33 RST=0;
gcibeira 0:be8d71b29b37 34 }
gcibeira 0:be8d71b29b37 35
gcibeira 0:be8d71b29b37 36 BYTE ds1302::read(BYTE cmd)
gcibeira 0:be8d71b29b37 37 {
gcibeira 0:be8d71b29b37 38 BYTE i,data=0;
gcibeira 0:be8d71b29b37 39
gcibeira 0:be8d71b29b37 40 RST=1;
gcibeira 0:be8d71b29b37 41 write_byte(cmd);
gcibeira 0:be8d71b29b37 42
gcibeira 0:be8d71b29b37 43 IO.input();
gcibeira 0:be8d71b29b37 44 wait_us(1);
gcibeira 0:be8d71b29b37 45
gcibeira 0:be8d71b29b37 46 for(i=0;i<=7;i++)
gcibeira 0:be8d71b29b37 47 {
gcibeira 0:be8d71b29b37 48 data += IO<<i;
gcibeira 0:be8d71b29b37 49 SCLK=1;
gcibeira 0:be8d71b29b37 50 wait_us(1);
gcibeira 0:be8d71b29b37 51 SCLK=0;
gcibeira 0:be8d71b29b37 52 wait_us(1);
gcibeira 0:be8d71b29b37 53 }
gcibeira 0:be8d71b29b37 54 RST=0;
gcibeira 0:be8d71b29b37 55
gcibeira 0:be8d71b29b37 56 return(data);
gcibeira 0:be8d71b29b37 57 }
gcibeira 0:be8d71b29b37 58
gcibeira 0:be8d71b29b37 59 void ds1302::init()
gcibeira 0:be8d71b29b37 60 {
gcibeira 0:be8d71b29b37 61 BYTE x;
gcibeira 0:be8d71b29b37 62 RST=0;
gcibeira 0:be8d71b29b37 63 wait_us(2);
gcibeira 0:be8d71b29b37 64 SCLK=0;
gcibeira 0:be8d71b29b37 65 write(0x8e,0);
gcibeira 0:be8d71b29b37 66 write(0x90,0xa4);
gcibeira 0:be8d71b29b37 67 x=read(0x81);
gcibeira 0:be8d71b29b37 68 if((x & 0x80)!=0)
gcibeira 0:be8d71b29b37 69 write(0x80,0);
gcibeira 0:be8d71b29b37 70 }
gcibeira 0:be8d71b29b37 71
gcibeira 0:be8d71b29b37 72 BYTE ds1302::get_bcd(BYTE data)
gcibeira 0:be8d71b29b37 73 {
gcibeira 0:be8d71b29b37 74 BYTE nibh=0;
gcibeira 0:be8d71b29b37 75 BYTE nibl=0;
gcibeira 0:be8d71b29b37 76
gcibeira 0:be8d71b29b37 77 nibh = data/10;
gcibeira 0:be8d71b29b37 78 nibl = data-(nibh*10);
gcibeira 0:be8d71b29b37 79
gcibeira 0:be8d71b29b37 80 return( (nibh<<4) | nibl);
gcibeira 0:be8d71b29b37 81 }
gcibeira 0:be8d71b29b37 82
gcibeira 0:be8d71b29b37 83 BYTE ds1302::rm_bcd(BYTE data)
gcibeira 0:be8d71b29b37 84 {
gcibeira 0:be8d71b29b37 85 BYTE i,aux=0;
gcibeira 0:be8d71b29b37 86
gcibeira 0:be8d71b29b37 87 i = data;
gcibeira 0:be8d71b29b37 88 aux = (i>>4)*10;
gcibeira 0:be8d71b29b37 89 aux += (i & 0x0F);
gcibeira 0:be8d71b29b37 90
gcibeira 0:be8d71b29b37 91 return aux;
gcibeira 0:be8d71b29b37 92 }
gcibeira 0:be8d71b29b37 93
gcibeira 0:be8d71b29b37 94 void ds1302::set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min)
gcibeira 0:be8d71b29b37 95 {
gcibeira 0:be8d71b29b37 96 write(0x86,get_bcd(day));
gcibeira 0:be8d71b29b37 97 write(0x88,get_bcd(mth));
gcibeira 0:be8d71b29b37 98 write(0x8c,get_bcd(year));
gcibeira 0:be8d71b29b37 99 write(0x8a,get_bcd(dow));
gcibeira 0:be8d71b29b37 100 write(0x84,get_bcd(hr));
gcibeira 0:be8d71b29b37 101 write(0x82,get_bcd(min));
gcibeira 0:be8d71b29b37 102 write(0x80,get_bcd(0));
gcibeira 0:be8d71b29b37 103 }
gcibeira 0:be8d71b29b37 104
gcibeira 0:be8d71b29b37 105 void ds1302::get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
gcibeira 0:be8d71b29b37 106 {
gcibeira 0:be8d71b29b37 107 day = rm_bcd(read(0x87));
gcibeira 0:be8d71b29b37 108 mth = rm_bcd(read(0x89));
gcibeira 0:be8d71b29b37 109 year = rm_bcd(read(0x8d));
gcibeira 0:be8d71b29b37 110 dow = rm_bcd(read(0x8b));
gcibeira 0:be8d71b29b37 111 }
gcibeira 0:be8d71b29b37 112
gcibeira 0:be8d71b29b37 113 void ds1302::get_time(BYTE &hr, BYTE &min, BYTE &sec)
gcibeira 0:be8d71b29b37 114 {
gcibeira 0:be8d71b29b37 115 hr = rm_bcd(read(0x85));
gcibeira 0:be8d71b29b37 116 min = rm_bcd(read(0x83));
gcibeira 0:be8d71b29b37 117 sec = rm_bcd(read(0x81));
gcibeira 0:be8d71b29b37 118 }
gcibeira 0:be8d71b29b37 119
gcibeira 0:be8d71b29b37 120 void ds1302::write_nvr(BYTE address, BYTE data)
gcibeira 0:be8d71b29b37 121 {
gcibeira 0:be8d71b29b37 122 write(address|0xc0,data);
gcibeira 0:be8d71b29b37 123 }
gcibeira 0:be8d71b29b37 124
gcibeira 0:be8d71b29b37 125 BYTE ds1302::read_nvr(BYTE address)
gcibeira 0:be8d71b29b37 126 {
gcibeira 0:be8d71b29b37 127 return(read(address|0xc1));
gcibeira 0:be8d71b29b37 128 }