librairie DS1338

Dependents:   programme_final

Fork of rtc_lib by projet_Laos

Committer:
Asoumy
Date:
Tue Oct 11 13:24:16 2016 +0000
Revision:
0:69d7ae72902c
RTC;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Asoumy 0:69d7ae72902c 1 #include "mbed.h"
Asoumy 0:69d7ae72902c 2 #include "ds1338.h"
Asoumy 0:69d7ae72902c 3
Asoumy 0:69d7ae72902c 4 /*
Asoumy 0:69d7ae72902c 5 * Constructor, initialize the ds1338 on i2c interface.
Asoumy 0:69d7ae72902c 6 * @param sda : sda i2c pin (PinName)
Asoumy 0:69d7ae72902c 7 * @param scl : scl i2c pin (PinName)
Asoumy 0:69d7ae72902c 8 */
Asoumy 0:69d7ae72902c 9 DS1338::DS1338(PinName sda, PinName scl): _i2c(sda, scl) {
Asoumy 0:69d7ae72902c 10 _i2c.frequency(400000);
Asoumy 0:69d7ae72902c 11 buffer[0]=0x07;
Asoumy 0:69d7ae72902c 12 _i2c.write(DS1338_ADR,buffer,1,true);
Asoumy 0:69d7ae72902c 13 _i2c.read(DS1338_ADR,buffer,1);
Asoumy 0:69d7ae72902c 14 if (buffer[0]&0x20){
Asoumy 0:69d7ae72902c 15 buffer[0]=0x07;
Asoumy 0:69d7ae72902c 16 buffer[1]=0xB0;//do not erase error condition !
Asoumy 0:69d7ae72902c 17 }else{
Asoumy 0:69d7ae72902c 18 buffer[0]=0x07;
Asoumy 0:69d7ae72902c 19 buffer[1]=0x90;
Asoumy 0:69d7ae72902c 20 }
Asoumy 0:69d7ae72902c 21 _i2c.write(DS1338_ADR,buffer,1+1);
Asoumy 0:69d7ae72902c 22 }
Asoumy 0:69d7ae72902c 23 /**
Asoumy 0:69d7ae72902c 24 * read bytes from nvram (55 bytes available)
Asoumy 0:69d7ae72902c 25 * @param adr the start address (starts at 0)
Asoumy 0:69d7ae72902c 26 * @param count number of byte to read
Asoumy 0:69d7ae72902c 27 * @param data where to put the bytes
Asoumy 0:69d7ae72902c 28 * @return the byte
Asoumy 0:69d7ae72902c 29 */
Asoumy 0:69d7ae72902c 30 void DS1338::read(unsigned char adr,unsigned char count,char * data) {
Asoumy 0:69d7ae72902c 31 if (count>DS1338_BUFFER_SIZE) {
Asoumy 0:69d7ae72902c 32 count=DS1338_BUFFER_SIZE;
Asoumy 0:69d7ae72902c 33 }
Asoumy 0:69d7ae72902c 34 buffer[0]=9+adr;
Asoumy 0:69d7ae72902c 35 _i2c.write(DS1338_ADR,&(buffer[0]),1,true);
Asoumy 0:69d7ae72902c 36 _i2c.read(DS1338_ADR,data,count);
Asoumy 0:69d7ae72902c 37 }
Asoumy 0:69d7ae72902c 38 /**
Asoumy 0:69d7ae72902c 39 * write bytes to nvram (55 bytes available)
Asoumy 0:69d7ae72902c 40 * @param adr the start address (starts at 0)
Asoumy 0:69d7ae72902c 41 * @param count number of byte to write
Asoumy 0:69d7ae72902c 42 * @param data to be written
Asoumy 0:69d7ae72902c 43 * @return the byte
Asoumy 0:69d7ae72902c 44 */
Asoumy 0:69d7ae72902c 45 void DS1338::write(unsigned char adr,unsigned char count,char * data) {
Asoumy 0:69d7ae72902c 46 if (count>DS1338_BUFFER_SIZE-1) {
Asoumy 0:69d7ae72902c 47 count=DS1338_BUFFER_SIZE-1;
Asoumy 0:69d7ae72902c 48 }
Asoumy 0:69d7ae72902c 49 buffer[0]=9+adr;
Asoumy 0:69d7ae72902c 50 for (unsigned char i=0; i<count; i++) {
Asoumy 0:69d7ae72902c 51 buffer[1+i]=*(data+i);
Asoumy 0:69d7ae72902c 52 }
Asoumy 0:69d7ae72902c 53 _i2c.write(DS1338_ADR,buffer,1+count);
Asoumy 0:69d7ae72902c 54 }
Asoumy 0:69d7ae72902c 55 /**
Asoumy 0:69d7ae72902c 56 * read the current time
Asoumy 0:69d7ae72902c 57 * @param x the time;
Asoumy 0:69d7ae72902c 58 */
Asoumy 0:69d7ae72902c 59 void DS1338::readTime(tm * time) {
Asoumy 0:69d7ae72902c 60 buffer[0]=0;
Asoumy 0:69d7ae72902c 61 _i2c.write(DS1338_ADR,&(buffer[0]),1,true);
Asoumy 0:69d7ae72902c 62 _i2c.read(DS1338_ADR,buffer,9);
Asoumy 0:69d7ae72902c 63 time->tm_sec=((buffer[0]>>4)&0x07)*10+(buffer[0]&0x0F);
Asoumy 0:69d7ae72902c 64 time->tm_min=((buffer[1]>>4)&0x07)*10+(buffer[1]&0x0F);
Asoumy 0:69d7ae72902c 65 time->tm_hour=((buffer[2]>>4)&0x03)*10+(buffer[2]&0x0F);
Asoumy 0:69d7ae72902c 66 time->tm_mday=((buffer[4]>>4)&0x03)*10+(buffer[4]&0x0F);
Asoumy 0:69d7ae72902c 67 time->tm_mon=((buffer[5]>>4)&0x01)*10+(buffer[5]&0x0F)-1;
Asoumy 0:69d7ae72902c 68 time->tm_year=((buffer[6]>>4)&0x0F)*10+(buffer[6]&0x0F);
Asoumy 0:69d7ae72902c 69 if (time->tm_year<70){
Asoumy 0:69d7ae72902c 70 time->tm_year+=100;
Asoumy 0:69d7ae72902c 71 }
Asoumy 0:69d7ae72902c 72 time->tm_wday=buffer[3]&0x07;
Asoumy 0:69d7ae72902c 73 time->tm_yday=0;
Asoumy 0:69d7ae72902c 74 time->tm_isdst=0;
Asoumy 0:69d7ae72902c 75 if (time->tm_sec>=60||
Asoumy 0:69d7ae72902c 76 time->tm_min>=60||
Asoumy 0:69d7ae72902c 77 time->tm_hour>=24||
Asoumy 0:69d7ae72902c 78 time->tm_mday>31 || time->tm_mday<1||
Asoumy 0:69d7ae72902c 79 time->tm_mon>11||
Asoumy 0:69d7ae72902c 80 time->tm_wday>=7||
Asoumy 0:69d7ae72902c 81 buffer[0x08]!=0xCA||//checksum
Asoumy 0:69d7ae72902c 82 (buffer[0x07]&0x20)!=0){//error condition
Asoumy 0:69d7ae72902c 83 time->tm_sec=0;
Asoumy 0:69d7ae72902c 84 time->tm_min=0;
Asoumy 0:69d7ae72902c 85 time->tm_hour=0;
Asoumy 0:69d7ae72902c 86 time->tm_mday=1;
Asoumy 0:69d7ae72902c 87 time->tm_mon=0;
Asoumy 0:69d7ae72902c 88 time->tm_year=70;
Asoumy 0:69d7ae72902c 89 time->tm_wday=1;
Asoumy 0:69d7ae72902c 90 time->tm_yday=0;
Asoumy 0:69d7ae72902c 91 time->tm_isdst=0;
Asoumy 0:69d7ae72902c 92 writeTime(time);
Asoumy 0:69d7ae72902c 93 }
Asoumy 0:69d7ae72902c 94 }
Asoumy 0:69d7ae72902c 95 /**
Asoumy 0:69d7ae72902c 96 * write the current time
Asoumy 0:69d7ae72902c 97 * @param time the time;
Asoumy 0:69d7ae72902c 98 */
Asoumy 0:69d7ae72902c 99 void DS1338::writeTime(tm * time) {
Asoumy 0:69d7ae72902c 100 buffer[0]=0;
Asoumy 0:69d7ae72902c 101 buffer[1]=(((time->tm_sec/10)<<4)+(time->tm_sec%10))&0x7F;//clock not halted
Asoumy 0:69d7ae72902c 102 buffer[2]=(((time->tm_min/10)<<4)+(time->tm_min%10))&0x7F;
Asoumy 0:69d7ae72902c 103 buffer[3]=(((time->tm_hour/10)<<4)+(time->tm_hour%10))&0x3F;//mode 24h
Asoumy 0:69d7ae72902c 104 buffer[4]=(time->tm_wday)&0x03;
Asoumy 0:69d7ae72902c 105 buffer[5]=(((time->tm_mday/10)<<4)+(time->tm_mday%10))&0x3F;
Asoumy 0:69d7ae72902c 106 buffer[6]=((((time->tm_mon+1)/10)<<4)+((time->tm_mon+1)%10))&0x1F;
Asoumy 0:69d7ae72902c 107 buffer[7]=((((time->tm_year%100)/10)<<4)+(time->tm_year%10))&0xFF;
Asoumy 0:69d7ae72902c 108 buffer[8]=0x90;//1Hz, erase error cond
Asoumy 0:69d7ae72902c 109 buffer[9]=0xCA;
Asoumy 0:69d7ae72902c 110 _i2c.write(DS1338_ADR,buffer,1+9);
Asoumy 0:69d7ae72902c 111 }