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

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.