Forum: Mikrocontroller und Digitale Elektronik I2C Problem (Peter Fleury) Adressierung?


von Andreas (Gast)


Lesenswert?

Habe folgendes Problem:
Ich versuche über die I2C Bib von Peter Fleury auf ein Sensorboard 
(RoboBee 6 DOF) zuzugreifen. Jedoch bleibt das Programm in der start_i2c 
Routine hängen.

[c]
//main.c
#define ADXL345_ADRESS 0x6A

...

i2c_start(ADXL345_ADRESS+I2C_WRITE);
i2c_write(DATA_FORMAT);
i2c_write(0x01);
i2c_write(POWER_CTL);
i2c_write(0x08);
...

//twimaster.c
unsigned char i2c_start(unsigned char address)
{
    uint8_t   twst;
    // send START condition
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    // wait until transmission completed
    while(!(TWCR & (1<<TWINT)));

//hier bleibt er stehen!
...
}/* i2c_start */

Liegt es vielleicht an einer falschen Adresse? Laut Datenblatt ist die 
Adresse 0x53, jedoch benötige ich doch eine 8 Bit Adresse, also 0xA6?

Habe leider keinen Logik Analyzer um zu schauen was auf dem Bus 
passiert...

von Oliver (Gast)


Lesenswert?

Die Fleury-Bibliothek gibt das Adressbyte so aus, wie du es eingibst, 
während die offizielle TWI-Norm nur die oberen 7 Bit als Adresse 
definiert. guggst du halt mal in den Source-Code, dann siehst du, was da 
gemacht wird.

Oliver

von Andreas (Gast)


Lesenswert?

Aber zu dem Punkt an dem die Adresse übergeben wird komme ich doch erst 
gar nicht oder?

von Stefan (Gast)


Lesenswert?

Wenn er wirklich an der Stelle hängen bleibt, die du gekennzeichnet 
hast, dann ist der I2C Bus nicht bereit. Häufigste Ursachen sind 
Kurzschluss an einer der beine Leitungen, fehlende Pull-Up Widerstände 
oder fehlende Stromversorgung an einem Slave. In allen diesen Fällen ist 
SCL oder SDA immer Low. In Ruhelage sollten die Leitungen beide aber 
High sein.

von Andreas (Gast)


Lesenswert?

Also Pullups sind auf dem Sensorboard verbaut (2K2). Kurzschluss 
schließe ich auch aus.

Liegt es vielleicht an der Portkonfiguration?

Ich benutze ein rn Control. Habe das Sensorboard an Port C Hängen.

Die Ports aktiviere ich so:

DDRC =0xFF;
PORTC = 0xFF;

Danke für die Hilfe!

von Andreas (Gast)


Lesenswert?

Da parallel am Port C noch die Led's des rn control anliegen, sehe ich, 
dass die LED an Port C.0 leuchtet. An diesem Port liegt SCL. Dh. SDA ist 
high und SCL ist low.

von mr. mo (Gast)


Lesenswert?

Andreas schrieb:
> Also Pullups sind auf dem Sensorboard verbaut (2K2). Kurzschluss
> schließe ich auch aus.

Hat das Sensorboard denn Saft?

von Andreas (Gast)


Lesenswert?

Ja hat es, hab ich auch nachgemessen, Led leuchtet auch auf dem 
Sensorboard...

von mr. mo (Gast)


Lesenswert?

Andreas schrieb:
> Da parallel am Port C noch die Led's des rn control anliegen, sehe ich,
> dass die LED an Port C.0 leuchtet. An diesem Port liegt SCL. Dh. SDA ist
> high und SCL ist low.

Hab das gerade mal bei meinem Selbstbau getestet. Sobald ich die LEDs an 
den Pins dran mache geht meine I2C Verbindung auch nicht. Mach die mal 
ab und teste nochmal.

von Andreas (Gast)


Lesenswert?

Abmachen dürfte schwer werden, da diese fest auf dem Board verbaut sind, 
jedoch habe ich sie mit einem dip Schalter ausgeschaltet, jedoch keine 
Änderung!

von mr. mo (Gast)


Lesenswert?

Andreas schrieb:
> [c]
> //main.c
> #define ADXL345_ADRESS 0x6A

Andreas schrieb:
> Liegt es vielleicht an einer falschen Adresse? Laut Datenblatt ist die
> Adresse 0x53, jedoch benötige ich doch eine 8 Bit Adresse, also 0xA6?

Da ist schon was anders. 0xA6 oder 0x6A. Musst dich an der Stelle 
schonmal entscheiden.

von Andreas (Gast)


Lesenswert?

Ja war ein Tippfehler.

Adresse laut Datenblatt: 0x53 (7 Bit) -> 0xA6 (8 Bit)

von mr. mo (Gast)


Lesenswert?

Ja Adresse ist richtig.

Wenn du nichts zum testen da hast. Dann lass doch einfach nach dem 
i2c_start eine LED toggeln. Dann weiß du ob der die Funktion ausgeführt 
hat.

Andreas schrieb:
> DDRC =0xFF;
> PORTC = 0xFF;

Ob du das brauchst weiß ich nicht. Die Pins vom I2C habe ich noch nie 
damit belegt. Testweise kann man das ja mal auskommentieren.

von Andreas (Gast)


Lesenswert?

Habe es auskommentiert, jedoch keine Änderung.

Zum Debuggen habe ich Text über die serielle ausgegeben mit dem 
ergebnsi, dass er genau an der oben angegebenen Stelle stehen bleibt. 
Leider!

von spess53 (Gast)


Lesenswert?

HI

>Ob du das brauchst weiß ich nicht. Die Pins vom I2C habe ich noch nie
>damit belegt. Testweise kann man das ja mal auskommentieren.

Die TWI-Pins brauchen nicht konfiguriert werden:

When TWEN is written to
one, the TWI takes control over the I/O pins connected to the SCL and 
SDA pins, enabling the slew-rate limiters and spike filters.

MfG Spess

von Andreas (Gast)


Lesenswert?

Ok danke. Hab dies auch jetzt raus genommen, aber leide immer noch keine 
Änderung...
Noch weitere Ideen, Anregungen?

von Andreas (Gast)


Lesenswert?

Mir ist jetzt noch aufgefallen, dass das Rn Control bereits 10k Pullups 
onboard hat, das verwendete Sensorboard hat ebenfalls 2k2 Pullups. Kann 
es sein, dass es daran liegt?

Wenn ja, hat von euch jemand ein rn control und weiß ob ich die Pullups 
des RN Control deaktivieren kann oder ob ich die auftrennen müsste?

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.