clock.cpp
111 lines
| 2.8 KiB
| text/x-c
|
CppLexer
|
r132 | /* | ||
* 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); | ||||
} | ||||
} | ||||