Arduino wire Lib liest nur 32 Bytes mit I2C

OP #4957349
Hallo,

ich habe das gleiche Problem wie in diesem Thread

Beitrag "Arduino TWI mehr als 32 Byte"

Leider gab's damals keine Lösung. Gibt es inzwischen eine, wie ich mehr 
als 32 Bytes einlesen kann? Ich habe einen Touchcontroller, dessen 
Buffer 66 Bytes groß ist und der in einem Durchgang gelesen werden muss, 
damit die INT-Leitung wieder H wird. Laut Logic Analyzer funktioniert 
das Lesen der Werte soweit, nur ist nach 32 Bytes Schluss. Da INT dann 
low bleibt, fängt er beim neuen Auslesen wieder von vorn an usw.
1
void loop() {
2
  
3
  char c1[70];
4

5
  while (digitalRead(intPin)==HIGH) {
6
  }
7
  Serial.println("INT");
8

9
  Wire.requestFrom(0x2a,66);
10

11
  int cnt=0;
12
  
13
  while (Wire.available())
14
  {
15
      c1[cnt] = Wire.read();
16
      cnt++;
17
  }
18
}
Gast
Ich mach das jetzt ungern, weil ich damals bei demselben Problem sehr 
viel Zeit benötigt habe ;-)

Aber hier die Lösung:
 *              #define BUFFER_LENGTH 66 in Wire.h!!
 *              #define TWI_BUFFER_LENGTH 66 in Wire\utility\twi.h!!
Hartes Limit in Wire.h ist 32 Bytes - das müsste man ändern und dann neu 
kompilieren, keine Ahnung wie kompliziert sich das bei Arduino Libs 
macht.

Oder man implementiert I²C halt zu Fuß. Hausaufgabe: Raussuchen was 
einfacher ist...


Edit: Zu langsam ;-)
Hi

Christian S. schrieb:
> Wire.requestFrom(0x2a,66);

Mick schrieb:
> *              #define BUFFER_LENGTH 66 in Wire.h!!
>  *              #define TWI_BUFFER_LENGTH 66 in Wire\utility\twi.h!!

Dann taugt die LIB aber nicht sonderlich viel!
Wenn schon die Anzahl der zu lesenden Bytes übergeben wird, ist es doch 
ein Leichtes, eine Fehlermeldung zu generieren, wenn der Puffer nicht 
ausreichend ist.

Von der anderen Seite aus gesehen:
Wenn ich eh nur z.B. 5 Byte brauche, belegt die LIB (2x ??) 61 Byte 
unnützen Speicher, Der niemals gebraucht wird? ... dann nutzen sich die 
Speicherzellen auch nicht so ab ...

... fehlen nur noch Mehrkern-µC ... Speicherplatz ist ja heute kein 
Kriterium.

MfG
OP
@Mick,

vielen Dank. Es funktioniert jetzt. Habe lieber ein paar Bytes mehr 
reserviert. Ich war nicht sicher, ob das mit den 66 Bytes nach 
Datenblatt stimmt, da der Anfang auch schon etwas abweichend zum 
beschriebenen Protokoll war.

@Jim Meba

Ist mein erstes Arduino-Projekt auf dem AVR. Hab's bisher immer in 
Assembler gemacht. Da könnte ich auch I2C, aber ich dachte, mit C++ 
geht's doch etwas komfortabler und schneller, zumal ich die Daten ja 
auch noch auswerten will. War kurz davor, zu Assembler zu wechseln.

@Patrick J.

Sehe ich auch so. Die Lib ist doch schon alt, offensichtlich hat das 
bisher keinen gestört. Damit kann man auch keine EEPROMs mit größerer 
Page in einem Rutsch laden...
Jim M. schrieb:
> Auf einem µC, wo es keine standadisierte Ausgabemöglichkeit gibt?
> Könnte dann doch etwas komplizierter sein...

Ist doch C++ ... mit ein bischen Template-Magie kriegt man das 
Wire.requestFrom sicher so hin, dass es einen Compile-Time-Fehler bei 
Überschreiten der Buffersize gibt.
OP
Kann man so eine Lib nicht so bauen, dass man bei wire.begin die 
benötigte Buffergröße mit angibt oder irgendwie anders deklariert? Zumal 
diese 32 Byte Begrenzung nicht beschrieben ist. (Ich habe es in der 
wire-Beschreibung im Internet jedenfalls nicht gesehen.) Man wundert 
sich nur, warum der eigene Code nicht funktioniert und eigentlich auch 
nur, weil ich erst mal ganz primitiv versucht habe, nur diese 66 Bytes 
zu lesen und noch gar nichts auszuwerten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.