ATmega 32 I2C

Gast #4773020
Lesenswert?

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
Angehängte Dateien:
Gast #4773081
Lesenswert?

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
(Firma: Vescomp) #4773085
Lesenswert?

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.
Gast #4773093
Lesenswert?

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.
Gast #4773101
Lesenswert?

> 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
Gast #4773120
Lesenswert?

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.
(Firma: Vescomp) #4773138
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren