Q:

Dynamic I²C address

I'm having a problem with a system I'm designing that should support multiple modules, these modules communicate over the I²C bus and all have their own micro-controller which takes care of their own address.
As I don't want the users to have to specify the address using dip-switches, the micro-controller should detect the assigned address (in EEPROM) and if it's the default address it should query the master for a unique address. This works when you connect only one module at a time, but when all the modules are connected at once they will all listen to the same address. 
Therefore, I thought of using a I²C repeater (PCA9514adp, or similar), which I can enable or disable (which will basically disable the SDA/SCL out of the IC). The micro-controller will disable the bus when it detects the default I²C address and after querying the master for a unique address it will reset and open the bus so that the next module can request a unique address.
The problem I'm having now is that the data-sheet specifies that I shouldn't use more than 3 repeater on the bus and that's simply not enough so I guess that idea can be put in the bin...
So I guess my question is: how can I disable the I²C bus, so that only one module listens to the default I²C address at the same time, but without the limitations of the I²C repeater?

A:

This can be done, but it requires that you support multi-master arbitration on your I2C bus.
In order to explain, I need to make a distictiion between your application's "system master" device and any device that may be functioning as an I2C master at a given time.
All devices, including your system master, need to be capable of operating as both I2C masters and I2C slaves.
The system master would respond (as an I2C slave) to a single reserved address. Each of the other devices, when it comes online, would execute a transaction (as an I2C master) to that reserved address to get its own slave address assignment. Thereafter, the system master would use that assigned address (as I2C master) to access that device (as I2C slave).

A:

Since you were thinking of using an I²C repeater (PCA9514adp), it would be easier to use a handshake signal that depends upon connection order. This would be daisy chained, so two pins, an input (from previous) and an output (to next).

