www.mikrocontroller.net

Forum: Projekte & Code I2C-Master [ohne TWI (Softwarelösung) für die ATMEGAs


Autor: Artur Funk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Artur Funk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bemerkungen:
Sprache: C
Gepackt: WinRAR

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
I2C_DDR |=  (1<<SCL);
...
#define I2C_SCL_LOW  I2C_PORT &= ~(1 << SCL)
#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.

Autor: Carl Rheinländer (Firma: CC-Software) (carl_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.