How to send multiple packages using I2C

Hello to everyone, I’m trying to set up a communication between an APM 2.5 (that runs on an Arduino Mega 2560) and an arduino due board using I2c: after an external trigger the APM should send 14 int16_t and 4 float (total number of bytes is 142+44=44), that are bigger than the I2c buffer, so I split them up in 2 packages but I’m not able to make the transmission working reliably: the only way to make it working properly is to disable and re-enable interrupts, but I have to avoid this, since I need to control 4 motors with PWM. I’m also using registry manipulation on the due to decrease digitalWrite time and I cannot make the APM working as a slave.

In the attached scripts I removed some unnecessary parts.
Could you please help me? what happens is that sometimes a new read is not performed, other times i have more than one read every request while some other times i cannot manage to receive data after the first time. How can i fix this?
Thanks to everyone

APM code (Master) Pr* are used by the master to know if the slave received or not the package, P1 and P2 are the two data packages. some functions are a bit different from the arduino standard ones, however there is no problem with them.

  void loop (){
  Read=false;
  Pr1=0;
  Pr2=0;
  while(1){
    if(((REQpin->read_latest())<300.0)){
      Read=false;
      break;
    }
    if (!Read){
      //READ SOME SENSORS AND CREATE THE TWO PACKAGES
      Read=true;
    }
      _i2c_sem = hal.i2c->get_semaphore();
      if (_i2c_sem->take(1)){
        hal.i2c->read(2,2,Pr);
        Pr1=Pr[0];
        Pr2=Pr[1];
        while ((!Pr1) || (!Pr2)) {
          if ((REQpin->read_latest())<300.0){
            Read=false;
            break;
          }
          if ((!Pr1)) {
            I2C_WriteAnything(P1);
            hal.i2c->read(2,2,Pr);
            Pr1=Pr[0];
            Pr2=Pr[1];
          }
          if ((Pr1) && (!Pr2)) {
            I2C_WriteAnything(P2);
            hal.i2c->read(2,2,Pr);
            Pr1=Pr[0];
            Pr2=Pr[1];
          }
        }
        _i2c_sem->give();
    }
  }
}

Arduino Due code (Slave)

void loop() {
  if ((micros() - ts_fast) >= T) {
    ts_fast = micros();
    bool done = false;
    while (!done) {
      //set request pin HIGH
      REG_PIOC_SODR|=(1<<25);
      if (DRDY) {
		//set request pin LOW
        REG_PIOC_CODR|=(1<<25);
        P1r = 0;
        P2r = 0;
        //do some operations on the received data
        DRDY = false;
      done = true;
      }
    }
  }

}
//----------This is the function executed on request---------//
void sendRec() {
    Wire.write(P1r);
    Wire.write(P2r);
}
//----------This is executed on receive---------//
void recP(int asd) {
    if (!P1r) {
      I2C_read(P1);
      P1r = 1;
    }
    else if (P1r && (!P2r)) {
      I2C_read(P2);
      P2r = 1;
      DRDY = true;
    }
}