From 561887acffccb8d4757d931eedfa2e494946efd1 Mon Sep 17 00:00:00 2001 From: Determinant Date: Thu, 21 Sep 2017 21:58:08 -0400 Subject: basic functionality now works --- src/ds3231.rs | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) (limited to 'src/ds3231.rs') diff --git a/src/ds3231.rs b/src/ds3231.rs index 6ad75d8..6b20958 100644 --- a/src/ds3231.rs +++ b/src/ds3231.rs @@ -3,19 +3,22 @@ use ::i2c::{I2C, TransDir}; const DS3231_ADDR: u8 = 0b1101000; const DS3231_REG_SEC: u8 = 0x00; +const DS3231_REG_CTL: u8 = 0x0e; pub struct DS3231<'a> { i2c: I2C<'a> } pub struct Date { - second: u8, - minute: u8, - hour: u8, - day: u8, - date: u8, - month: u8, - year: u8 + pub second: u8, + pub minute: u8, + pub hour: u8, + pub day: u8, + pub date: u8, + pub month: u8, + pub year: u8, + pub am: bool, + pub am_enable: bool } impl<'a> DS3231<'a> { @@ -31,6 +34,17 @@ impl<'a> DS3231<'a> { ((dec / 10) << 4) | (dec % 10) } + pub fn init(&self) { + let i2c = &self.i2c; + i2c.init(); + i2c.start(true, true); + i2c.send_addr(DS3231_ADDR, TransDir::TRANSMITTER, true); + i2c.send(DS3231_REG_CTL, true); + i2c.send(0x00, true); + i2c.send(0x00, true); + i2c.stop(true); + } + pub fn read_fulldate(&self) -> Date { let mut buf: [u8; 7] = [0; 7]; let i2c = &self.i2c; @@ -47,20 +61,35 @@ impl<'a> DS3231<'a> { i2c.conf_ack(false); /* disable ack (send nack) */ buf[6] = i2c.recv(true); i2c.stop(true); + let am_enable = (buf[2] >> 6) & 1 == 1; + let hour = if am_enable { + (buf[2] & 0x0f) + ((buf[2] >> 4) & 1) * 10 + } else { + DS3231::bcd2dec(buf[2]) + }; + let am = if am_enable {(buf[2] >> 5) & 1 == 0} else {hour < 12}; Date{second: DS3231::bcd2dec(buf[0]), minute: DS3231::bcd2dec(buf[1]), - hour: DS3231::bcd2dec(buf[2]), + hour: hour, day: DS3231::bcd2dec(buf[3]), date: DS3231::bcd2dec(buf[4]), month: DS3231::bcd2dec(buf[5]), - year: DS3231::bcd2dec(buf[6])} + year: DS3231::bcd2dec(buf[6]), + am: am, + am_enable: am_enable} } pub fn write_fulldate(&self, date: &Date) { let i2c = &self.i2c; + let hour = if date.am_enable { + (1 << 6) | ((if date.am {0} else {1}) << 5) | + ((date.hour % 10) << 4) | (date.hour & 0x0f) + } else { + DS3231::dec2bcd(date.hour) + }; let buf: [u8; 7] = [DS3231::dec2bcd(date.second), DS3231::dec2bcd(date.minute), - DS3231::dec2bcd(date.hour), + hour, DS3231::dec2bcd(date.day), DS3231::dec2bcd(date.date), DS3231::dec2bcd(date.month), -- cgit v1.2.3-70-g09d2