mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI: Clock leitung auf low halten


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in meinem Projekt die TWI Schnittstelle verwendet, in der ISR 
lese ich die Daten ein, nur habe ich das Problem, falls ich z.B. 3 
Packete über die I2C-Schnittstelle gleich hintereinander bekomme, kann 
ich mur auf das erste reagieren. Ich möchte aber, nach dem ich ein STOP 
erhalten habe eine Funktion aufrufen, abarbeiten und dann wieder die 
nächsten Pakete empfangen. Wie kann ich solange die Clockleitung halten, 
als Slave?

Autor: Zeusi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du uns sagst welchen µC du verwendest könnte wir Dir evtl. mehr 
helfen, aber ansonsten bietet Atmel im (vollständigen) Datenblatt von 
dem ATMega32 eine reine Softwarelösung,.

grüüüße

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der "klassische" Ansatz ist ein Jobflag+Puffer:
die ISR empfängt ein ganzes Paket und setzt, sobald eins da ist, eine 
Variable/ein Bit (Flag), die Main loop fragt das Bit regelmäßig ab, und 
ruft die Funktion auf, wenn das flag gesetzt ist (auch in den Atmel 
appnotes zu TWi wird das so gemacht).

Wieso willst du die Clock-Leitung halten??? (Dann kommt ja auch keine 
stop-condition, weil der Bus blockiert ist)
Wenn dein Slave signalisieren soll, dass er beschäftigt ist, antwortet 
er einfach nicht auf seine Adresse.

hth. Jörg

ps.: bei AVRs wird die Clock-Leitung immer auf Low gehalten, wenn das 
TWINT-Bit gesetzt ist ...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende einen Atmega. Die Softwareschnittstelle kann ich jetzt 
nicht mehr nehmen, da die Hardware bereits steht (will ich auch nicht). 
Zu dem TWI Slave habe ich glaub ich hier was gefunden und angepasst. 
Soweit funktioniert das ganze, bloss wenn mehrere Pakete direkt 
hintereinander ankommen, wird das zweite immer ignoriert. Ich müsste 
praktisch die SCL Leitung auf low halten, was man theoretisch mit dem 
TWINT Flag machen kann, das klappt aber nicht.
Hier ist das problematische Stück vom Code
case TW_SR_STOP:   // 0xA0 STOP empfangen
    rx_ready  = 0x01;
    tx_ready  = 0x01;
    i2c_busy  = 0x00;
    buffer_adr  = 0xFF;

    TWCR    |= (1<<TWINT);
    printf("\r\n");
    for(i=0; i< 32; i++)
    {
     printf("x0%X ", rxbuffer[i]);
     TWCR    |= (1<<TWINT);
    }
    transform_i2c_to_para();              
    TWCR    &= ~(1<<TWINT);    

TWCR    |= (1<<TWINT);
Hiermit will ich SCL low time stretchen, um diese Funktion 
"transform_i2c_to_para()" problemlos ausführen zu können.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> TWCR    |= (1<<TWINT);
damit löschst du das flag!
Wie die allermeisten AVR-Interruptflags, wird das TWINT mit einer 1 
gelöscht.
Um das Flag gesetzt zu lassen, brauchst du einfach NICHTs zu tun, weil 
das Flag gesetzt ist, wenn die ISR läuft.

Wenn der Slave NACH der Stop-Condition warten soll, lösche einfach das 
TWEA-Bit, und setze es sobald der Slave wieder ansprechbar ist. Der 
Master muss dann eben pollen, d.h. solange die Slave-addresse senden, 
bis der Slave antwortet.

hth. Jörg

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg, das bringt mich weiter.

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.