www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu I2C-Implementation


Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe hier eine Master-Slave-Anwendung mit zwei PICS, welche über I2C 
kommunizieren können.

Die Funktion ist etwa so:
1. Master sendet Befehl
2. Slave schiebt Befehl in ein Array (löschen des Arrays (neuer Befehl) 
bei Empfang einer neuen Adresse
3. Slave arbeitet den Befehl ab, wenn dazu alle Daten empfangen wurden.

Meine Frage: Wie sollte sich der Slave verhalten, während er die dem 
Befehl entsprechenden Funktionen ausführt?

Soll er ein ClockStretching machen? Aber dann wäre ja der Bus für die 
anderen blockiert?
Oder soll ich einfach die Schnittstelle abschalten? Allerdigns weiß ich 
nicht, wie viele Daten für die Befehle mitkommen.

Was meint ihr??

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn z.B. ein EEPROM mit schreiben beschäftigt ist, reagiert es auf I2C 
Anfragen mit einem Not Ack. Das wäre wohl auch hier angebracht.
Es muss also nur der Master so programmiert sein, das er bei einem Not 
Ack. es einfach nach einer Zeit noch mal probiert.

> Allerdigns weiß ich nicht, wie viele Daten für die Befehle mitkommen.
Warum weisst du das nicht? Ich denke du bist der Entwickler :)

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einer Dateiübertragung werden immer 8 Byte Blöcke übertragen. Wenn 
der letzte nicht voll ist, kommen dann halt nur noch paar Byte.
Deshalb eigentlich.

Aber das mit dem NACK ist garnicht so schlecht, das werd ich mal 
probieren.

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich denn auf dem Slave ein NACK generieren??

Werde aus dem Datenblatt nicht schlau.
Normalerweise sollte kein NACK gesetzt werden, wenn das SSPOV oder 
BF-Flag gesetzt ist.
Aber irgendwie bekommt der Master trotzdem ein ACK.

Weiß hier jemand Bescheid?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Master genug gesendet hat, sendet er STOP.

Wenn der Master genug empfangen hat, sendet er aufs letzte Byte NACK und 
STOP.

Wenn der Slave genug empfangen hat, sendet er aufs letzte Byte NACK.

Wenn der Slave genug gesendet hat, kann er dies dem Master nicht 
mitteilen (geht vom Bus, d.h. sendet 0xFF).

Kann der Slave zeitweilig keine neuen Daten senden/empfangen (alle 
Puffer voll), dann geht er vom Bus (AA=0), d.h. der Master kriegt NACK 
auf die Adresse.


Beim 8051 heißt das ACK/NACK-Bit "AA" (Assert Acknowledge flag)


Peter

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann der Slave zeitweilig keine neuen Daten senden/empfangen (alle
> Puffer voll), dann geht er vom Bus (AA=0), d.h. der Master kriegt NACK
> auf die Adresse.

Genau das ist das Problem.
Ich weiß nicht, wie ich das hinbekomme.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha R. wrote:

> Genau das ist das Problem.
> Ich weiß nicht, wie ich das hinbekomme.

Das sollte im Datenblatt des nicht genannten PIC stehen.


Peter

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, im Datenblatt steht schon was, aber ich bekomm das irgendwie 
nicht hin.

Es handelt sich um einen PIC18F8722

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

Bewertung
0 lesenswert
nicht lesenswert
Beim AVR muss man vor_ dem letzten Byte ein Bit _löschen , um ein NACK 
(also quasi "kein Ack") zu senden, evtl. ist das beim Pic ja ähnlich.

hth. Jörg

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.