|
|
/*
|
|
|
* clock.cpp
|
|
|
*
|
|
|
* Created on: Nov 5, 2014
|
|
|
* Author: Alan Aguilar Sologuren
|
|
|
*/
|
|
|
|
|
|
#include <clock.h>
|
|
|
|
|
|
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);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|