Basicamente, cuando haces i2c_read, el programa esperará a que haya un byte a ser recibido. No se que pic/dspic usas, pero la dinamica es la misma siempre. Se activa un flag de recepcion, y se espera a que se baje, que será cuando ya se haya recibido todo el byte. Entonces se coge el contenido del registro de recepcion.
El restart_wdt tiene que ser continuo, pues la espera al dato puede ser mas o menos larga. Si el esclavo tardara demasiado en mandar, el wdt podria ladrar y resetear el trasto.
Un saludo