von HiassofT » Do 24. Jan 2008, 15:51
robbifan hat geschrieben:Wenn Du Interesse hast, krame ich mal meinen Sourcecode für den I2C Stack raus.
das wäre super, wenn du das machen würdest.
mfg
So, habe jetzt noch ein paar Kommentare hinzugefügt und den Sourcecode hochgeladen:
http://www.horus.com/~hias/tmp/atari-i2c-0.10.zip
Der Code ist im ATasm Format, Du kannst ihn direkt am PC assemblieren (siehe auch das Makefile, oder einfach direkt auf der Kommandozeile "atasm -r -otest.atr test.src" eingeben).
Das "test.src" File ist ein einfaches Test-Programm für den RTC Chip den Guus verbaut hat. Nimm es einfach als Beispiel-Programm her (auch wenn Du damit nicht direkt was anfangen kannst).
Die eigentlich wichtigen Files sind "i2c.inc" und "i2c.src".
Im i2c.inc sind die PIA Port-Bits für SDA und SCL definiert. Default ist PA7 (Pin 4 des 2. Joystickports) für SCL und PA6 (Pin 3 des 2. Joystickports) für SDA. Wenn Du andere Pins verwenden willst musst Du die Definitionen "SCLBIT" bzw "SDABIT" ändern. Falls es Probleme mit der I2C Kommunikation gibt, probiere mal "DELAYC" etwas zu erhöhen, dann wird etwas langsamer übertragen.
Die SDA und SCL der I2C Slaves kannst Du nun einfach an die Pins des Joystickports anschliessen. Vergiss aber nicht die Pull-Ups in den Leitungen (10k oder 4k7 gehen gut).
Nun zum wesentlichen, den Routinen in "i2c.src". Am Anfang des Files habe ich die wichtigsten Sachen beschrieben, hier noch mal eine kurze Zusammenfassung auf Deutsch:
Ganz zu Beginn musst Du "INIT" aufrufen. Damit werden die beiden PIA Leitungen auf Output geschaltet.
Nun kannst Du mit "RDBYT" bzw "WRBYT" Daten übertragen. Beim Senden musst Du die Bytes im "I2CDATA" Buffer ablegen (der ist in i2c.src definiert und fasst zZt maximal 8 Bytes, Du kannst ihn aber natürlich irgendwo anders hin verschieben uder auch grösser machen). Beim Empfangen werden die Daten ebenfalls in diesem Buffer abgelegt.
Vor dem Aufruf von RDBYT/WRBYT musst Du folgende CPU-Register setzen:
- A = Anzahl der zu übertragenden Bytes
- X = Slave Addresse des I2C Geräts (das unterste Bit sollte 0 sein, wird von den Routinen dann automatisch gesetzt, je nach dem ob gelesen oder geschrieben wird)
- Y = (Start-) Adresse des I2C Registers im I2C Gerät.
Nach dem Aufruf von RDBYT/WRBYT zeigt das Carry Flag an, ob die Übertragung erfolgreich war. War alles OK, so ist das Carry Flag gelöscht, bei einem Fehler ist es gesetzt.
Wenn Du Dein Programm beendest rufe vorher noch die Routine "EXIT" auf, damit werden dann die PIA Pins alle wieder auf Input zurück geschaltet.
so long,
Hias