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):
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.
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.
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?
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.
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
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.
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...