I2C freezes arduino

I have "solved" it with a counter timeout in all "while" loops. Now Arduino doesn't freezes, but I cannot found, there is no way to initialize or recover again the I2C Network without Reset Arduino.

I handle this pretty much the way you suggest (using a 5000 microseconds timeout), but when a state timeout is detected (assuming a bus issue), I call twi_init. For this to be effective, you also need to add the following statement to the top of twi_init:

void twi_init(void)
{
  // disable twi module (to allow for reinitialize)
  TWCR = 0;

  // ... original code follows

  // initialize state
  twi_state = TWI_READY;