Цитата
while(in_sda());
Во время подачи клока, по одному фронту производится выставление данных передатчиком(в данном случае мастером), а по другому фронту - считывание приемником ( в данном случае слейвом)!
Ждать до бесконечности появления нуля на шине SDA (ACK)
НЕЛЬЗЯ, т.к. при подаче фронта SCL слейв
ОБЯЗАН выставить ACK, иначе это говорит об отсутствии устройства (слейва) на шине!
Посмотри осциллографом физическое наличие сигнала АСК на шине.
Еще вопрос - какие-либо прерывания в программе используются ?