Forum: Mikrocontroller und Digitale Elektronik TWI - Fehler beim Senden von Start


von ByteBit (Gast)


Lesenswert?

Hallo,
ich versuche mich gerade daran einen Wii Nunchuck Beschleunigungssensor 
über TWI/I2C auszulesen, doch irgendwie klappt das Ganze nicht. SDA und 
SCL verfügen bereits über 2,5kΩ Pullups. Der Atmega und der Nunchuck 
besitzen einen selben GND und sind an 3,3V angeschlossen, allerdings 
bekomme ich vom Slave einfach keine Acknowledge beim Senden von Start 
(Das TW_STATUS Register enthält weder TW_MT_SLA_ACK noch TW_MR_SLA_ACK).
Als Library benutze ich den fertigen Code von Peter Fleury.

Könnte es sein, dass die Pullups falsch dimensioniert sind oder 
irgendwie das Hardware TWI bei <5V nicht richtig funktioniert (ich habe 
keine L version)?

von Hubert G. (hubertg)


Lesenswert?

Du schreibst nicht welchen ATmega du verwendest. Wenn du aber die 
Taktfrequenz bei 3,3V berücksichtigt hast, dürfte es keine Probleme in 
diese Richtung geben.

von ByteBit (Gast)


Lesenswert?

Es handelt sich hierbei um einen Atmega8 der auf 2Mhz getaktet ist. Den 
TWI Takt habe ich deshalb auch auf 10kHz gestellt, aber auch wenn der µC 
auf 4MHz und 100KHz SCL Takt läuft funktioniert das einfach nicht.

von Thomas (Gast)


Lesenswert?

Hallo,

ich würde als Pullups auf 47kOhm erhöhen

von Mitlesa (Gast)


Lesenswert?

Thomas schrieb:
> ich würde als Pullups auf 47kOhm erhöhen

Einfach mal so? Ohne Begründung? Na toll!

Wenn hier so heisse Tipps gegeben werden, dann:

... ich würde als Pullups auf 2.2kOhm erniedrigen.
Hat bisher immer geholfen! Ich schwör!

von I2C (Gast)


Lesenswert?

ByteBit schrieb:
> allerdings
> bekomme ich vom Slave einfach keine Acknowledge beim Senden von Start

Auf welcher I2C-Adresse versuchst du ihn denn anzusprechen? Lt. 
Datenblatt sollte der auf 0x52 sitzen.
http://www.robotshop.com/media/files/PDF/inex-zx-nunchuck-datasheet.pdf

von ByteBit (Gast)


Lesenswert?

I2C schrieb:
> Auf welcher I2C-Adresse versuchst du ihn denn anzusprechen? Lt.
> Datenblatt sollte der auf 0x52 sitzen.
> http://www.robotshop.com/media/files/PDF/inex-zx-n...

Die Adresse ist auf jeden Fall korrekt, es muss auf jeden Fall am Aufbau 
liegen. Ich habe auch schon versucht ein Gyroskop anzusprechen, aber 
dort schlägt das Senden des Start-Signals auch immer fehl.

von spess53 (Gast)


Lesenswert?

Hi

>Auf welcher I2C-Adresse versuchst du ihn denn anzusprechen? Lt.
>Datenblatt sollte der auf 0x52 sitzen.

Aber nur wenn die Software die Adresse selbst shiftet. Das weiß aber nur 
der TO.

MfG Spess

von ByteBit (Gast)


Lesenswert?

Danke für die Antworten, es lag tatsächlich an der Adresse :)
Ich habe als Test erstmal einen I2C Scanner laufen lassen und 
festgestellt, dass die eigentliche Adresse wohl 0xA4 war.

von I2C (Gast)


Lesenswert?

ByteBit schrieb:
> Ich habe als Test erstmal einen I2C Scanner laufen lassen und
> festgestellt, dass die eigentliche Adresse wohl 0xA4 war.

Nach I2C Spezifikation kann das nicht sein, da die Adresse nur 7-Bit 
lang ist. Was du meinst, ist vermutlich das erste übertragene Byte, oft 
als Adressbyte bezeichnet.
http://www.cs.unc.edu/Research/stc/FAQs/Interfaces/I2C-BusSpec-V2.1.pdf

von spess53 (Gast)


Lesenswert?

Hi

>Nach I2C Spezifikation kann das nicht sein, da die Adresse nur 7-Bit
>lang ist. Was du meinst, ist vermutlich das erste übertragene Byte, oft
>als Adressbyte bezeichnet.

Selbst NXP bezeichnet in aktuellen Dokumenten Adresse+RW-Bit als 
Adressbyte:

http://www.nxp.com/documents/data_sheet/PCF8574_PCF8574A.pdf

MfG Spess

von I2C (Gast)


Lesenswert?

spess53 schrieb:
> Selbst NXP bezeichnet in aktuellen Dokumenten Adresse+RW-Bit als
> Adressbyte:

Sag ich ja. Und dieses Adressbyte setzt sich aus der 7-Bit Adresse und 
dem R/W-Bit (LSB) zusammen. Die höchste 7-Bit Zahl ist nun mal 0x7F.

Unter 7.1 steht explizit: "Following a START condition, the bus master 
must send the address of the slave it is accessing and the operation it 
wants to perform (read or write)."

Auch da nur 7 Bit für die Adresse.

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


Lesenswert?

I2C schrieb:
> Sag ich ja. Und dieses Adressbyte setzt sich aus der 7-Bit Adresse und
> dem R/W-Bit (LSB) zusammen. Die höchste 7-Bit Zahl ist nun mal 0x7F.

 Nicht schon wieder...
 R/W bit ist beim Lesen 1 und beim Schreiben 0.
 Adresse besteht aus OBEREN 7 bits + R/W bit.

 Also kann I2C-Deviceadress sehr wohl größer als 0x80 sein - und ist
 es auch meistens).

 Device auslesen ist 0xA5, Device schreiben ist 0xA4 beim TO.

 Weil es nur 7 Bytes sind, muss die richtige Adresse 0x52 und nicht
 0xA4 sein, aber ich sende trotzdem 0xA4 beim schreiben und 0xA5 beim
 lesen - was fur ein Unsinn ohne jede menschennahe Logik dahinter.

 Die ganze Bit- bzw. Byteschifterei weil 7bit nicht größer als 0x7F
 sein können interessiert doch keinen Menschen, ausser diejenigen, die
 nicht wahrhaben wollen oder nicht verstehen können, dass diese 7bit
 nicht für sich alleine stehen, sondern Teil einer Adresse sind.

 Es wird gerade deswegen NICHT geschoben, sondern:
      Adresse |= R/W bit.
 Oder:
       Adresse += R/W bit.
 So und nicht anders !!!

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.