Forum: Mikrocontroller und Digitale Elektronik Frage zu I2C


von Doran S. (utzer)


Lesenswert?

Hallo,

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

Hier der Quelltext:
1
#define START ?
2
#define CHECK ?
3
#define SCL_CLOCK 100000L
4
5
void i2c_init()
6
{
7
  TWSR = 0;              // no prescaler
8
    TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  // must be > 10 for stable operation
9
}
10
11
void i2c_start()
12
{
13
  TWCR = (1<<TWINT)|(1<<TWSTA)| (1<<TWEN);  //send start condition
14
15
  while (!(TWCR & (1<<TWINT)))  //wait till start condition has been sent
16
  {
17
  }
18
19
  //if ((TWSR & 0xF8) != START)    //check if start codition was succesfull - else call ERROR()
20
  //ERROR();
21
}
22
23
void i2c_write(uint8_t data)
24
{
25
  TWDR = data;  //load data to register
26
27
  TWCR = (1<<TWINT) | (1<<TWEN);  //start transmission
28
29
  while (!(TWCR & (1<<TWINT)))  //wait till transmission is finish
30
  {
31
  }
32
33
  //if ((TWSR & 0xF8) != CHECK)    //check if transmission was succesfull - else call ERROR()
34
  //ERROR();
35
}
36
37
void i2c_stop()
38
{
39
  TWCR = (1<<TWINT)|(1<<TWEN)| (1<<TWSTO);  //send stop condition
40
}

So. Das ganze habe ich auf einem ATmega32 getestet. Der Aufruf sieht so 
aus:
1
i2c_init();
2
i2c_start();
3
i2c_write(0xC2);  //send slave-adress
4
i2c_write(data);  //send data
5
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

von Remote O. (remote1)


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)

von spess53 (Gast)


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

von Doran S. (utzer)


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

von Remote O. (remote1)


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.

von Doran S. (utzer)


Lesenswert?

ah, ok, danke, aber was ist eigentlich das ACK oder NOT ACK ?

Gruß

Doran

von Remote O. (remote1)


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

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
Noch kein Account? Hier anmelden.