TWI Acknowledge Probleme

OP #771363
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
#771373
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. !

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