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


von Michael A. (micha54)


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

von hans (Gast)


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

von Michael A. (micha54)


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

von Michael A. (micha54)


Lesenswert?

Huch, da ist plötzlich das Posting weg, auf das ich geantwortet hatte...

Gruß,
Michael

von Micky (Gast)


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...

von Gast (Gast)


Lesenswert?

Wieso auch immer hier fachlich interessante Beiträge gelöscht werden...?

von Michael A. (micha54)


Lesenswert?

Hallo,

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

Gruß,
Michael

von Jacob R. (jaykopf)


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

von Michael A. (micha54)


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

von Michael A. (micha54)


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

von Abdul K. (ehydra) Benutzerseite


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.