24C32 Non-Volatile RAM on DS3231 RTC
#include <Eeprom24C32_64.h>


Eeprom24C32 initialize writeByte writeBytes
readByte readBytes writePage writeBuffer
readBuffer

The 24C32 (I2C Addr: 0X57) is on board the DS3231 RTC.  

/**************************************************************************
*  brief EEPROM 24C32 / 24C64 library for Arduino
*  author Copyright (C) 2012  Julien Le Sech - www.idreammicro.com
*  version 1.0
*  date 20120218
* This file is part of the EEPROM 24C32 / 24C64 library for Arduino.
* This library is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see http://www.gnu.org/licenses/
******************************************************************************/
/**************************************************************************
*  file Eeprom24C32_64.cpp
******************************************************************************/
/******************************************************************************
* Header file inclusions.
******************************************************************************/
#include <Arduino.h>
#include <Wire.h>
#include <Eeprom24C32_64.h>

/******************************************************************************
* Private macro definitions.
******************************************************************************/
/**************************************************************************
*  def EEPROM__PAGE_SIZE
*  brief Size of a page in EEPROM memory.
* This size is given by EEPROM memory datasheet.
******************************************************************************/
#define EEPROM__PAGE_SIZE         32

/**************************************************************************
*  def EEPROM__RD_BUFFER_SIZE
*  brief Size of input TWI buffer.
* This size is equal to BUFFER_LENGTH defined in Wire library (32 bytes).
******************************************************************************/
#define EEPROM__RD_BUFFER_SIZE    BUFFER_LENGTH

/**************************************************************************
*  def EEPROM__WR_BUFFER_SIZE
*  brief Size of output TWI buffer.
* This size is equal to BUFFER_LENGTH - 2 bytes reserved for address.
******************************************************************************/
#define EEPROM__WR_BUFFER_SIZE    (BUFFER_LENGTH - 2)

/******************************************************************************
* Public method definitions.
******************************************************************************/



/************************************************************************** * fn Eeprom24C32_64::Eeprom24C32_64( byte deviceAddress ) * brief Constructor. * param deviceAddress EEPROM address on TWI bus. ******************************************************************************/ Eeprom24C32_64:: Eeprom24C32_64( byte deviceAddress ) { m_deviceAddress = deviceAddress; }
/************************************************************************** * fn void Eeprom24C32_64::initialize() * brief Initialize library and TWI bus. * If several devices are connected to TWI bus, this method mustn't be * called. TWI bus must be initialized out of this library using * Wire.begin() method. **************************************************************************/ void Eeprom24C32_64:: initialize() { Wire.begin(); }
/************************************************************************** * fn void Eeprom24C32_64::writeByte( word address, byte data ) * brief Write a byte in EEPROM memory. * remarks A delay of 10 ms is required after write cycle. * param address Address. * param data Byte to write. ******************************************************************************/ void Eeprom24C32_64:: writeByte( word address, byte data) { Wire.beginTransmission( m_deviceAddress ); Wire.write( address >> 8 ); Wire.write( address & 0xFF ); Wire.write( data ); Wire.endTransmission(); }
/************************************************************************** * fn void Eeprom24C32_64::writeBytes( word address, word length, byte *p_data) * brief Write bytes in EEPROM memory. * param address Start address. * param length Number of bytes to write. * param[in] p_data Bytes to write. ******************************************************************************/ void Eeprom24C32_64:: writeBytes( word address, word length, byte *p_data) { byte notAlignedLength = 0; byte pageOffset = address % EEPROM__PAGE_SIZE; if( pageOffset > 0) // WRITE FIRST PAGE IF NOT ALIGNED { notAlignedLength = EEPROM__PAGE_SIZE - pageOffset; if( length < notAlignedLength ) notAlignedLength = length; writePage( address, notAlignedLength, p_data); length -= notAlignedLength; } if( length > 0) { address += notAlignedLength; p_data += notAlignedLength; byte pageCount = length / EEPROM__PAGE_SIZE; for( byte i = 0; i < pageCount; i++) { // WRITE COMPLETE AND ALIGNED PAGES writePage(address, EEPROM__PAGE_SIZE, p_data); address += EEPROM__PAGE_SIZE; p_data += EEPROM__PAGE_SIZE; length -= EEPROM__PAGE_SIZE; } if( length > 0) // WRITE REMAINING UNCOMPLETE PAGE writePage( address, length, p_data ); } }
/************************************************************************** * fn byte Eeprom24C32_64::readByte( word address ) * brief Read a byte in EEPROM memory. * param address Address. * return Read byte. ******************************************************************************/ byte Eeprom24C32_64:: readByte( word address ) { Wire.beginTransmission( m_deviceAddress ); Wire.write( address >> 8 ); Wire.write( address & 0xFF ); Wire.endTransmission(); Wire.requestFrom( m_deviceAddress, (byte)1 ); byte data = 0; if( Wire.available() ) data = Wire.read(); return data; }
/************************************************************************** * fn void Eeprom24C32_64::readBytes( word address, word length, byte *p_data) * brief Read bytes in EEPROM memory. * param address Start address. * param length Number of bytes to read. * patam[in] p_data Byte array to fill with read bytes. ******************************************************************************/ void Eeprom24C32_64:: readBytes( word address, word length, byte *p_data ) { byte bufferCount = length / EEPROM__RD_BUFFER_SIZE; for( byte i = 0; i < bufferCount; i++ ) { word offset = i * EEPROM__RD_BUFFER_SIZE; readBuffer( address + offset, EEPROM__RD_BUFFER_SIZE, p_data + offset); } byte remainingBytes = length % EEPROM__RD_BUFFER_SIZE; word offset = length - remainingBytes; readBuffer( address + offset, remainingBytes, p_data + offset ); } /****************************************************************************** * Private method definitions. ******************************************************************************/
/************************************************************************** * fn void Eeprom24C32_64::writePage( word address, byte length, byte *p_data) * brief Write page in EEPROM memory. * param address Start address. * param length Number of bytes (EEPROM__PAGE_SIZE bytes max). * param[in] p_data Data. ******************************************************************************/ void Eeprom24C32_64:: writePage( word address, byte length, byte *p_data ) { byte bufferCount = length / EEPROM__WR_BUFFER_SIZE; for( byte i = 0; i < bufferCount; i++) // WRITE COMPLETE BUFFERS { byte offset = i * EEPROM__WR_BUFFER_SIZE; writeBuffer( address + offset, EEPROM__WR_BUFFER_SIZE , p_data + offset); } byte remainingBytes = length % EEPROM__WR_BUFFER_SIZE; byte offset = length - remainingBytes; // WRITE REMAINING BYTES writeBuffer( address + offset, remainingBytes, p_data + offset ); }
/************************************************************************** * fn void Eeprom24C32_64::writeBuffer( word address, byte length, byte *p_data) * brief Write bytes into memory. * param address Start address. * param length Number of bytes (EEPROM__WR_BUFFER_SIZE bytes max). * param[in] p_data Data. ******************************************************************************/ void Eeprom24C32_64:: writeBuffer( word address, byte length, byte *p_data) { Wire.beginTransmission( m_deviceAddress ); Wire.write( address >> 8 ); Wire.write( address & 0xFF ); for( byte i = 0; i < length; i++) { Wire.write( p_data[i] ); } Wire.endTransmission(); // Write cycle time (tWR). See EEPROM memory datasheet for more details. delay( 10 ); }
/************************************************************************** * fn void Eeprom24C32_64::readBuffer( word address, byte length, byte *p_data) * brief Read bytes in memory. * param address Start address. * param length Number of bytes (EEPROM__RD_BUFFER_SIZE bytes max). * param[in] p_data Buffer to fill with read bytes. ******************************************************************************/ void Eeprom24C32_64:: readBuffer( word address, byte length, byte *p_data) { Wire.beginTransmission( m_deviceAddress ); Wire.write( address >> 8 ); Wire.write( address & 0xFF ); Wire.endTransmission(); Wire.requestFrom( m_deviceAddress, length ); for( byte i = 0; i < length; i++ ) { if( Wire.available()) p_data[i] = Wire.read(); } }