First off, you have to make sure your device will SEND you three bytes when you ask for register 0x06. The data sheet will have this answer. Perhaps it wants you to make three calls, one to each address.
So, here is an example of something I've written that has been bulletproof for shuttling volumes of data around via I2C.
uint16_t M24LC256::ReadChunk(uint16_t location, uint16_t length, uint8_t* data)
{
uint16_t bytes_received = 0;
uint16_t bytes_requested = min(length,16);
Wire.beginTransmission(i2c_address);
Wire.send((uint8_t)(location >> 8));
Wire.send((uint8_t)(location & 0xff));
Wire.endTransmission();
Wire.requestFrom(i2c_address,bytes_requested);
uint16_t remaining = bytes_requested;
uint8_t* next = data;
while (Wire.available() && remaining--)
{
*next++ = Wire.receive();
++bytes_received;
}
return bytes_received;
}
It's a little more complex than your situation, but hopefully illustrative. This assumes that Wire.available() turns true immediately, and stays true the entire length of the receive() calls. I think the Wire.requestFrom() call blocks until all of the data is in the buffer, so available() is just giving you the state of internal buffers.