Frage zu I2C

OP #1804253
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
OP #1804824
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
#1804842
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.
#1804865
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren