Forum: Mikrocontroller und Digitale Elektronik ATmega 32 I2C


von Jonas (Gast)


Angehängte Dateien:

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

von Sascha_ (Gast)


Lesenswert?

Bis wohin kommt dein Programm genau?

Hast du auch gegen die twimaster.c gelinkt?

Occams Razor sagt Softwarefehler.

von spess53 (Gast)


Lesenswert?

Hi

>   i2c_start_wait(0x29+I2C_WRITE);

Wie kommst du auf die 0x29?

MfG Spess

von Jim M. (turboj)


Lesenswert?

Hast Du an die Pullups für den Bus gedacht?
Ansonsten: Schaltplan

von Jonas (Gast)


Lesenswert?

0x29 ist die Adresse vom BNO

von Jim M. (turboj)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

>0x29 ist die Adresse vom BNO

Nein. Entweder 0x50 oder 0x28. Kommt darauf an, was die Lib damit macht.

MfG Spess

von Jonas (Gast)


Lesenswert?

Ja, laut Datenblatt ist die i2c-adresse definitiv 0x29.

von Jonas (Gast)


Lesenswert?

Als Pullups habe ich 10k Widerstände verwendet.

von Wolfgang (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

>Ja, laut Datenblatt ist die i2c-adresse definitiv 0x29.

Lt.Datenblatt ist die Adresse, incl. R/W-Bit:

   0 1 0 1 0 0 0 0

MfG Spess

von Marc V. (Firma: Vescomp) (logarithmus)


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.

von hp-freund (Gast)


Lesenswert?

Marc V. schrieb:
> i2c_start_wait(0x29+I2C_WRITE);

Vielleicht so?
i2c_start_wait( (0x29<<1) + I2C_WRITE);

von Wolfgang (Gast)


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.

von Jonas (Gast)


Lesenswert?

funktioniert aber trotzdem nicht :-(

von spess53 (Gast)


Lesenswert?

Hi

Steht doch auch so im Datenblatt

>Example of an I²C write access to the BNO055 (i2c address in this case: 0101000b 
=0x28)

MfG Spess

von g457 (Gast)


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

von g457 (Gast)


Lesenswert?

0-6 und 1-7 natürlich
</ingrid>

von Jonas (Gast)


Lesenswert?

also stimmt die adresse 0x29 auch?

von Wolfgang (Gast)


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.

von Kurt (kurtcontroller)


Lesenswert?

Hi,

********************************************************/
/**\name  I2C ADDRESS DEFINITION FOR BNO055           */
/********************************************************/
/* bno055 I2C Address */
#define BNO055_I2C_ADDR1                (0x28)
#define BNO055_I2C_ADDR2 (0x29)

schau mal hier:

https://github.com/BoschSensortec/BNO055_driver/blob/master/bno055.h


Gruß
Kurt

von Jonas (Gast)


Lesenswert?

Fehler gefunden:
absoluter ANFÄNGERFEHLER. Die Taktrate des Avr war nicht im makefile 
korrekt eingetragen.
Trotzdem Danke für die schnellen Antworten.

von Marc V. (Firma: Vescomp) (logarithmus)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ?

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.