Hallo,
ich habe nur kurz drübergeschaut. Dabei ist mir allerdings das Folgende
aufgefallen:
Lass die i2c_init() Aufrufe innerhalb der Funktionen weg. Der Aufruf
gehört einmal an den Anfang des Programms. Sonst kostet das nur
(zugegebenermaßen ein wenig) Zeit.
Ohne ins Datenblatt von verwendeten EEPROM zu schauen: Nachdem eine Page
beschrieben wurde: warum i2c_stop() und dann wieder i2c_start()? Wäre da
i2c_rep_start() nicht angebracht. Hat Vorteile, denn erstens geht es
minimal schneller (aber wirklich nur einige Takte). Zweitens: wenn du
I2C als Multimaster betreibst, dann kann es so zu Arbitrierungsfehlern
während der Übertragung kommen.
Generell wären Kommentare (mehr als READ und WRITE) schön. Weil mir als
unbedarftem Leser wird nicht überall klar, warum etwas gemacht wird.
So was wie 0b10100000 sollte man noch in ein aussagekräftiges Define
verpacken.
Ich hoffe dir hilft das ein bisschen :-)
Mit freundlichen Grüßen,
N.G.