librairie DS1338
Fork of rtc_lib by
ds1338.cpp@0:69d7ae72902c, 2016-10-11 (annotated)
- Committer:
- Asoumy
- Date:
- Tue Oct 11 13:24:16 2016 +0000
- Revision:
- 0:69d7ae72902c
RTC;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |