I2C EEPROM programmer

Here is some code which demonstrates how to set up block data and write it to eeprom. You should be able to adapt it to your data.

//possible page boundary issue unless all writes at 16 bytes
#include <Wire.h>
#define ADDRESS 0x50 //Address of EEPROM

unsigned int memAddress = 0;//starting eeprom address
int totalBytes = 720;//total byte number multiple of 16
const byte blockLength = 16; //will avoid page boundary in eeprom
const byte numberOfBlocks = totalBytes/blockLength;

//test data visuallyto confirm pattern
//EDIT: correct declaration of byte fileData
byte fileData[][blockLength] =
{
  {0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0},
};

void setup() {
  Serial.begin(115200);
  Wire.begin();

  for (int i = 0; i <= numberOfBlocks - 1; i++)
  {
    writeBytes( ADDRESS, memAddress, fileData[i], blockLength);
    memAddress += blockLength;
  }

  memAddress = 0;//reset address for read

  for (int i = 0; i <= numberOfBlocks - 1; i++)
  {
    readBytes(ADDRESS, memAddress, blockLength);
    memAddress += blockLength;
  }
}

void loop() {}

void writeBytes(int device, unsigned int Address, byte* data, byte len)
{
  Wire.beginTransmission(device);
  Wire.write(Address >> 8 ); //MSB
  Wire.write(Address & 0xFF); // LSB
  Wire.write(data, len);
  Wire.endTransmission();
  delay(5);//small delay for eeprom to save data
}

void readBytes(int device, unsigned int Address, byte len )
{
  byte readBuffer[len];
  Wire.beginTransmission(device); // I2C address
  Wire.write(Address >> 8); // bit shift for high byte of pointer address
  Wire.write(Address & 0xFF); // mask for the low byte
  Wire.endTransmission();
  Wire.requestFrom(device, len);
  Wire.readBytes(readBuffer, len);
  for (byte j = 0; j < 16; j++)
  {
    Serial.print(readBuffer[j], HEX);
    Serial.print(" ");
  }
  Serial.println();
}

OUTPUT

FF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 FF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 FF 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 FF 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 FF 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 FF 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 FF 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 FF 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 FF 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 FF 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 FF 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 FF 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 FF 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 FF 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 FF 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 FF 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 FF 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 FF 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 FF 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 FF 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 FF 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 FF 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 FF 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 FF 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 FF 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 FF 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 FF 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 FF 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 FF 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 FF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
FF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 FF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 FF 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 FF 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 FF 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 FF 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 FF 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 FF 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 FF 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 FF 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 FF 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 FF 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 FF 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 FF 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 FF 0