Forum: Mikrocontroller und Digitale Elektronik SPI-ADC gibt mir nur CH0 aus


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

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!

von PittyJ (Gast)


Lesenswert?

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.

von M. K. (sylaina)


Lesenswert?

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?

von Chris (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ Chris (Gast)

>Ich schau mal, dass ich von irgendwo nen Scope abgreifen kann.

Ein billiger Logicanalyzer reicht.

von H.Joachim S. (crazyhorse)


Lesenswert?

Wie sieht denn die Initialisierung der SPI aus?

von Chris (Gast)


Lesenswert?

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.

von H.Joachim S. (crazyhorse)


Lesenswert?

spi.open(0,1)
Tja - und das heisst? Wird ja CPOL und CPHA sein, aber was bedeutet es?

von H.Joachim S. (crazyhorse)


Lesenswert?

und überschreibst du das mit spi.mode=0 nicht gleich wieder.
Mode0 heisst normalerweise CPOL=CPHA=0.

von Chris (Gast)


Lesenswert?

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.

von H.Joachim S. (crazyhorse)


Lesenswert?

ah, ok.

von Dunno.. (Gast)


Lesenswert?

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?

von Chris (Gast)


Lesenswert?

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!

von Chris (Gast)


Lesenswert?

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..

von Chris M. (chris_appment)


Angehängte Dateien:

Lesenswert?

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 :-)

von Chris M. (chris_appment)


Lesenswert?

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
Noch kein Account? Hier anmelden.