Поделюсь идеями по поводу I2C.
1. После STOP надо обязательно дернуть клок SCL 1 раз вниз-вверх при SDA=1. Иначе RTL отвечает только на первый запрос, все последущие он игнорирует.
2. При записи регистра последний NACK от RTL лучше не контролировать, т.к. при этом процент успешных записей гораздо выше.
3. Возможно это ошибки в разводке платы, но регистры записываются и читаются не гарантированно. После записи лучше прочитать содержимое, давать несколько попыток на успешную запись.
Так и не понял от чего это зависит, менял и задержки и тактовую частоту - примерно одна и та же картина, около 20% ошибок доступа.
В исходниках
protoss кажется есть ошибка - в функции SW_Put, SDA ставится в 0 и потом читается ACK с шины, естественно он всегда будет 0:
Код
/* Get ACK(NACK) */
ClrSDA();
Delay();
SetSCL();
Delay();
i = RTL83X6_PIN & RTL83X6_SDA;
ClrSCL();
Delay();
return i;