I can't get this code working right - I2C Protocol

Hi, I've been working today on a protocol to send data between a master and many slaves, the thing is that, I cannot receive the data properly, I mean, the slave, won't answer properly, these are my codes.

Master Code:

#include <Wire.h>

// Global Variables and definitions

#define DataRefreshSpeed 1000000

uint32_t Time;
uint32_t LastDataRefreshTime;


// Device Structure

struct Device_Structure
{
  bool Ready;
  
  uint8_t DeviceIdentifier;
  uint8_t Adress;
  
};

Device_Structure Device[16];


// I2C////

// Protocol Data Definitions
#define I2C_MaxBuffSize      256
#define I2C_Header1          246
#define I2C_Header2          254
#define I2C_MessageEnd1      250
#define I2C_MessageEnd2      232

//byte 1
#define SystemRequest   0
#define DataRequest     1

//System Request Messages
#define Handshake       0

//Device Id Definitions
#define CLOCK_DEVICE_ID 1


//Clock Request Messages 
#define PlayData 0

struct I2C_Request 
{
  bool Ready;
  uint8_t Message[10];
  uint8_t Size;
};
  
struct I2C_Struct
{
  bool H1;
  bool H2;
  bool EF1;
  bool DataRecieved;
  
  uint8_t Pointer;
  uint8_t Buffer[I2C_MaxBuffSize];
  I2C_Request Request;
};

I2C_Struct I2C;




void setup() 
{
  Serial.begin(115200);
  Wire.begin();
  DeviceStructures_Setup();
  I2C_Handshake(1);
}

void loop() 
{
  Time = micros();
  RefreshAllData(Time);
}

// Setup Functions

void   DeviceStructures_Setup()
{
  Device[ 0].Adress = 1;
  Device[ 1].Adress = 2;
  Device[ 2].Adress = 3;
  Device[ 3].Adress = 4;
  Device[ 4].Adress = 5;
  Device[ 5].Adress = 6;
  Device[ 6].Adress = 7;
  Device[ 7].Adress = 8;
  Device[ 8].Adress = 9;
  Device[ 9].Adress = 10;
  Device[10].Adress = 11;
  Device[11].Adress = 12;
  Device[12].Adress = 13;
  Device[13].Adress = 14;
  Device[14].Adress = 15;
  Device[15].Adress = 16;
}

// Loop Functions

void RefreshAllData(uint32_t t)
{
  if( t - LastDataRefreshTime > DataRefreshSpeed)
  {
    for(uint8_t i = 0; i< 16; i++)
    {
      if(Device[i].Ready)
      {
        switch(Device[i].DeviceIdentifier)
        {
          case CLOCK_DEVICE_ID: RequestClockData( PlayData, i); break;
          default: break;
        }
      }
    }
    LastDataRefreshTime = t;
  }
}

// I2C Functions

void I2C_Handshake(uint8_t x)
{
  uint8_t FailCount = 0;
  uint8_t MessageSize = 7;
  I2C_HandshakeRetry:
  uint8_t Message[7];

  Message[0] = I2C_Header1;         // Header1
  Message[1] = I2C_Header2;         // Header2
  Message[2] = SystemRequest;   // Type of Message 
  Message[3] = Handshake;       // MessageNumber
  Message[4] = 0;               // xxxxx
  Message[5] = I2C_MessageEnd1;     // First End Of message Flag
  Message[6] = I2C_MessageEnd2;     // Second End Of message Flag
  
  Wire.beginTransmission(Device[x].Adress);
  Wire.write(Message,MessageSize);
  Wire.requestFrom(Device[x].Adress,5);

  if(Wire.available())
  {
    uint8_t Message[5];
     
    Message[0] = Wire.read();
    Message[1] = Wire.read();
    Message[2] = Wire.read();
    Message[3] = Wire.read();
    Message[4] = Wire.read();

    if(Message[0] == I2C_Header1 & Message[1] == I2C_Header2 & Message[3] == I2C_MessageEnd1 & Message[4] == I2C_MessageEnd2) 
    { 
      String str;
      switch(Message[2])
      {
        case CLOCK_DEVICE_ID: str = "Clock"; Device[x].DeviceIdentifier = CLOCK_DEVICE_ID; Device[x].Ready = 1; break; 
      }
      Serial.print("Device ");Serial.print(Device[x].Adress);Serial.print(" - Properly Ennumerated as: ");
      Serial.print(str); Serial.println(".");
    } 
  }
  else
  {
    delay(100);
    FailCount ++;
    if(FailCount>5)
    {
      Serial.print("Handshake Timeout: Device - "); Serial.print(Device[x].Adress); Serial.println(".");
      return;
    }
    goto I2C_HandshakeRetry;
  }
  
  Wire.endTransmission();
}

void RequestClockData(uint8_t Message, uint8_t x)
{
  switch(Message)
  {
    case PlayData:

      uint8_t MessageASize  = 7;
      uint8_t MessageA[7];
    
      MessageA[0] = I2C_Header1;         // Header 1
      MessageA[1] = I2C_Header2;         // Header 2
      MessageA[2] = DataRequest;         // Type of Message 
      MessageA[3] = PlayData;            // MessageNumber
      MessageA[4] = 0;                   // xxxx
      MessageA[5] = I2C_MessageEnd1;     // First End Of message Flag
      MessageA[6] = I2C_MessageEnd2;     // Second End Of message Flag

      Wire.beginTransmission(Device[x].Adress);
      Wire.write(MessageA,MessageASize);
      Wire.requestFrom(Device[x].Adress,7);

      if(Wire.available())
      {
        uint8_t Message[7];
         
        Message[0] = Wire.read();
        Message[1] = Wire.read();
        Message[2] = Wire.read();
        Message[3] = Wire.read();
        Message[4] = Wire.read();
        Message[5] = Wire.read();
        Message[6] = Wire.read();

        Serial.println(Message[0]);
        Serial.println(Message[1]);
        Serial.println(Message[2]);
        Serial.println(Message[3]);
        Serial.println(Message[4]);
        Serial.println(Message[5]);
        Serial.println(Message[6]);
        Serial.println();
        Serial.println();
        
        if(Message[0] == I2C_Header1 & Message[1] == I2C_Header2 & Message[5] == I2C_MessageEnd1 & Message[6] == I2C_MessageEnd2) 
        {
          Serial.println("Succesfully Recieved Clock Data");
        }
      }
      
    break;
  }
}

I don't see the flag I2C.DataRecieved being cleared anywhere.