SPI Signal des RPI scheint falsch zu sein

OP #6048760
Lesenswert?

Schönen guten Abend,

derzeit versuche ich die Kommunikation zwischen einem Raspberry PI 3 
Model B und einem MCP3008 I/SL ADC zu ermöglichen. Das Programm hab ich 
aus dem Buch PI Buch von Kofler abgeschrieben und ausprobiert, 
allerdings musste ich feststellen, dass der AD-Wandler keine Werte 
zurückgibt. Nach Messungen mit einem Oszilloskop konnte ich feststellen, 
dass sich das D0-Bit für die Konfiguration des AD-Wandlers auf der 
falschen Stelle befindet. Könnte mir bitte jemand einen Ausweg erklären?

Das Programm lautet wie folgt:
1
#!/usr/bin/python3
2
import spidev
3
import time
4

5
spi = spidev.SpiDev()
6
spi.open(0,0)
7
spi.max_speed_hz = 500000
8

9
while True:
10
    antwort = spi.xfer([1, 129, 0])
11
    if 0 <= antwort[1] * 256 <= 3:
12
        wert = ((antwort[1] * 256) + antwort[2]) * 0.00322
13
        print(wert, "V")
14
        time.sleep(1)

MfG Mathias
Angehängte Dateien:
Gast #6048764
Lesenswert?

Das Signal sieht auf deinem Oszilloskop grausam schlecht aus. Kannst du 
das nochmal mit ordentlicher Masse-Verbindung und Tastkopf messen, so 
dass man darauf ordentlich was erkennen kann?

Für diese Art von Signal eignet sich ein Logic Analyzer wesentlich 
besser. Nimm zum Beispiel diesen: 
https://www.amazon.de/AZDelivery-%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90-Logic-Analyzer-gratis/dp/B01MUFRHQ2/ref=sr_1_13

Dann bekommst du solche Schicken Ausgaben: 
https://sigrok.org/blog/sites/default/files/20131010-logicport-bitbang.png
Gast #6050009
Lesenswert?

Mathias D. schrieb:
> Nach Messungen mit einem Oszilloskop konnte ich feststellen,
> dass sich das D0-Bit für die Konfiguration des AD-Wandlers auf der
> falschen Stelle befindet.

Mathias D. schrieb:
> antwort = spi.xfer([1, 129, 0])

Na du hast das "D0-Bit" auch an der falschen Stelle gesetzt.
Der zweite Wert für das zweite Byte lautet 129.
129 = 128 | 1
-> 128 = SGL/DIFF (Bit 9) auf '1' gesetzt
-> 1   = keine Funktion/Don't Care (Bit 16) auf '1' gesetzt.
Die Adress-Bits liegen aber auf
-> 64 = D2 (Bit 10)
-> 32 = D1 (Bit 11)
-> 16 = D0 (Bit 12)

Wenn du Adresse D0 setzten und Single Ended Messen möchtest,
hättest du also:
128 | 16 = 144
antwort = spi.xfer([1, 144, 0])
schreiben müssen.
Gast #6050068
Lesenswert?

Stefan F. schrieb:
> Das Signal sieht auf deinem Oszilloskop grausam schlecht aus.

Evtl. hilft schon ein kleiner Serienwiderstand gegen das Klingeln von 
SCL.

Mathias D. schrieb:
> IMG_20191122_190134.jpg

Wenn man das Bild um 90° dreht, wird das Signal zwar nicht schöner, aber 
man verrenkt sich beim Betrachten wenigstens nicht den Hals. ;-)

Tip: Die Verzerrungen entstehen, wenn man die Kamera nicht mittig über 
das Papier hält.
Gast #6050127
Lesenswert?

Forist schrieb:
> Evtl. hilft schon ein kleiner Serienwiderstand gegen das Klingeln von
> SCL.

Ja. Oder es ist schlicht ein Messfehler (Oszilloskop falsch 
angeschlossen). Dem sollte man auf jeden Fall nachgehen. Es soll ja am 
Ende zuverlässig funktionieren, nehme ich an.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren