I have a I2C Master, it is a Arduino Mega2560 with Ethernet Shield.
That Arduino Mega has a 5V I2C bus and a 3.3V I2C bus using a level shifter.
The Arduino Mega runs a website on a microSD card, updates to ThingSpeak.com and get the NTP time. When a certain webpage is shown, data is requested from the I2C Slaves for the page.
The Slaves have both the onRequest and onReceive handlers.
For one Slave, I can read and write the EEPROM via I2C (writing is very slow).
It works well… but it has a disadvantage. When I want to change a sensor value on the webpage, I sometimes have to update three things: the website on the microSD card; the sketch for the Mega; the sketch for the Slave.
I only use the Wire library. The Wire library is blocking for some situations. When I had a shortcut between the SDA and SCL, the Arduino Mega was not running anymore. But I keep on using the Arduino Wire library.
I encoutered a bug in the Wire library. Adding a delay solved it.