I2C, Daten gehen verloren

OP (Firma: ADV-Service) #3408857
Lesenswert?
• ▲
▼
Hallo,
ich hoffe hier kennt sich jemand mit dem i2c-Bus aus und kann mir sagen 
warum das so ist:

Folgendes Problem habe ich:

Ich habe einen PIC so programmiert, dass er als I2C-Slave arbeitet. In 
dem PIC habe ich einen Zähler, der bei jedem abruf um 1 hochzählt.
Nun lese ich Byte für Byte vom PIC und hatte eigentlich erwartet, dass 
bei meinem Master die Zahlen 0x00 bis 0xFF ankommen. Aber das ist nicht 
geschehen!

Nach 0x7F sollte eigentlich 0x80 kommen aber gekommen ist 0x00.

Also habe ich mir einen LogicAnalyser gekauft und den Bus 
mitgeschrieben. Auf dem I2C-Bus wird tatsächlich eine 0x80 vom Slave zum 
Maser geschickt. Aber es wird beim Master immer das 8 Bit verschluckt.
(Achso, der Master ist ein RaspberryPi mit Pytonskript)

Nun zu meiner Frage: Gibt es einen Grund oder irgendeine Spezifikation, 
die erklärt, warum bei der Übertragung von Daten vom Slave zum Master 
immer das 8 Bit verschluckt wird.

Vielen Dank für jeden Tipp.
OP (Firma: ADV-Service) #3408942
Lesenswert?
• ▲
▼
CC schrieb:
> Eventuell eine komische Umwandlung zwischen char und unsigned char oder
> so?

Da ich auch schon an der Pyton-Lib gezweifelt hatte, habe ich die 
i2c-Tools genutzt. Wenn ich meinen PIC-Slave mit "i2cget -y 1 0x18" 
auslese, wird das ausgelesene Byte hexadezimal angezeigt. Und auch dort 
tritt das gleiche Verhalten auf, dass bei dem auslesen, das 8te Bit 
fehlt.
OP (Firma: ADV-Service) #3408959
Lesenswert?
• ▲
▼
Dominic A. schrieb:
> Ist bei i2c das 8Bit nicht dazu da um dem Slave mitzuteilen ob es ein
> Schreib oder ein Lesevorgang ist?

Jetzt bin ich verunsichert, ob Bit 7 oder 0 links oder rechts ist. Für 
mein Verständnis ist ganz links 7 und rechts 0. Dann ist das Bit 0 im 
Bus für lesen oder schreiben zuständig und 1 bis 7 für die Adresse. 
Zumindest beim Mitschnitt mit meinem LA. Und das Bit 7 (also das 8te) 
geht immer verloren beim lesen.
Aber daran gedacht hatte ich auch schon, da ich festgestellt habe, dass 
die angegebene Slaveadresse um ein Bit nach links verschben wird und das 
R/W Bit angehangen wird.
Das erklärt vielleicht den Verlust des Bits bei der Slave-Adresse. Aber 
was ich lese sind Daten, keine Adressen. Die sollten, so dachte ich, 
unverändert über den Bus kommen.
Gast #3408960
Lesenswert?
• ▲
▼
Georg G. schrieb:
> Nun zu meiner Frage: Gibt es einen Grund oder irgendeine Spezifikation,
> die erklärt, warum bei der Übertragung von Daten vom Slave zum Master
> immer das 8 Bit verschluckt wird.

Nein, jedenfalls nicht bei I2C.

Dominic A. schrieb:
> Ist bei i2c das 8Bit nicht dazu da um dem Slave mitzuteilen ob es ein
> Schreib oder ein Lesevorgang ist?

Das gilt für das Adressbyte und ist nicht das 8. Bit sondern das 1. Bit.
Hier
> Wenn ich meinen PIC-Slave mit "i2cget -y 1 0x18"
würde es sich auf die 0x18 beziehen.

MfG Klaus
#3409075
Lesenswert?
• ▲
▼
Hört doch auf vom 1. und vom 8. Bit zu sprechen, was soll denn sowas 
aussagen? Es gibt ein MSB und ein LSB. Und das LSB vom Adressbyte gibt 
die Datenrichtung für die nachfolgende Übertragung an. Aber nur vom 
Adressbyte.

Warum haben eigentlich grade RasPi Benutzer derart heftige Probleme mit 
I2C? Es gibt jetzt schon zig Posts mit diesem Thema. Woran liegts?

gruß cyblord
#3409428
Lesenswert?
• ▲
▼
Hallo Georg,

eventuell trifft dich das: "There is a bug in the [Raspi] I2C master 
[hardware] that it does not support clock stretching ..."?

Für weitere Informationen, und Möglichkeiten der Umgehung, siehe
http://elinux.org/BCM2835_datasheet_errata#p35_I2C_clock_stretching,
https://github.com/raspberrypi/linux/issues/254,
http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html und
https://dl.dropboxusercontent.com/u/3669512/2835_I2C%20interface.pdf. Du
solltest also Mechanismen einbauen, um korrupte I2C-Kommunikation
aufzufangen (Checksums, Retransmissions, ...).

LG, Sebastian
#3409513
Lesenswert?
• ▲
▼
Sebastian Wangnick schrieb:
> Du
> solltest also Mechanismen einbauen, um korrupte I2C-Kommunikation
> aufzufangen (Checksums, Retransmissions, ...).


Was ist bloß so schwer daran, die original Philips Stezifikationen und 
Datasheets zu lesen und einfach nach zu implementieren. Die laufen schon 
seit den 80-er Jahren stabil.
Und an zu wenig Transistoren dürfte es bei neuen MCs ja nicht scheitern.

Ich hab jahrelang die uralten Philips MCs (P87C751, P80C652) mit I2C 
benutzt, die laufen wie dumm ohne jede Störung als Single-Master, 
Multi-Master und Slave.

Wenn das HW-I2C buggy ist, kann man Single-Master ganz bequem mit 2 
IO-Pins in SW implementieren. Kostet zwar mehr CPU-Last, läuft dafür 
aber 100% zuverlässig.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.