Grüßgott zusammen,
ich will einen Bosch BNO055 mit einem ATmega 32 (12 MHz) über i2c
auslesen und die Daten dann an einem LCd anzeigen. Der Plan ist, dazu
die I2C-lib vom Peter Fleury herzunehmen. Irgendwie kommt das Programm
aber nicht über den ersten I2C-Start hinaus. Ist das ein Hardware oder
Software Fehler. Wo muss ich mit der Fehlersuche beginnen, und wie kann
ich den Fehler beheben.
Danke!
Gruß,
Jonas
spess53 schrieb:>> i2c_start_wait(0x29+I2C_WRITE);>> Wie kommst du auf die 0x29?
Stimmt. Das ist mit 100%iger Sicherheit falsch, auch ohne ins Datenblatt
zu schauen. I2C Addressen werden gerne mal nur mit den führenden 7 Bit
angegeben, da muss man dann schon 2x lesen.
Jim M. schrieb:> I2C Addressen werden gerne mal nur mit den führenden 7 Bit> angegeben, da muss man dann schon 2x lesen.
I2C Adressen sind 7 Bit. Alle Verwirrung entsteht daraus, dass viele
Leute den Wert des erste übertragenen Byes nicht von dessen Inhalt (u.a.
der Adresse) unterscheiden können. Das erste Byte setzt sich zusammen
aus dem R/W-Bit in Bitposition 0 und den 7 Adressbits in den
Bitpositionen [1..7].
Nach I2C-Spezifikation gibt es nur 7-Bit oder 11-Bit Adressen.
http://i2c2p.twibright.com/spec/i2c.pdf
Jim M. schrieb:> spess53 schrieb:>>> i2c_start_wait(0x29+I2C_WRITE);>>>> Wie kommst du auf die 0x29?>> Stimmt. Das ist mit 100%iger Sicherheit falsch, auch ohne ins Datenblatt> zu schauen. I2C Addressen werden gerne mal nur mit den führenden 7 Bit> angegeben, da muss man dann schon 2x lesen.
Und wie man es auch rechnet, schreiben kann niemals eine ungerade
Adresse sein...
Jonas schrieb:> Ja, laut Datenblatt ist die i2c-adresse definitiv 0x29.
Nein, bei dir ist es entweder 0x50 oder 0x52 beim schreiben.
beim lesen ist die Adresse 0x51 bzw. 0x53.
Jonas schrieb:> Ja, laut Datenblatt ist die i2c-adresse definitiv 0x29.
Der Aufruf von i2c_start_wait() erwartet als Argument aber nicht die
I2C-Adresse, sondern das komplette erst zu übertragende Byte.
Marc V. schrieb:> Nein, bei dir ist es entweder 0x50 oder 0x52 beim schreiben.> beim lesen ist die Adresse 0x51 bzw. 0x53.
Das, was du da angibst, sind nicht die Adressen, sondern das erste zu
übertragende Byte, also Adresse in den Bits 1..7 und R/W im Bit 0.
> Und wie man es auch rechnet, schreiben kann niemals eine ungerade> Adresse sein...
Doch, denn Schreib- und Leseadresse sind ∗identisch∗ [0]:
1
Data transfers follow the format shown in Figure 9. After the START
2
condition (S), a slave address is sent. This address is seven bits
3
long followed by an eighth bit which is a data direction bit (R/W)
4
[..]
Mithin kann eine Schreibadresse auch ungerade sein sofern es ungerade
Adressen überhaupt gibt (und ja, das tut es).
Wie das Softwareinterface für i2c das handhabt (7-Bit-Adresse in den
Bits 0-7 (so wie es sein soll) oder in den Bits 1-8 (pfui)) ist eine
andere Geschichte.
Nix für ungut.
[0] Speckifikation [1] Kapitel 3.1.10 'The slave address and R/W bit'
[1] http://www.nxp.com/documents/user_manual/UM10204.pdf
Jonas schrieb:> funktioniert aber trotzdem nicht :-(
Dann nimm einen I2C-Scanner und gucke, ob dein BNO055 überhaupt irgendwo
antwortet oder ob du ein Hardware-Problem hast.
Du könntest dir auch mit einem Oszi mal die Pegel auf dem Bus angucken.
Wolfgang schrieb:> Nach I2C-Spezifikation gibt es nur 7-Bit oder 11-Bit Adressen.
Nur der Richtigkeit halber:
Statt 11 muss es natürlich 10-Bit heißen.
Wolfgang schrieb:> Das, was du da angibst, sind nicht die Adressen, sondern das erste zu> übertragende Byte, also Adresse in den Bits 1..7 und R/W im Bit 0.
Hatten wir doch schon Hundertmal, das ist nicht der Punkt.
Spess hat es ihm schon zweimal gezeichnet - Es wird
0x0101 0000 zum schreiben und
0x0101 0001 zum lesen gesendet.
Du kannst das interpretieren wie es dir beliebt...
Jonas schrieb:> absoluter ANFÄNGERFEHLER. Die Taktrate des Avr war nicht im makefile> korrekt eingetragen.> Trotzdem Danke für die schnellen Antworten.
Was hat das mit Hardware I2C zu tun ?