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