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

Committer:
RichardE
Date:
Tue Jun 04 20:16:33 2013 +0000
Revision:
0:5fa232ee5fdf
Started conversion from Maple version of game. So far Gameduino seems to have been initialised OK and just displays a sign on message. Lots of commented out code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 0:5fa232ee5fdf 1 /*
RichardE 0:5fa232ee5fdf 2 * SOURCE FILE : I2CEEPROM.cpp
RichardE 0:5fa232ee5fdf 3 *
RichardE 0:5fa232ee5fdf 4 * Definition of class I2CEEPROM.
RichardE 0:5fa232ee5fdf 5 * Rountines for communicating with a serial EEPROM over an I2C link.
RichardE 0:5fa232ee5fdf 6 * EEPROM in question is a Microchip 24AA512.
RichardE 0:5fa232ee5fdf 7 * Remember you need pullup resistors on the SCL, SDA and WP lines.
RichardE 0:5fa232ee5fdf 8 *
RichardE 0:5fa232ee5fdf 9 */
RichardE 0:5fa232ee5fdf 10
RichardE 0:5fa232ee5fdf 11 #include "I2CEEPROM.h"
RichardE 0:5fa232ee5fdf 12
RichardE 0:5fa232ee5fdf 13 /***************/
RichardE 0:5fa232ee5fdf 14 /* CONSTRUCTOR */
RichardE 0:5fa232ee5fdf 15 /***************/
RichardE 0:5fa232ee5fdf 16 I2CEEPROM::I2CEEPROM() :
RichardE 0:5fa232ee5fdf 17 isOpen( false ),
RichardE 0:5fa232ee5fdf 18 // wire( (TwoWire*)NULL ),
RichardE 0:5fa232ee5fdf 19 wp( 8 )
RichardE 0:5fa232ee5fdf 20 {
RichardE 0:5fa232ee5fdf 21 }
RichardE 0:5fa232ee5fdf 22
RichardE 0:5fa232ee5fdf 23 /**************/
RichardE 0:5fa232ee5fdf 24 /* DESTRUCTOR */
RichardE 0:5fa232ee5fdf 25 /**************/
RichardE 0:5fa232ee5fdf 26 I2CEEPROM::~I2CEEPROM() {
RichardE 0:5fa232ee5fdf 27 }
RichardE 0:5fa232ee5fdf 28
RichardE 0:5fa232ee5fdf 29 /**************************************/
RichardE 0:5fa232ee5fdf 30 /* PREPARE TO COMMUNICATE WITH EEPROM */
RichardE 0:5fa232ee5fdf 31 /**************************************/
RichardE 0:5fa232ee5fdf 32 // Pass pointer to TwoWire object to use for I2C communications
RichardE 0:5fa232ee5fdf 33 // which should have been initialised and opened before calling this.
RichardE 0:5fa232ee5fdf 34 // Pass 3 bit address of EEPROM (as set by A0, A1 and A2 pins) in ea.
RichardE 0:5fa232ee5fdf 35 // Pass pin number to use for write protect in wp.
RichardE 0:5fa232ee5fdf 36 #if 0
RichardE 0:5fa232ee5fdf 37 void I2CEEPROM::Open( TwoWire *wire, UInt8 ea, UInt8 wp ) {
RichardE 0:5fa232ee5fdf 38 if( ! isOpen ) {
RichardE 0:5fa232ee5fdf 39 // Save pointer to TwoWire object.
RichardE 0:5fa232ee5fdf 40 this->wire = wire;
RichardE 0:5fa232ee5fdf 41 // Calculate slave address.
RichardE 0:5fa232ee5fdf 42 slaveAddress = (UInt8)( ( ea & 0x7 ) | 0x50 );
RichardE 0:5fa232ee5fdf 43 // Save write protect pin number.
RichardE 0:5fa232ee5fdf 44 this->wp = wp;
RichardE 0:5fa232ee5fdf 45 // Configure write protect pin as open drain output.
RichardE 0:5fa232ee5fdf 46 pinMode( wp, OUTPUT_OPEN_DRAIN );
RichardE 0:5fa232ee5fdf 47 // Write protect EEPROM.
RichardE 0:5fa232ee5fdf 48 digitalWrite( wp, HIGH );
RichardE 0:5fa232ee5fdf 49 isOpen = true;
RichardE 0:5fa232ee5fdf 50 }
RichardE 0:5fa232ee5fdf 51 }
RichardE 0:5fa232ee5fdf 52 #endif
RichardE 0:5fa232ee5fdf 53
RichardE 0:5fa232ee5fdf 54 /*********************************************/
RichardE 0:5fa232ee5fdf 55 /* SHUT DOWN COMMUNICATIONS LINK WITH EEPROM */
RichardE 0:5fa232ee5fdf 56 /*********************************************/
RichardE 0:5fa232ee5fdf 57 void I2CEEPROM::Close( void ) {
RichardE 0:5fa232ee5fdf 58 isOpen = false;
RichardE 0:5fa232ee5fdf 59 }
RichardE 0:5fa232ee5fdf 60
RichardE 0:5fa232ee5fdf 61 // Size of each chunk read or written.
RichardE 0:5fa232ee5fdf 62 #define CHUNK_SIZE ( WIRE_BUFSIZ - 2 )
RichardE 0:5fa232ee5fdf 63
RichardE 0:5fa232ee5fdf 64 /************************************/
RichardE 0:5fa232ee5fdf 65 /* ATTEMPT TO READ A CHUNK OF BYTES */
RichardE 0:5fa232ee5fdf 66 /************************************/
RichardE 0:5fa232ee5fdf 67 // Pass address within EEPROM in address.
RichardE 0:5fa232ee5fdf 68 // Pass pointer to buffer for bytes read in buffer.
RichardE 0:5fa232ee5fdf 69 // Returns false if a failure occurred whilst reading EEPROM.
RichardE 0:5fa232ee5fdf 70 // Pass number of bytes to read in count.
RichardE 0:5fa232ee5fdf 71 // Returns true if successful, false if not.
RichardE 0:5fa232ee5fdf 72 // The number of bytes read must not exceed CHUNK_SIZE.
RichardE 0:5fa232ee5fdf 73 bool I2CEEPROM::ReadChunk( UInt16 address, UInt8 *buffer, UInt8 count ) {
RichardE 0:5fa232ee5fdf 74 #if 0
RichardE 0:5fa232ee5fdf 75 // First send address you want to read from.
RichardE 0:5fa232ee5fdf 76 wire->beginTransmission( slaveAddress );
RichardE 0:5fa232ee5fdf 77 // Add high byte of EEPROM address to read from.
RichardE 0:5fa232ee5fdf 78 wire->send( ( address >> 8 ) & 0xFF );
RichardE 0:5fa232ee5fdf 79 // Add low byte of EEPROM address to read from.
RichardE 0:5fa232ee5fdf 80 wire->send( address & 0xFF );
RichardE 0:5fa232ee5fdf 81 // Send the packet and return false on failure.
RichardE 0:5fa232ee5fdf 82 if( wire->endTransmission() != SUCCESS ) {
RichardE 0:5fa232ee5fdf 83 return false;
RichardE 0:5fa232ee5fdf 84 }
RichardE 0:5fa232ee5fdf 85 // Now read back data.
RichardE 0:5fa232ee5fdf 86 wire->requestFrom( slaveAddress, count );
RichardE 0:5fa232ee5fdf 87 UInt16 readCount = 0;
RichardE 0:5fa232ee5fdf 88 while( ( wire->available() > 0 ) && ( readCount < count ) ) {
RichardE 0:5fa232ee5fdf 89 *buffer++ = wire->receive();
RichardE 0:5fa232ee5fdf 90 readCount++;
RichardE 0:5fa232ee5fdf 91 }
RichardE 0:5fa232ee5fdf 92 return true;
RichardE 0:5fa232ee5fdf 93 #else
RichardE 0:5fa232ee5fdf 94 return false;
RichardE 0:5fa232ee5fdf 95 #endif
RichardE 0:5fa232ee5fdf 96 }
RichardE 0:5fa232ee5fdf 97
RichardE 0:5fa232ee5fdf 98 /*************************************/
RichardE 0:5fa232ee5fdf 99 /* ATTEMPT TO READ A NUMBER OF BYTES */
RichardE 0:5fa232ee5fdf 100 /*************************************/
RichardE 0:5fa232ee5fdf 101 // Pass address within EEPROM in address.
RichardE 0:5fa232ee5fdf 102 // Pass pointer to buffer for bytes read in buffer.
RichardE 0:5fa232ee5fdf 103 // Returns false if a failure occurred whilst reading EEPROM.
RichardE 0:5fa232ee5fdf 104 // Pass number of bytes to read in count.
RichardE 0:5fa232ee5fdf 105 // Returns true if successful, false if not.
RichardE 0:5fa232ee5fdf 106 bool I2CEEPROM::ReadBytes( UInt16 address, UInt8 *buffer, UInt16 count ) {
RichardE 0:5fa232ee5fdf 107 #if 0
RichardE 0:5fa232ee5fdf 108 bool ok = true;
RichardE 0:5fa232ee5fdf 109 // Keep reading chunks until all bytes read.
RichardE 0:5fa232ee5fdf 110 while( ( count > 0 ) && ok ) {
RichardE 0:5fa232ee5fdf 111 if( count > CHUNK_SIZE ) {
RichardE 0:5fa232ee5fdf 112 ok = ReadChunk( address, buffer, (UInt8)CHUNK_SIZE );
RichardE 0:5fa232ee5fdf 113 address += CHUNK_SIZE;
RichardE 0:5fa232ee5fdf 114 buffer += CHUNK_SIZE;
RichardE 0:5fa232ee5fdf 115 count -= CHUNK_SIZE;
RichardE 0:5fa232ee5fdf 116 }
RichardE 0:5fa232ee5fdf 117 else {
RichardE 0:5fa232ee5fdf 118 ok = ReadChunk( address, buffer, (UInt8)count );
RichardE 0:5fa232ee5fdf 119 count = 0;
RichardE 0:5fa232ee5fdf 120 }
RichardE 0:5fa232ee5fdf 121 }
RichardE 0:5fa232ee5fdf 122 // Return true on success.
RichardE 0:5fa232ee5fdf 123 return ok;
RichardE 0:5fa232ee5fdf 124 #else
RichardE 0:5fa232ee5fdf 125 return false;
RichardE 0:5fa232ee5fdf 126 #endif
RichardE 0:5fa232ee5fdf 127 }
RichardE 0:5fa232ee5fdf 128
RichardE 0:5fa232ee5fdf 129 /**************************************/
RichardE 0:5fa232ee5fdf 130 /* ATTEMPT TO WRITE A CHUNK TO EEPROM */
RichardE 0:5fa232ee5fdf 131 /**************************************/
RichardE 0:5fa232ee5fdf 132 // Pass address within EEPROM in address.
RichardE 0:5fa232ee5fdf 133 // Pass pointer to buffer of bytes to write in buffer.
RichardE 0:5fa232ee5fdf 134 // Pass number of bytes to write in count.
RichardE 0:5fa232ee5fdf 135 // Returns true if successful, false if not.
RichardE 0:5fa232ee5fdf 136 // The number of bytes written must not exceed CHUNK_SIZE.
RichardE 0:5fa232ee5fdf 137 bool I2CEEPROM::WriteChunk( UInt16 address, const UInt8 *buffer, UInt8 count ) {
RichardE 0:5fa232ee5fdf 138 #if 0
RichardE 0:5fa232ee5fdf 139 // First send address you want to write to.
RichardE 0:5fa232ee5fdf 140 wire->beginTransmission( slaveAddress );
RichardE 0:5fa232ee5fdf 141 // Add high byte of EEPROM address to write to.
RichardE 0:5fa232ee5fdf 142 wire->send( ( address >> 8 ) & 0xFF );
RichardE 0:5fa232ee5fdf 143 // Add low byte of EEPROM address to write to.
RichardE 0:5fa232ee5fdf 144 wire->send( address & 0xFF );
RichardE 0:5fa232ee5fdf 145 // Add buffer bytes.
RichardE 0:5fa232ee5fdf 146 wire->send( (uint8*)buffer, count );
RichardE 0:5fa232ee5fdf 147 // Send the packet.
RichardE 0:5fa232ee5fdf 148 // Return true if successful.
RichardE 0:5fa232ee5fdf 149 return ( wire->endTransmission() == SUCCESS );
RichardE 0:5fa232ee5fdf 150 #else
RichardE 0:5fa232ee5fdf 151 return false;
RichardE 0:5fa232ee5fdf 152 #endif
RichardE 0:5fa232ee5fdf 153 }
RichardE 0:5fa232ee5fdf 154
RichardE 0:5fa232ee5fdf 155 /**************************************/
RichardE 0:5fa232ee5fdf 156 /* ATTEMPT TO WRITE A NUMBER OF BYTES */
RichardE 0:5fa232ee5fdf 157 /**************************************/
RichardE 0:5fa232ee5fdf 158 // Pass address within EEPROM in address.
RichardE 0:5fa232ee5fdf 159 // Pass pointer to buffer of bytes to write in buffer.
RichardE 0:5fa232ee5fdf 160 // Pass number of bytes to write in count.
RichardE 0:5fa232ee5fdf 161 // Returns true if successful, false if not.
RichardE 0:5fa232ee5fdf 162 bool I2CEEPROM::WriteBytes( UInt16 address, const UInt8 *buffer, UInt16 count ) {
RichardE 0:5fa232ee5fdf 163 #if 0
RichardE 0:5fa232ee5fdf 164 bool ok = true;
RichardE 0:5fa232ee5fdf 165 // Write enable EEPROM and wait a bit.
RichardE 0:5fa232ee5fdf 166 digitalWrite( wp, LOW );
RichardE 0:5fa232ee5fdf 167 delay( 1 );
RichardE 0:5fa232ee5fdf 168 // Keep writing chunks until all bytes written.
RichardE 0:5fa232ee5fdf 169 while( ( count > 0 ) && ok ) {
RichardE 0:5fa232ee5fdf 170 if( count > CHUNK_SIZE ) {
RichardE 0:5fa232ee5fdf 171 ok = WriteChunk( address, buffer, (UInt8)CHUNK_SIZE );
RichardE 0:5fa232ee5fdf 172 address += CHUNK_SIZE;
RichardE 0:5fa232ee5fdf 173 buffer += CHUNK_SIZE;
RichardE 0:5fa232ee5fdf 174 count -= CHUNK_SIZE;
RichardE 0:5fa232ee5fdf 175 }
RichardE 0:5fa232ee5fdf 176 else {
RichardE 0:5fa232ee5fdf 177 ok = WriteChunk( address, buffer, (UInt8)count );
RichardE 0:5fa232ee5fdf 178 count = 0;
RichardE 0:5fa232ee5fdf 179 }
RichardE 0:5fa232ee5fdf 180 // Wait a lot to allow page to be written.
RichardE 0:5fa232ee5fdf 181 delay( 6 );
RichardE 0:5fa232ee5fdf 182 }
RichardE 0:5fa232ee5fdf 183 // Write protect EEPROM.
RichardE 0:5fa232ee5fdf 184 digitalWrite( wp, HIGH );
RichardE 0:5fa232ee5fdf 185 // Return true on success.
RichardE 0:5fa232ee5fdf 186 return ok;
RichardE 0:5fa232ee5fdf 187 #else
RichardE 0:5fa232ee5fdf 188 return false;
RichardE 0:5fa232ee5fdf 189 #endif
RichardE 0:5fa232ee5fdf 190 }
RichardE 0:5fa232ee5fdf 191