@Henry
Einige kleine Erlüterungen noch zum Code:
Mit i2c_init wird der Bus nach dem Reset des Controllers initialisiert.
i2c_reset erzeugt ein Bus-reset; nützlich bei Busfehlern
i2c_send und i2c_receive senden und empfangen Daten (jeweils vom Master
zum Slave gesehen). i2c_receive erlaubt das Senden einiger Bytes, z.B
Adressinformation, anschliessend weren die Daten vom addressierten
baustein gelesen. Beide Funktionen stossen lediglich die Kommunikation
an und kehren schnellstmöglich wieder zurück; der Rest der Busaktivit¨t
wird in Interrupts erledigt. So kann sich der Prozessor während einer
Busübertragung noch um andere Dinge kümmern.
Mit i2c_wait kann mann warten bis der Bus wieder frei ist (dann geht die
globale Variable i2c_status auf I2C_IDLE).
Die Schreibfunktionen existieren in einer blockierenden und einer
nicht-blockierenden Form. Erstere wrtet, bis das EEPROM beschrieben ist
und kehrt dann erst zurück, die zweite sendet nur den Schreibbefehl, der
Anwender muss dann selbst prüfen, wann das EEPROM wieder ansprechbar
ist. Die Bezeichnung ...Async ist etwas verwirrend, war aber in der
Projektplanung so vorgegeben :-;
Einige globle Variablen und Routinen, wie die Timerroutinen sind in
einem anderen Softwaremodul definiert, es sollte aber klar sein, wozu
sie dienen.
Ich erinnere mich noch dunkel, dass die Application Notes für den M16C
für eine veraltete Architektur geschrieben waren, schau mal bei den
Notes für den M32C nach, der hat das gleiche I2C-Interface wie der
M16C62P. Die Dokumentation ist meiner Meinung nach die grösste Schwäche
der Renesas-Teile, auch wenn Glyn versucht hat, daran zu arbeiten.
Ich hoffe, Dir ein wenig geholfen zu haben.
Mike