Hi all,
I have seen similar problems in the forum but not yet any solutions.
In short: I initialize the I2C Routine and start communicating with two slaves. Master is lm4f230h5qr, slaves are bq77pl900 (internal 10k pullups) and bq34z100. At first the communication is ok, but if there is any interruption on the lines (emc noise) the communications hangs up and only the start pulses can be seen on the bus.
Difference to other problems: The scl and sda linese are high. Also the communication does not time out (bus busy is set to 0 within the time), also the function I2CMasterErr does not report any problems. The software runs as if the communication was ok.
The values however are bad, and on the oscilloscope i can see only start-conditions.
I had a similar problem, when I tried pulling the scl line low on the eval-board, but that could be fixed by a peripheral reset.
I also added a function that disables the i2c and sends up to 16 clock signals on the bus before restarting. Still to no avail. (Might add, that in this case neither sda or scl are externally pulled low by the slaves, therefore a slave hang is improbable) .
Also a software-reset in the debugger does not help, if the communication has been lost once. Only a hardware reset solved the problem. Therefore either a slave is the culprit or the i2c hardware has a problem.
All Routines except the direct scl-clocking in an error case use the Stellarisware Routines. the direct scl-clocking is also only started in debug mode by setting a bit, so it does not interfere in the normal routine. Also this whole problem could be observed in debug modes as well as in free running mode via oscilloscope.
I attached two pictures, the first is the scope after a hardware reset, the second is the scope after the hangup. This keeps repeating with each supposed communication until a hardware reset.