Mahlzeit, hänge mal wieder an meinem geliebten ADC ( ADS7961SDBT von TI ) fest. Programmiere mit Python aufm dem PI. Der sch... ADC gibt mir aber immer nur CH0 aus. Habe auf jedem Channel zu Testzwecken etwas angeschlossen. Aber wie gesagt nur CH0 wird (wenigstens korrekt) ausgegeben. Wo ist mein Fehler in der Programmierung? Jaja ich weiß das Problem sitzt immer davor :) Hier der wichtige Schnipsel ausm Programm spi.xfer2([0x8]) spi.xfer2([0x00, 0x00, 0x00, 0x2]) #Zum testen für CH1 Randinfo: spi.xfer2 hält während dem Byte-Senden den CS-Pin dauerhaft auf low. spi.xfer ohne 2 würde nach jedem Byte CS wieder auf high ziehen. Sieht jemand meinen Fehler? Im Anhang der Mode, der programmiert werden soll. Vielen Dank im Voraus!
Ich hänge da immer ein Scope ran, dann sieht man, was wirklich ankommt, und ob der Chip darauf reagiert. Alles andere ist nur stochern im Nebel.
Chris schrieb: > spi.xfer2([0x8]) > spi.xfer2([0x00, 0x00, 0x00, 0x2]) #Zum testen für CH1 Wenn ich das recht sehe, in deinem angehangenen Bild, erwartet das Device immer 16 bit. Mit dem ersten spi.xfer2 schickst du aber nur 8 bit. Kann das eventuell der Fehler sein?
Scope hab ich leider erst in nem Monat wieder zur Verfügung. Den ersten Frame mit Dummies zu füllen hab ich schon getestet. Also: spi.xfer2([0x8, 0x00, 0x00, 0x00]) //Erster Frame Leider auch nur CH0. Ich schau mal, dass ich von irgendwo nen Scope abgreifen kann.
@ Chris (Gast)
>Ich schau mal, dass ich von irgendwo nen Scope abgreifen kann.
Ein billiger Logicanalyzer reicht.
H.Joachim S. schrieb: > Wie sieht denn die Initialisierung der SPI aus? spi = spidev.SPIDev() spi.open(0,1) spi.max_speed_hz = 500000 spi.mode = 0 dann kommt schon meine 2-Frame-Konfiguration.
spi.open(0,1) Tja - und das heisst? Wird ja CPOL und CPHA sein, aber was bedeutet es?
und überschreibst du das mit spi.mode=0 nicht gleich wieder. Mode0 heisst normalerweise CPOL=CPHA=0.
H.Joachim S. schrieb: > spi.open(0,1) > Tja - und das heisst? Wird ja CPOL und CPHA sein, aber was bedeutet es? Damit wählt man lediglich einen der beiden CS-Pins, die beim Raspi extra für SPI vorgesehen wurden.
M. K. schrieb: > Chris schrieb: > spi.xfer2([0x8]) > spi.xfer2([0x00, 0x00, 0x00, 0x2]) #Zum testen für CH1 > > Wenn ich das recht sehe, in deinem angehangenen Bild, erwartet das > Device immer 16 bit. Mit dem ersten spi.xfer2 schickst du aber nur 8 > bit. Kann das eventuell der Fehler sein? Chris schrieb: > Den ersten Frame mit Dummies zu füllen hab ich schon getestet. Also: > spi.xfer2([0x8, 0x00, 0x00, 0x00]) //Erster Frame Das sind dann aber 32 Bit? Gleiches bei der kanalwahl. Wundert mich eigentlich, das ch0 nicht abgeschaltet ist, danach?
Lt. Datenblatt springt der ADC nach dem Start in den manuellen Modus und hat als Default immer CH0 gewählt. Da sich wirklich gar nichts ändert, wird irgendwas mit der Kommunikation falsch sein. Werde mir einen Analyzer kaufen und dann mal von den Ergebnissen berichten. Alles andere ist, wie schon gesagt, nur in der Luft herumgestochert. Trotzdem danke für die Tipps!
Achso und selbstverständlich ist es 16Bit. Meine Konfiguration von oben gehört in die Rubrik "Hand an die Stirn klatschen". Leider hat die neue Konfiguration auch nichts gebracht. Habs auch mal in Bitschreibweise abgeändert. Jetzt ist es noch deutlicher. spi = spidev.SPIDev() spi.open(0,1) spi.max_speed_hz = 500000 spi.mode = 0 spi.xfer2([0b10000000, 0b00000000]) while True: Antwort = spi.xfer2([0b00000000, 0b00000010]) #Testen für CH1 print (Antwort) time.sleep(1) Habe jegliche Varianten mit in der Schleife und außerhalb der Schleife schon probiert.. Bleibt weiterhin bei CH0. Naja wie gesagt.. Abwarten..
So der Analyzer kam an. Hab ihn angeschlossen und bekomme die im Anhang angefügten Ausgaben. Zwischen beiden Frames ging der CS wieder auf High. Ist auf den Screenshots nicht zu erkennen. Für mich ist jetz die Frage: Wieso spuckt der ADC während der Modus-Konfiguration schon was aus? und Wieso spuckt er seinen Wert von CH0 ebenfalls bevor CH0 überhaupt gewählt wurde aus? Bin noch ziemlich neu mit SPI unterwegs, falls ich hier nen Vogel abgeschossen habe, bitte nicht gleich mit Steinen auf mich werfen :-)
Er läuft! Das Problem saß wie immer davor. Man sollte das Datenblatt gründlich lesen, dann wird man auch feststellen, dass der ADC bevor er im AUTO-Mode die Channels auslesen soll, überhaupt mal gesagt bekommen will, dass er im AUTO-Mode laufen soll. Klassischer Fall von Hand an die Stirn schlagen. Falls jemand mal ähnliche Probleme damit haben sollte, hier der funktionierende Code: Auto-1: Scant in jedem Schleifendurchlauf einen Channel aufsteigend ab spi.xfer2([0b10000000, 0b00000000)] spi.xfer2([0b11111111, 0b11111111)] #alle #spi.xfer2([0b00000000, 0b00000001)] #nur CH0 #spi.xfer2([0b00000000, 0b00000010)] #nur Ch1 while True: antwort = spi.xfer2([0b00101000, 0b00000000)] print (antwort) Damit gibt er den Bitwert der analogen Spannung des gewählten CH's aus. Nun noch in Volt umrechnen und Voilá, wie geplant funzt alles. Fazit: Erst lesen dann coden Fazit2: Wer lange dran bleibt und sich damit auseinander setzt kommt immer zum Ziel
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.