Okay the one thing I know for sure is that as soon as I make a statement I will prove myself wrong.
The last email is erroneous. This is the best answer that I have from 2 more days of testing........
The I2C slave logic does not properly time the data to clock setup on the first bit (bit 7) shifted out.
When the slave writes to IICD it puts D7 onto the bus and releases the clock simultaneously. This violates a data setup time specified in the I2C specification of 4-5us for 100KHz mode or 0.6us for 400KHz mode.
You will not see this condition IF the slave releases SCL BEFORE the master releases SCL The difference in time must be the setup time you require.
You can see this if you delay the slave writing to the IICD until after the master releases SCL. In our case this was the difference between writing to IICD ASAP and calling a subroutine to supply the data. As always, your results will vary.
WHY IS THIS A PROBLEM?
We had code the was running for years and started a new development where all of sudden I2C reads did not work at all. The change was a reasonable change but IT DID NOT WORK. Because we violated the setup time the master erratically detected a STOP on the bus and failed to complete the transaction.
SOLUTION:
This is a real solution that should work ALL THE TIME without special timing considerations.
We have an extra port pin on the slave's SCL which we use to stretch SCL manually. When it is time to write to IICD (SCL is already low) we:
1. Drive SCL low via the port pin
2. Write to IICD. SDA will respond immediately but clock is held off by the port pin OR the master.
3. Wait desired setup time and release SCL via the port pin (make it an input)
The desired delay you choose can be I2C specified setup time but in all reality most devices will be happy as long as some setup is provided for SDA to SCL.
This solution will work for fast/slow masters or fastd/slow slaves. It is a robust fix.