mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu I2C


Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei, selbst ein I2C Lib zu schreiben. Naja die 
Funktionen fürs Senden funktionieren auch schon.

Hier der Quelltext:
#define START ?
#define CHECK ?
#define SCL_CLOCK 100000L

void i2c_init()
{
  TWSR = 0;              // no prescaler
    TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  // must be > 10 for stable operation
}

void i2c_start()
{
  TWCR = (1<<TWINT)|(1<<TWSTA)| (1<<TWEN);  //send start condition

  while (!(TWCR & (1<<TWINT)))  //wait till start condition has been sent
  {
  }

  //if ((TWSR & 0xF8) != START)    //check if start codition was succesfull - else call ERROR()
  //ERROR();
}

void i2c_write(uint8_t data)
{
  TWDR = data;  //load data to register

  TWCR = (1<<TWINT) | (1<<TWEN);  //start transmission

  while (!(TWCR & (1<<TWINT)))  //wait till transmission is finish
  {
  }

  //if ((TWSR & 0xF8) != CHECK)    //check if transmission was succesfull - else call ERROR()
  //ERROR();
}

void i2c_stop()
{
  TWCR = (1<<TWINT)|(1<<TWEN)| (1<<TWSTO);  //send stop condition
}

So. Das ganze habe ich auf einem ATmega32 getestet. Der Aufruf sieht so 
aus:
i2c_init();
i2c_start();
i2c_write(0xC2);  //send slave-adress
i2c_write(data);  //send data
i2c_stop();

Es tut auch ales soweit. Aber nur, wenn ich die if's auskommentiere. Das 
Problem dabei ist nämlich das ich nicht weiß, als was ich "START" und 
"CHECK" definieren muss.
Die Funktionen habe mit Hilfe des Datenblattes vom ATmega32 erstellt. 
Nur die Funktion i2c_init() habe ich soweit aus der Lib von Peter Fleury 
entnommen. Kann mir jemand erklären, was die genau macht? Setzt die die 
Übertragungsgeschwindigkeit?
Eins ist mir noch sehr unklar: wie empfange ich etwas über i2c? wie 
läuft das ab?

Gruß
Doran

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die sind zur Überprüfung des Status. Zumindest wenn ich mir die if 
Abfrage anschaue (hab die Fleury Lib noch nicht genutzt).

Schau mal auf Seite 184 / Table 74 bei Transmission Modes (Master 
Transmission Mode)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das Problem dabei ist nämlich das ich nicht weiß, als was ich "START" und
>"CHECK" definieren muss.

Table 74. Status Codes for Master Transmitter Mode

MfG Spess

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Antworten. Leider habe ich das noch nicht ganz 
verstanden...
Was bedeutet denn z.B. $20 ? ist das Hexadecimal? also 0x20 ?
Muss ich also nach dem Senden der Slaveadress mit dem 'if' checken,
ob (TWSR & 0xF8) = 0x18 ?

und nach dem Senden von Daten, ob (TWSR & 0xF8) = 0x20 ?

Wie lese ich denn was vom i2c?

Gruß

Doran

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doran S. schrieb:
> Was bedeutet denn z.B. $20 ? ist das Hexadecimal? also 0x20 ?

Ja das ist hex.

Doran S. schrieb:
> Muss ich also nach dem Senden der Slaveadress mit dem 'if' checken,
> ob (TWSR & 0xF8) = 0x18 ?

Müssen tust du nichts, aber an der Stelle würdest du schon feststellen, 
dass der Slave z.B. gar nicht da ist oder du die falsche Adresse 
angegeben hast. Dementsprechend kannst du darauf reagieren - meinetwegen 
mit einer "Fehler LED" oder was auch immer. Ich denke aber mal, das es 
hier eher 08h sein müsste, da du ja die START condition abwartest

Doran S. schrieb:
> und nach dem Senden von Daten, ob (TWSR & 0xF8) = 0x20 ?

Das wäre an der Stelle falsch. Je nach Kommunikationspartner wäre es 
eher 28h bzw. 30h.

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, ok, danke, aber was ist eigentlich das ACK oder NOT ACK ?

Gruß

Doran

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doran S. schrieb:
> Wie lese ich denn was vom i2c?
Die Adresse des Slave ist lediglich 7Bit lang, das 8. Bit gibt an, ob 
gelesen oder geschrieben werden soll. Lies dir im Wiki (hier und bei 
roboternetz) einfach mal die Grundlagen zu I2C durch. Da fehlt noch 
einiges bei dir.

Doran S. schrieb:
> ah, ok, danke, aber was ist eigentlich das ACK oder NOT ACK ?
>
> Gruß
>
> Doran

Wie gesagt, erst einmal lesen...

Das ACK/NACK hat unterschiedliche Bedeutungen. Dazu am besten in das 
Datenblatt des Slaves schauen. Nach dem Senden der Slave Adresse+R/W Bit 
"sagt" das ACK dir z.B. das der Slave bereit ist nun Daten zu empfangen 
(Master sendet an Slave bei W), bzw du "sagst" ihm, dass du nun bereit 
bist Daten entgegen zu nehmen (Slave sendet an Master bei R).

Bitte Lesen:
AVR TWI
http://www.rn-wissen.de/index.php/I2C

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.