I reckon it's a rite of passage in the low level embedded world to write your own bit banged I2C master and slave code at some point ;-)
Once you've got basic blocking versions of each, for added points re-write them as non-blocking state machines. That's just the kind of project universities should do at undergrad level for EEs, it has real purpose, shows real understanding and is non-trivial.