|
|
/*
|
|
|
* 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
|
|
|
*/
|
|
|
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);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|