mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI (mega8) slave-transmit problem


Autor: Bernd Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes steckt in meiner main Funktion:
        TWAR = (SLAVEADDR << 1);
        TWCR = _BV(TWEN) | _BV(TWEA);

        for (;;) {
                while ((TWCR & _BV(TWINT)) == 0);
                TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWEA);
        }

Jetzt habe ich das Problem, daß jedesmal wenn ein Zugriff SLA+R erfolgt
anschließend der Slave die SDA Leitung dauerhaft auf 0 zieht.
Bei einem SLA+W Zugriff ist alles OK und ich bekomme einen sauberen Ack
auf Zugriff und der Bus ist danach wieder verfügbar.
Ein langwieriger Vergleich mit einer Software, die funktioniert, ergab,
daß das Problem durch den Wert von SLAVEADDR ausgelöst wird.
Ein Wert <=63 ist OK ein Wert >=64 zeigt das beschriebene Problem.
Im Disassembler sieht das so aus:
Wert = 64:
  62:   80 e8           ldi     r24, 0x80       ; 128
  64:   82 b9           out     0x02, r24       ; 2
Wert = 63:
  62:   8e e7           ldi     r24, 0x7E       ; 126
  64:   82 b9           out     0x02, r24       ; 2
Also so wie es sein sollte und der Slave fühlt sich ja auch erst ab der
richtigen Adresse angesprochen - verhält sich danach nur falsch.

Getestet habe ich mit folgenden Programmen auf FreeBSD:
http://www.cosmo-project.de/~bernd/iic_probe
http://www.cosmo-project.de/~bernd/smb_probe
Im Prinzip passiert Clientseitig folgendes:
start, SLA+R, stop wenn Ack.

Falls jemand eine Erklärung dafür hat - ich bin jedenfalls ratlos.

Autor: Bernd Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grummel - ich habe mich vom smbus quick-read verleiten lassen.
Geht aber nicht, da der TWI Controller das Stop Signal vom Master als
Anfang vom read interpretiert.
Das Verhalten ist also vollkommen OK.

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.