I've been fighting this for awhile and was very happy to see your post with the cause - but, I went back through my code and everywhere I set a START the BUSY bit is checked:
while( (IIC1S_BUSY == TRUE) && !TimerHasExpired(TimerIIC))
{
__RESET_WATCHDOG();
}
I don't see the BUSY bit locked up every time - it has actually gone weeks without locking up, but it will eventually lock up and I have to toggle the IIC_EN bit off and on to get it un-wedged.
Has there ever been any official reply from Freescale?