www.mikrocontroller.net

Forum: Haus & Smart Home I2C - Read nur mit fester Länge ?


Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann es sein, daß beim Read der Master wisen muss, wieviele Bytes von 
Slave gesendet werden ?
Da der Master das ACK sendet gibt es kein Methode für den Master, das 
Ende der Übertragung anzuzeigen. Oder übersehe ich was ?

Gruß,
Michael

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du übersiehst einiges.

Schau mal hier:

http://www.roboternetz.de/wissen/index.php/I2C

Der Master signalisiert beim lesen mit dem Ack das er noch mehr
lesen will. Damit kann man z.B. ein EEProm fortlaufend auslesen
oder den PCF8574 pollen.

Das Ende der Übertragung ist immer ein Stop oder Repeatet Start vom 
Master.

Bei anderen Bausteinen hängt es davon ab, wieviel Daten sie zur
verfügung stellen. Oft geben sie die Datenleitung für das Ack des
Masters nicht frei, wenn sie nichts zum senden haben.

Der Master muß also nicht wissen wieviele Byte er lesen will sondern
nur einen Punkt kennen, an dem er aufhören soll.

gruß hans

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke erstmal, ich habe das wohl richtig verstanden.

Was mir nicht gefällt ist, dass der Master bereits wissen muss, wie die 
Daten strukturiert sind, es ist also kaum möglich, einen allgemeinen 
Treiber zu schreiben, der dann immer passt, bzw. man müsste 
Kontrollstrukturen definieren, der dem Treiber sagt, wie die Daten zu 
interpretieren sind.

Gruß,
Michael

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huch, da ist plötzlich das Posting weg, auf das ich geantwortet hatte...

Gruß,
Michael

Autor: Micky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Autor: Michael Appelt (micha54)
> Datum: 22.02.2009 15:50
>
> Huch, da ist plötzlich das Posting weg, auf das ich geantwortet hatte...
>
> Gruß,
> Michael

Das lässt sich leicht umgehen indem man den Beitrag, auf den man 
antwortet, komplett zitiert. Ich hätte das nämlich auch gerne gelesen...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso auch immer hier fachlich interessante Beiträge gelöscht werden...?

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der Tip war, als 1. Byte die Länge des Pakets zu senden bzw. von slave 
zu empfangen.

Gruß,
Michael

Autor: Jacob R. (jaykopf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Wieso auch immer hier fachlich interessante Beiträge gelöscht werden...?

Gute Frage, doch zum Glück wurde ich auch per Mail benachrichtigt:

Betreff: Re: I2C - Read nur mit fester Länge ?
Datum: 22.02.2009 10:56
Text des gelöschten Beitrags:
==============================================
Hallo Michael,
soweit ich weiß ist es richtig das der Master wissen muss wieviel er zu 
lesen hat.
Um trotzdem Messages mit variabler Länge vom Slave zu lesen kannst Du es 
z.B. so machen das der Slave als erstes die Anzahl der Bytes die 
abgerufen werden sollen sendet bevor er seine Daten schickt. Der Master 
adressiert dann den Slave liest z.B. das erste Byte (evtl. auch mehrere) 
und weiß damit wie viele Bytes er noch abrufen soll.

Gruß,
Jacob

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

na super, warum hast du den Beitrag den solange versteckt ?

Ich versuche immer relativ saubere Module in Layern anzuordnen. an 
meinem I2C-Bus hängen ein LCD-Display, Tastatur, DCF77-Uhr usw.

Das Hauptprogramm läuft auf einem M32, und der kann per Multitasking 
laufen. Nach einiger Überlegung ist die Struktur klar: der Treiber für 
die I2C-Schnnittstelle bekommt Request-Block:
struct{
  uint8_t prcid; // wer hat den Request losgeschickt
  uint8_t status; // bitweise R/W, ready, error + fixed length/var 
length
  uint8_t length; // lese oder schreiblänge
  uint8_t buffer[];
} i2c_Buffer;

Gruß,
Michael

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

weitere Frage: was macht der Master eigentlich, wenn der Slave nicht 
mehr antwortet ? Läuft der Takt weiter, so daß nach 8 bits dann das ACK 
fehlt ?

Oder allgemeiner: kann es zu Fehlern kommen, die per Timeout abgefangen 
werdne müssen ? Z.B. Slave hängt und gibt SCL nicht frei...endloses 
Stretching ?

Gruß,
Michael

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, der ACK wird ein NACK wenn kein SCL-Stretching vom Slave 
betrieben wird. Die ganze Chose sollte per Timeout abgefangen werden und 
im Falle des Falles das i2c-Protokoll mit einem STOP/START wieder 
beginnen.


Gruß -
Abdul

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.