Stelle hier bei Gelegenheit meine I2C-Master Softwareroutinen, falls jemand z.B. eine TWI als Slave benutzt und zusätzlich einen Master braucht :) Getestet habe ich das Interface mit DS1337 und ein paar I2C-EEPROMS. Falls Fragen aufkommen, bitte hier posten und keine Mails.
Hinweis: Der Autor steuert SCL nicht über Open-Collector an, sondern treibt SCL direkt. Dies entspricht nicht I2C-Spezifikationen und führt zu potentiellen Problemen u.A. bei Slaves, die Clock-Stretching betreiben. Im Fall der Slave den Clock verlangsamen will, versucht er diesen auf Low zu ziehen, was ihm bei Open-Collector über die Pullups auch gelingt. Bei diesem Code hier setzt der Master dagegen SCL, der als Ausgang betrieben wird, aktiv auf High, mit entsprechenden Auswirkungen auf die Hardware. Der relevante Teil des Codes:
1 | I2C_DDR |= (1<<SCL); |
2 | ...
|
3 | #define I2C_SCL_LOW I2C_PORT &= ~(1 << SCL)
|
4 | #define I2C_SCL_HIGH I2C_PORT |= (1 << SCL)
|
Sollte der Autor das noch lesen, so wär's schön wenn er seinen Code korrigiert.
Der Code funktioniert solange, bis man bei EEPROMs, die waehrend des internen Schreibvorganges jegliche Acknowledges verweigern, diese Acknowledges pollen will. In der Funktion "i2c_master_write" wird nach Uebertragung der acht Bits das Acknowledge des Slaves wie folgt abgefragt: // Auf ACK vom Slave Prüfen I2C_SDA_HIGH; i2c_master_clk_toggle(); if(SDA==1) { return 0; } else { return 1; } Das kann nicht funktionieren, da SDA mit "#define SDA PC7" eine Konstante ist und nicht fuer die Abfrage des SDA-Pins dienen kann. Hier eine Quick-and-Dirty Loesung, die keine genaue Ruecksicht auf das Timing nimmt: I2C_SDA_HIGH; S_DELAY; S_DELAY; S_DELAY; S_DELAY; I2C_SCL_HIGH; S_DELAY; S_DELAY; //Pin nach der positiven Flanke //abfragen if(PINC & (1 <<PC7)) { I2C_SCL_LOW; S_DELAY; return 0; } else { I2C_SCL_LOW; S_DELAY; return 1; } Gruss
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.