Version of Robotron arcade game using LPC1768, a Gameduino shield, a serial EEPROM (for high scores), two microswitch joysticks and two buttons plus a box to put it in. 20 levels of mayhem.

Dependencies:   25LCxxx_SPI CommonTypes Gameduino mbed

I2CEEPROM.cpp

Committer:
RichardE
Date:
2013-06-04
Revision:
0:5fa232ee5fdf

File content as of revision 0:5fa232ee5fdf:

/*
 * SOURCE FILE : I2CEEPROM.cpp
 *
 * Definition of class I2CEEPROM.
 * Rountines for communicating with a serial EEPROM over an I2C link.
 * EEPROM in question is a Microchip 24AA512.
 * Remember you need pullup resistors on the SCL, SDA and WP lines.
 *
 */

#include "I2CEEPROM.h"

/***************/
/* CONSTRUCTOR */
/***************/
I2CEEPROM::I2CEEPROM() :
    isOpen( false ),
    // wire( (TwoWire*)NULL ),
    wp( 8 )
{
}

/**************/
/* DESTRUCTOR */
/**************/
I2CEEPROM::~I2CEEPROM() {
}

/**************************************/
/* PREPARE TO COMMUNICATE WITH EEPROM */
/**************************************/
// Pass pointer to TwoWire object to use for I2C communications
// which should have been initialised and opened before calling this.
// Pass 3 bit address of EEPROM (as set by A0, A1 and A2 pins) in ea.
// Pass pin number to use for write protect in wp.
#if 0
void I2CEEPROM::Open( TwoWire *wire, UInt8 ea, UInt8 wp ) {
    if( ! isOpen ) {
        // Save pointer to TwoWire object.
        this->wire = wire;
        // Calculate slave address.
        slaveAddress = (UInt8)( ( ea & 0x7 ) | 0x50 );
        // Save write protect pin number.
        this->wp = wp;
        // Configure write protect pin as open drain output.
        pinMode( wp, OUTPUT_OPEN_DRAIN );
        // Write protect EEPROM.
        digitalWrite( wp, HIGH );
        isOpen = true;
    }
}
#endif

/*********************************************/
/* SHUT DOWN COMMUNICATIONS LINK WITH EEPROM */
/*********************************************/
void I2CEEPROM::Close( void ) {
    isOpen = false;
}

// Size of each chunk read or written.
#define CHUNK_SIZE ( WIRE_BUFSIZ - 2 )

/************************************/
/* ATTEMPT TO READ A CHUNK OF BYTES */
/************************************/
// Pass address within EEPROM in address.
// Pass pointer to buffer for bytes read in buffer.
// Returns false if a failure occurred whilst reading EEPROM.
// Pass number of bytes to read in count.
// Returns true if successful, false if not.
// The number of bytes read must not exceed CHUNK_SIZE.
bool I2CEEPROM::ReadChunk( UInt16 address, UInt8 *buffer, UInt8 count ) {
#if 0
  // First send address you want to read from.
  wire->beginTransmission( slaveAddress );
  // Add high byte of EEPROM address to read from.
  wire->send( ( address >> 8 ) & 0xFF );
  // Add low byte of EEPROM address to read from.
  wire->send( address & 0xFF );
  // Send the packet and return false on failure.
  if( wire->endTransmission() != SUCCESS ) {
        return false;
    }
  // Now read back data.
  wire->requestFrom( slaveAddress, count );
    UInt16 readCount = 0;
  while( ( wire->available() > 0 ) && ( readCount < count ) ) {
        *buffer++ = wire->receive();
        readCount++;
  }
    return true;
#else
  return false;
#endif
}

/*************************************/
/* ATTEMPT TO READ A NUMBER OF BYTES */
/*************************************/
// Pass address within EEPROM in address.
// Pass pointer to buffer for bytes read in buffer.
// Returns false if a failure occurred whilst reading EEPROM.
// Pass number of bytes to read in count.
// Returns true if successful, false if not.
bool I2CEEPROM::ReadBytes( UInt16 address, UInt8 *buffer, UInt16 count ) {
#if 0
    bool ok = true;
    // Keep reading chunks until all bytes read.
    while( ( count > 0 ) && ok ) {
        if( count > CHUNK_SIZE ) {
            ok = ReadChunk( address, buffer, (UInt8)CHUNK_SIZE );
            address += CHUNK_SIZE;
            buffer += CHUNK_SIZE;
            count -= CHUNK_SIZE;
        }
        else {
            ok = ReadChunk( address, buffer, (UInt8)count );
            count = 0;
        }
    }
    // Return true on success.
    return ok;
#else
  return false;
#endif
}

/**************************************/
/* ATTEMPT TO WRITE A CHUNK TO EEPROM */
/**************************************/
// Pass address within EEPROM in address.
// Pass pointer to buffer of bytes to write in buffer.
// Pass number of bytes to write in count.
// Returns true if successful, false if not.
// The number of bytes written must not exceed CHUNK_SIZE.
bool I2CEEPROM::WriteChunk( UInt16 address, const UInt8 *buffer, UInt8 count ) {
#if 0
  // First send address you want to write to.
  wire->beginTransmission( slaveAddress );
  // Add high byte of EEPROM address to write to.
  wire->send( ( address >> 8 ) & 0xFF );
  // Add low byte of EEPROM address to write to.
  wire->send( address & 0xFF );
    // Add buffer bytes.
    wire->send( (uint8*)buffer, count );
  // Send the packet.
    // Return true if successful.
  return ( wire->endTransmission() == SUCCESS );
#else
  return false;
#endif
}

/**************************************/
/* ATTEMPT TO WRITE A NUMBER OF BYTES */
/**************************************/
// Pass address within EEPROM in address.
// Pass pointer to buffer of bytes to write in buffer.
// Pass number of bytes to write in count.
// Returns true if successful, false if not.
bool I2CEEPROM::WriteBytes( UInt16 address, const UInt8 *buffer, UInt16 count ) {
#if 0
    bool ok = true;
    // Write enable EEPROM and wait a bit.
    digitalWrite( wp, LOW );
    delay( 1 );
    // Keep writing chunks until all bytes written.
    while( ( count > 0 ) && ok ) {
        if( count > CHUNK_SIZE ) {
            ok = WriteChunk( address, buffer, (UInt8)CHUNK_SIZE );
            address += CHUNK_SIZE;
            buffer += CHUNK_SIZE;
            count -= CHUNK_SIZE;
        }
        else {
            ok = WriteChunk( address, buffer, (UInt8)count );
            count = 0;
        }
        // Wait a lot to allow page to be written.
        delay( 6 );
    }
    // Write protect EEPROM.
    digitalWrite( wp, HIGH );
    // Return true on success.
    return ok;
#else
  return false;
#endif
}