/* * clock.cpp * * Created on: Nov 5, 2014 * Author: Alan Aguilar Sologuren */ #include namespace te_clock { /*! * \fn request * \brief Escribe un valor en la memoria RAM interna del RTC DS1308, en la * direccion especificada. * \param addr direccion relativa a la RAM (0 es la primera) del registro * en DS1308. * \param reqcode El codigo del comando a ejecutar * \return estatus * 0 success * 2 error: address send, nack received * 3 error: data send, nack received * 4 other twi error */ inline uint8_t request(uint8_t reqcode, uint8_t addr = -1, uint8_t val = -1) { Wire.beginTransmission(IDT5V19_CTRL_ID); Wire.write(reqcode); if (addr != -1) Wire.write(addr); if (val != -1) Wire.write(val); return Wire.endTransmission(); } /*! * \fn progsave * \brief Escribe un valor en la memoria RAM interna del RTC DS1308, en la * direccion especificada. */ inline uint8_t progsave(void) { return request(0x01); } /*! * \fn progrestore * \brief Escribe un valor en la memoria RAM interna del RTC DS1308, en la * direccion especificada. */ inline uint8_t progrestore(void) { return request(0x02); } /*! * \fn read * \brief Lee un buffer de la memoria RAM interna del RTC DS1308, de la * direccion especificada. * \param addr direccion relativa a la RAM (0 es la primera) del registro * en DS1308. * \param buff Direccion del buffer al cual se copiaran los valores. * \param cnt Numero de elementos acpiar del DS1308. * \return estatus * 0 success * 2 error: address send, nack received * 3 error: data send, nack received * 4 other twi error */ uint8_t progread(uint8_t addr, uint8_t buf[], uint8_t cnt) { uint8_t nread = 0; while ((cnt > 0) && (addr < IDT5V19_MAX_ADD)) { request(0x00, addr); Wire.requestFrom((uint8_t) IDT5V19_CTRL_ID, cnt); while (Wire.available() && (cnt > 0) && (addr < IDT5V19_MAX_ADD)) { buf[nread] = Wire.read(); nread++; cnt--; addr++; } /* while */ } return (nread); } /*! * \fn progwrite * \brief Escribe el contenido de un buffer de cnt elementos en la memoria * RAM interna del RTC DS1308, en la direccion especificada. * \param addr direccion relativa a la RAM (0 es la primera) del inicio del * buffer en DS1308. * \param pbuf direccion del buffer a copiar en la RAM del DS1308. * \param cnt Numero de elementos a copiar. * \return estatus * 0 success * 2 error: address send, nack received * 3 error: data send, nack received * 4 other twi error */ uint8_t progwrite(uint8_t addr, const uint8_t *pbuf, uint8_t cnt) { uint8_t nbytes, rc = 0; if (addr >= IDT5V19_MAX_ADD) return (IDT5V19_MAX_ADD); // 0 thru 55 if (addr + cnt > IDT5V19_MAX_ADD) cnt = IDT5V19_MAX_ADD - addr; while (cnt > 0) { nbytes = min(cnt, BUFFER_LENGTH-1); Wire.beginTransmission(IDT5V19_CTRL_ID); Wire.write(0x00); Wire.write(addr); Wire.write((uint8_t*) pbuf, nbytes); rc = Wire.endTransmission(); cnt -= nbytes; addr += nbytes; pbuf += nbytes; } return (rc); } }