One thing I learn these days is that you cannot mess with the I2C timing.
Looking at your code, I guess those hserouts are killing the protocol.
I'll take a closer look at everything else tomorrow.