Что-то ты каким-то "судорогом" занимаешься. Новая реализация I2C
практически сама всё делает. В первом пакете ставишь START и RELOAD если читать больше 255 байт. В остальных без START. Когда читать остаётся меньше 256 байт - ставишь AUTOEND вместо RELOAD.
Если упрощённо, то как-то так.

Ожидание RXNE делаешь с контролем ошибок и антизависанием, но это совсем другая история.