Forum: Mikrocontroller und Digitale Elektronik TWI Acknowledge Probleme


von Marco G. (ocram12)


Lesenswert?

Hallo zusammen,

ich möchte zwischen zwei Atmega 32 eine TWI implementieren.
Den Code für den Master habe ich von Peter Fleury übernommen.
Die nötigen Einstellungen wurden vorgenommen.
Das sollte so auch klappen.

Mein Problem liegt (wie bei so vielen) auf der Slave – Seite.

Nach meinem Verständnis müsste der Master die Adresse vom Slave 
übertragen.
Danach kommt das Bit für die Entscheidung R/W.
Hiernach muss der Slave das nächste Bit (Nummer 9) auf low ziehen. 
Hieraus
sieht dann der Master, ob die Übertragung angekommen ist, oder nicht.
Wenn schon hier Fehler in meinen Überlegungen sind, für Denkanstöße bin 
ich immer zu haben.

Auf dem Scop sehe ich das Bitmuster: 000011101. Kann leider kein plott 
erzeugen.

Daraus ersehe ich ja schon einmal, das die Adresse (0x07) richtig 
übertragen wird. Danach kommt auch richtig das 8. Bit für „write“.
Aber wie bekomme ich auf der Slave – Seite das 9. Bit auf „low“?

Für den Acknowledge pulse ist ja das Bit 6 TWEA im TWCR Register 
zuständig.
Jetzt habe ich in UP ACK dieses Bit auf 1 gesetzt.(+ natürlich TWINT 
auch auf 1)
Aber auf dem Scop ist Bit 9 immer noch auf high.
Währe sehr nett, wenn ihr mir bei diesem Problem helfen könntet.
Danke.



Die Initialisierung sollte so stimmen.

void init_i2c(unsigned char addr)
{
TWAR = (addr << 1);
TWCR =(1 << TWEA) | (1 << TWEN) ;
TWCR = ~((1 << TWSTA) || (1 << TWSTA));
}

void  Ack (void)
{
TWCR = (1<<TWINT)|(1<<TWEN);
TWCR = ~(1 << TWEA);
while (!(TWCR & (1<<TWINT)));
}

void main_S (void)
{
  init_i2c(0x07);

  while (1)
  {
  while (!(TWCR & (1 << TWINT)));
  if (TWSR == 0x60)
    {
    Ack();
    }
  }//while(1)
}// main

von John S. (linux_80)


Lesenswert?

Hi,
ich würde sagen bei dieser Initialisierung haut das nicht hin, schmeiss 
die 2. Zeile raus mit dem STA und STA ;-), die muss man nicht extra 
löschen, wenn sie voher garnicht gesetzt wurden, und ohne | schon 
garnicht !

Ausserdem muss man in TWCR alle Bits auf einmal setzen, denn TWI legt 
gleich los wenn TWINT gesetzt wird, da kommt die 2. Zeile immer zu spät, 
und ohne | wird das sowieso nix !

Nachtrag:
mit TWCR keine Bitmanipulationen per |= machen, da kommt der TWI nur 
durcheinander, immer alle Bits angeben die man haben will, nix vorher 
einlesen usw. !

von Marco G. (ocram12)


Lesenswert?

Das ging ja mal schnell.
Werde die Änderungen heute ausprobieren.
Danke Tiny 80!

von Marco G. (ocram12)


Lesenswert?

super, hat alles geklappt.
Hatte noch einen Hardwarefehler auf den Platinen.
Zwischen den Ltg. war noch ein 10k wid. eingebaut.
Das ergab natürlich einen sehr schönen Spannungsteiler.
Dadurch war das Signal immer zwischen 4V und 5V.
Somit niemals als Low erkannt.

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.