Forum: Mikrocontroller und Digitale Elektronik Rettung für meinen digitalem Poti MCP4651 wegen I2C-Problemen


von Stephan P. (stevep)


Lesenswert?

Hallo,

ich habe einen MCP4651 und den via I2C an einen Raspberry Pi 
geschlossen. Ich betreibe ihn mit 5V und einen Logik-Level-Shifter 
dazwischen (da der Raspberry nur 3,3V am GPIO liefert)

Anfangs hat alles super geklappt. Ich konnte mit i2cdetect den IC unter 
der Adresse sehen (0x28), mit der ich ihn gemäß der pins konfiguriert 
hatte.

Dann habe ich versucht den Status auszulesen. Dafür gibt es eine eigene 
Register-Adresse 0x05. Also bin ich mit

    i2cget -y 1 0x28 0x05 w

drauf losgegangen und habe auch 0x8100 zurückbekommen. Dieser Wert 
entspricht nicht dem, was im Datenblatt dazu steht. Deshalb habe ich 
versucht statt einem Word (siehe oben das w am Schluß) nur ein Byte (b) 
zu lesen. Das brachte nur 0x00, was auch nicht ganz passt.

Zum eigentlichen Problem: Leider "unabsichtlich" (ich hatte mich in der 
man-page verlesen) habe ich dann noch ein

    i2cget -y 1 0x28 0x05 c

abgesetzt, was - wie ich nachher rausbekommen habe - eine "schreibe ein 
Byte und lese ein Byte"-Kombination ist.

Danach - oder besser ich weiß nicht ob es dadurch oder schon nach dem 
0x8100 response war - spricht der IC gar nicht mehr und blockiert den 
ganzen I2C-Bus. Wenn ich i2cdetect aufrufe, bekomme ich eine Anzeige als 
hätte ich 127 Geräte am Bus hängen. Wenn ich den IC vom Bus nehme, dann 
ist die Anzeige normal, weshalb ich davon ausgehen, dass der IC nun 
etwas abbekommen hat.

Meine Frage nun: Hat irgendwer Erfahrung ob ich dieses Ding resetten 
kann oder mit i2cset (oder ähnlichem) die I2C-Kommunikation wieder 
herstellen kann? Natürlich habe ich das Ding schon vom Strom genommen 
und wieder angehängt, jedoch hat dies keine Auswirkung. Das alleine ist 
schon interessant, weil das Ding eigentlich keinen EEPROM hat, sondern 
nur RAM und das sollte doch bedeuten, dass ein Ab- und Anschaltung immer 
hilft!? Meine "graue" Theorie ist, dass ich durch das 
write/read-Kommando in die Status-Register-Adresse etwas hinein 
geschrieben habe, was ihn nun komplett durcheinander gebracht hat, aber 
warum sollte das dauerhaft sein?

Leider habe ich gerade nur den einen IC und einen weiteren zu besorgen 
würde Zeit brauchen (gibt es nicht im Laden, sondern nur auf 
Bestellung).

Hat wer eine Idee, wie ich das Ding wieder zum Laufen bringe?

Danke!

von Mike (Gast)


Lesenswert?

Stephan P. schrieb:
> Leider habe ich gerade nur den einen IC und einen weiteren zu besorgen
> würde Zeit brauchen (gibt es nicht im Laden, sondern nur auf
> Bestellung).

Das Ding kostet keinen Euro und ist innerhalb von einem Werktagen 
lieferbar. Was willst du da groß hinterherjammern.

von Irgendwer (Gast)


Lesenswert?

Stephan P. schrieb:
> Ich betreibe ihn mit 5V und einen Logik-Level-Shifter
> dazwischen (da der Raspberry nur 3,3V am GPIO liefert)

Und wo liegt da der Sinn drin wenn das Ding von Hause aus auch mit 3,3V 
arbeitet?

MCP4651 : Wide Operating Voltage:  2.7V to 5.5V - Device Characteristics 
Specified

von Stephan P. (stevep)


Lesenswert?

> Und wo liegt da der Sinn drin wenn das Ding von Hause aus auch mit 3,3V
> arbeitet?

Na weil es auch noch andere Komponenten in der Schaltung gibt die jedoch 
nur 5V vertragen. Ich hatte es eigentlich nur der Vollständigkeit halber 
erwähnt.

von Stephan P. (stevep)


Lesenswert?

> Das Ding kostet keinen Euro und ist innerhalb von einem Werktagen
> lieferbar. Was willst du da groß hinterherjammern.

Unter anderem, weil das Ding ein TSSOP Package ist und nicht eben 
einfach mal auf ein Steckbrett drauf geht. Ich hatte noch ein 
Breakoutboard von einem anderen IC den ich runtergelötet habe, aber das 
Board war selbst geätzt und die Platine verträgt es nicht nocheinmal 
etwas runter und wieder raufzugeben. Also bedeutet das neue 
Breakoutboards erstellen (ich mache so etwas mit dem 
Direkttonerverfahren). Alles in allem nicht wenig Aufwand.

Aber Leute: Bitte bei der Sache bleiben! Ich hatte diese Frage hier 
gestellt, um Input von Leuten zu bekommen, die mit I2C Erfahrung haben 
und nicht um die Sinnhaftigkeit meiner Frage zu diskutieren. 
Grundsätzlich geht es mir um das Verständnis und nicht darum eh 
offensichtliche Lösungen (jedoch ohne Lerngehalt) aufgezeigt zu 
bekommen.

von Peter D. (peda)


Lesenswert?

Stephan P. schrieb:
> Ich betreibe ihn mit 5V und einen Logik-Level-Shifter
> dazwischen

Welchen denn?
Sind auch auf dessen beiden Seiten je 2 Pullups dran?

von Peter D. (peda)


Lesenswert?

Stephan P. schrieb:
> Wenn ich i2cdetect aufrufe, bekomme ich eine Anzeige als
> hätte ich 127 Geräte am Bus hängen.

Dann ist das i2cdetect Schrott. Es sollte wenigstens erkennen, ob SDA, 
SCL auch wirklich high ausgeben, wenn high gesendet wird.

Hat der RP ein HW- oder ein SW-I2C?

von hauspapa (Gast)


Lesenswert?

Nur weil es mir gerade selbst passiert ist:
ESD Schaden kannst Du ausschliessen? Ich habe mit synthetischer Kleidung 
vorgestern eine WS2812 RGB Led ins jenseits befördert.

viel Erfolg
Hauspapa

von Stephan P. (stevep)


Lesenswert?

Peter Dannegger schrieb:
> Stephan P. schrieb:
>> Ich betreibe ihn mit 5V und einen Logik-Level-Shifter
>> dazwischen
>
> Welchen denn?
> Sind auch auf dessen beiden Seiten je 2 Pullups dran?

Es ist das Ding: http://electronics.semaf.at/Logic-Level-Converter

Der ist an sich unidirektional, aber der TX-Kanal ist eh bidirektional.

Aber grundsätzlich hat die Kommunikation schon funktioniert, weshalb ich 
die Funktion dessen nicht angezweifelt hätte. Aber ja, die zwei Pullups 
sind dran.

von Stephan P. (stevep)


Lesenswert?

Peter Dannegger schrieb:
> Dann ist das i2cdetect Schrott. Es sollte wenigstens erkennen, ob SDA,
> SCL auch wirklich high ausgeben, wenn high gesendet wird.
>
> Hat der RP ein HW- oder ein SW-I2C?

Das kann ich leider nicht sagen. Dummerweise habe ich kein Oszi, weshalb 
ich mit herkömmlichen Methoden versuchen muss das zu debuggen.

von Stephan P. (stevep)


Lesenswert?

hauspapa schrieb:
> ESD Schaden kannst Du ausschliessen?

Ja, das Ding ist während des gesamten Vorganges (als es noch ging und 
auch danach) unangetastet gewesen. Aber danke für den Hinweis!

von Klaus (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Dann ist das i2cdetect Schrott. Es sollte wenigstens erkennen, ob SDA,
> SCL auch wirklich high ausgeben, wenn high gesendet wird.

Das scheint das Standard Linux Tool zu sein. Das kann natürlich nur das 
erkennen, was der Kerneltreiber und die darunterliegende Hardware 
unterstützt. Ein echter Zugriff auf die Hardware ist im Usermode nicht 
möglich.

MfG Klaus

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.