Forum: Mikrocontroller und Digitale Elektronik I2C mit ATMega und Wemos D1 Mini Pro


von T. S. (elektrowiesel)


Lesenswert?

Hallo,
ich versuche 4 Datenbytes von einem ATMega8 mit der I2c-Bibliothek von 
Peter Fleury an einen ESP8266 auf dem Wemos-Board zu senden. 
Programmiert wird der ESP8266 mit der Arduino umgebung, also mit der 
Wire-Bibliothek.

Der Master(ATMega) funktioniert einwandfrei. Gemessen mit Logic 
Analyzer.

Der ESP Antwortet aber nicht. Außer "Start" gibt es keine Ausgaben.
Auch keine ACKs.

Ich nehme an, dass er vielleicht zu langsam sein könnte(?).
Oder ich habe das Beispiel falsch verstanden.

Code:

Master(Ausschnitt):
1
i2c_init();
2
i2c_start( 0x02 );  // Adresse = 1; R/W = 0 -> write
3
i2c_write( 0 );
4
i2c_write( 1 );
5
i2c_write( 2 );
6
i2c_write( 3 );
7
i2c_stop();

Slave:
1
#include <Wire.h>
2
3
void setup() {
4
  Serial.begin(9600);           
5
  Serial.println( "Start." );
6
  Wire.begin(1);                
7
  Wire.onReceive(receiveEvent);
8
}
9
10
void loop() {
11
  delay(100);
12
}
13
14
15
void receiveEvent(int howMany) {
16
  Serial.println( "Event." );
17
  while (1 < Wire.available()) {
18
    int c = Wire.read();
19
    Serial.print(c);
20
  }
21
  int x = Wire.read();
22
  Serial.println(x);
23
}

: Bearbeitet durch User
von Arduinoquäler (Gast)


Lesenswert?

Tim S. schrieb:
> Der ESP Antwortet aber nicht. Außer "Start" gibt es keine Ausgaben.
> Auch keine ACKs.

Wenn ein Slave nicht antwortet liegt es meistens an der (falschen)
Adresse.

von T. S. (elektrowiesel)


Lesenswert?

Nach meinem Verständniss ist die Adresse des Slaves 1(siehe 
"Wire.begin(1)")
und diese wird auch vom Master angesprochen(siehe "i2c_start(0x02)").
Vorausgesetzt ich habe das mit der 7 bit Adresse nicht falsch gemacht.

Adresse = 1, also 0b0000001 und R/W bit = 0, also 0b00000010 als erstes 
Byte.

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo Tim,

wie kommst Du auf diese I2C Adresse?

Gruß
Frank

von Manfred (Gast)


Lesenswert?

Tim S. schrieb:
> Nach meinem Verständniss ist die Adresse des Slaves 1

I2C-Scanner besorgen, gucken, was sich wirklich meldet - nicht so 
schwer, oder?

von T. S. (elektrowiesel)


Lesenswert?

Da der ESP als Slave keine feste Adresse hat wird ihm durch die 
Programmierung die Adresse 1 zugewiesen, oder geht das so nicht?

Zu überprüfen ob sich ein Gerät zurück meldet ist tatsächlich nicht 
schwer...

Deshalb habe ich ja geschrieben, dass kein ACK zurück kommt, oder?

von Arduinoquäler (Gast)


Lesenswert?

Tim S. schrieb:
> Da der ESP als Slave keine feste Adresse hat wird ihm durch die
> Programmierung die Adresse 1 zugewiesen, oder geht das so nicht?

Kannst du Arduino lesen? Dort steht:

----------------------------------------------------------
There are both 7- and 8-bit versions of I2C addresses. 7
bits identify the device, and the eighth bit determines if
it's being written to or read from. The Wire library uses
7 bit addresses throughout. If you have a datasheet or
sample code that uses 8 bit address, you'll want to drop
the low bit (i.e. shift the value one bit to the right),
yielding an address between 0 and 127. However the
addresses from 0 to 7 are not used because are reserved so
the first address that can be used is 8.
----------------------------------------------------------

Ich würde mir besonders den letzten Satz zu Herzen nehmen.
Und das Shift-Problem nicht ausser Acht lassen.

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo Tim,

ich glaube nicht, dass das so geht. Eine Slave, der keine Adresse hat, 
kann über I2C nicht angesprochen werden. Ich habe allerdings auch keine 
Doku zu diesem Board sodass ich es nicht genau sagen kann.

Wenn Du eine Doku hast, dann verlink diese doch bitte mal.

Gruß
Frank

von Arduinoquäler (Gast)


Lesenswert?

Frank L. schrieb:
> Eine Slave, der keine Adresse hat,
> kann über I2C nicht angesprochen werden.

Sehe ich mittlerweile auch so, aber aus anderem Grund.

http://esp8266.github.io/Arduino/versions/2.0.0/doc/libraries.html#i2c-wire-library

Dort ist zu lesen:

----------------------------------------------------
Wire library currently supports master mode up to
approximately 450KHz. Before using I2C, pins for SDA
and SCL need to be set by calling
Wire.begin(int sda, int scl), i.e. Wire.begin(0, 2)
----------------------------------------------------

Nachdem es keine Slave Adresse gibt die man setzen würde,
kann der Slave auch nicht angesprochen werden. Also
nur Master Mode.

Vielliecht gibt es neuere Docs und Libs wo dies anders ist.
Habe nicht weiter gesucht.

von T. S. (elektrowiesel)


Lesenswert?

Also, ich habe jetzt mal die Adresse auf 8 geändert, aber es 
funktioniert immer noch nicht.

Es gibt eine überladene Version von Wire.begin die eine Adresse als int 
nimmt, daher glaube ich, dass Slave Modus funtionieren müsste...

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Tim S. schrieb:
> daher glaube ich, dass

.. RTFM jetzt mal angesagt wäre.

Oliver

von Arduinoquäler (Gast)


Lesenswert?

Tim S. schrieb:
> daher glaube ich, dass Slave Modus funtionieren müsste

Suche doch einfach in den Online Docs ob es was neueres
dazu gibt. Wenn nicht dann gilt das bereits Zitierte:

Arduinoquäler schrieb:
> 
http://esp8266.github.io/Arduino/versions/2.0.0/doc/libraries.html#i2c-wire-library
>
> Dort ist zu lesen:
> .....

von Jan L. (ranzcopter)


Lesenswert?

Arduinoquäler schrieb:
> Tim S. schrieb:
>> daher glaube ich, dass Slave Modus funtionieren müsste
>
> Suche doch einfach in den Online Docs ob es was neueres
> dazu gibt. Wenn nicht dann gilt das bereits Zitierte:
>
> Arduinoquäler schrieb:
>>
> 
http://esp8266.github.io/Arduino/versions/2.0.0/doc/libraries.html#i2c-wire-library
>>
>> Dort ist zu lesen:
>> .....

...und das gilt afaik noch immer; es gibt zwar länger schon einen 
Pull-Request mit einem Patch, der scheint aber problematisch zu sein...

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.