clock.cpp
119 lines
| 2.9 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 | ||||
|
r209 | * \return estatus | ||
* 0 success | ||||
* 2 error: address send, nack received | ||||
* 3 error: data send, nack received | ||||
* 4 other twi error | ||||
|
r132 | */ | ||
|
r203 | inline uint8_t request(uint8_t reqcode, uint8_t addr = -1, uint8_t val = -1) { | ||
|
r132 | |||
Wire.beginTransmission(IDT5V19_CTRL_ID); | ||||
Wire.write(reqcode); | ||||
|
r203 | if (addr != -1) | ||
Wire.write(addr); | ||||
if (val != -1) | ||||
Wire.write(val); | ||||
|
r132 | 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 | ||||
*/ | ||||
|
r203 | uint8_t progread(uint8_t addr, uint8_t buf[], uint8_t cnt) { | ||
|
r132 | |||
|
r203 | uint8_t nread = 0; | ||
while ((cnt > 0) && (addr < IDT5V19_MAX_ADD)) { | ||||
|
r132 | request(0x00, addr); | ||
|
r203 | Wire.requestFrom((uint8_t) IDT5V19_CTRL_ID, cnt); | ||
while (Wire.available() && (cnt > 0) && (addr < IDT5V19_MAX_ADD)) { | ||||
|
r132 | buf[nread] = Wire.read(); | ||
|
r203 | nread++; | ||
cnt--; | ||||
addr++; | ||||
} /* while */ | ||||
|
r132 | } | ||
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 | ||||
*/ | ||||
|
r203 | uint8_t progwrite(uint8_t addr, const uint8_t *pbuf, uint8_t cnt) { | ||
|
r132 | |||
|
r203 | 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; | ||||
|
r132 | while (cnt > 0) { | ||
nbytes = min(cnt, BUFFER_LENGTH-1); | ||||
Wire.beginTransmission(IDT5V19_CTRL_ID); | ||||
Wire.write(0x00); | ||||
Wire.write(addr); | ||||
|
r203 | Wire.write((uint8_t*) pbuf, nbytes); | ||
|
r132 | rc = Wire.endTransmission(); | ||
|
r203 | cnt -= nbytes; | ||
addr += nbytes; | ||||
pbuf += nbytes; | ||||
|
r132 | } | ||
|
r203 | return (rc); | ||
|
r132 | } | ||
} | ||||