MCP3008 liefert nur 0 oder 1023: Wie beweise ich, dass SPI auf einem Pi 3B+ funktioniert?
Von English mit KI übersetzt ·
Wochenendprojekt außer Kontrolle geraten. Pi 3B+, ein MCP3008 auf einem Breadboard, liest einen 4-20-mA-Drucksensor am Regenwassertank über einen 150-Ohm-Widerstand aus (also 0,6 bis 3,0 V). Der Plan ist, tank_bar jede Minute an Hermetry zu senden.SPI ist in raspi-config aktiviert, /dev/spidev0.0 und /dev/spidev0.1 existieren beide. Aber Kanal 0 liefert dauerhaft 0, und wenn ich das Kabel berühre, springt er auf 1023 und zurück. Kanal 1 (nichts angeschlossen) zeigt dasselbe. Mein Code:
spi = spidev.SpiDev()
spi.open(0, 1)
spi.max_speed_hz = 1350000
r = spi.xfer2([1, (8 + 0) << 4, 0])
val = ((r[1] & 3) << 8) + r[2]
Wie erkenne ich, ob SPI selbst funktioniert, bevor ich den Chip verdächtige? Ich habe den MCP3008 bereits einmal getauscht.
Weekend project gone sideways. Pi 3B+, an MCP3008 on a breadboard, reading a 4-20 mA pressure transmitter on my rainwater tank through a 150 ohm resistor (so 0.6 to 3.0 V). The plan is to send tank_bar to Hermetry every minute.
SPI is enabled in raspi-config, /dev/spidev0.0 and /dev/spidev0.1 both exist. But channel 0 reads 0 forever, and when I touch the wire it jumps to 1023 and back. Channel 1 (nothing connected) reads the same. My code:
spi = spidev.SpiDev()
spi.open(0, 1)
spi.max_speed_hz = 1350000
r = spi.xfer2([1, (8 + 0) << 4, 0])
val = ((r[1] & 3) << 8) + r[2]
How do I tell whether SPI itself is working, before I start blaming the chip? I’ve already swapped the MCP3008 once.
Von English mit KI übersetzt ·
Ich verfolge das mit. Ich habe auch einen MCP3008 in einer Schublade, den ich ebenfalls nie zum Laufen gebracht habe
following, I have an MCP3008 in a drawer I never got working either
Von English mit KI übersetzt ·
Ist VREF mit 3,3 V verbunden? Wenn VREF schwebt, zeigt sich genau dieses Verhalten von 0 / 1023.
Is VREF tied to 3.3 V? If VREF floats you get exactly that 0 / 1023 behaviour.
Von English mit KI übersetzt ·
VREF und VDD liegen beide an 3,3 V, AGND und DGND liegen auf Masse. Zweimal überprüft.
VREF and VDD both on 3.3 V, AGND and DGND on ground. Checked twice.
Von English mit KI übersetzt ·
Testen Sie SPI zuerst für sich allein mit einem Loopback, ohne Chip. Ziehen Sie den MCP3008 ab, verbinden Sie MOSI (GPIO10, Pin 19) mit MISO (GPIO9, Pin 21) über einen Jumper und führen Sie aus:
wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-6.6.y/tools/spi/spidev_test.c
gcc -o spidev_test spidev_test.c
./spidev_test -D /dev/spidev0.0 -v -p "HELLO"
Wenn RX dieselben Bytes wie TX zeigt, ist die Pi-Seite in Ordnung. Wenn RX nur aus 00 oder FF besteht, läuft SPI nicht wirklich.Meine Vermutung liegt allerdings in Ihrem Code: spi.open(0, 1) verwendet die Chip-Select-Leitung CE1, also GPIO7 an Pin 26. Die meisten MCP3008-Anleitungen verbinden CS mit CE0, also GPIO8 an Pin 24. Wenn Ihr CS an Pin 24 liegt, wird der Chip nie selektiert, sein Ausgang schwebt, und Sie erhalten 0 mit gelegentlich 1023, wenn Sie ihn berühren. Entweder verlegen Sie die Leitung an Pin 26 oder ändern den Code auf spi.open(0, 0). Genau diese Verwechslung hatte ich bei der Arbeit an einem Testaufbau schon einmal.Dass Kanal 1 denselben Wert liefert, ist der Hinweis: Ein nicht selektierter Chip liefert auf jedem Kanal denselben Datenmüll.
Test SPI on its own first with a loopback, no chip. Pull the MCP3008 out, put a jumper from MOSI (GPIO10, pin 19) to MISO (GPIO9, pin 21) and run:
wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-6.6.y/tools/spi/spidev_test.c
gcc -o spidev_test spidev_test.c
./spidev_test -D /dev/spidev0.0 -v -p "HELLO"
If RX shows the same bytes as TX, the Pi side is fine. If RX is all 00 or FF, SPI isn’t really running.
My bet though is in your code: spi.open(0, 1) uses chip select CE1, which is GPIO7 on pin 26. Most MCP3008 tutorials wire CS to CE0, GPIO8 on pin 24. If your CS goes to pin 24, the chip is never selected, its output floats, and you get 0 with the odd 1023 when you touch it. Either move the wire to pin 26 or change the code to spi.open(0, 0). I’ve done this exact mixup on a bench at work.
Your channel 1 reading the same is the giveaway: an unselected chip gives the same junk on every channel.
Von English mit KI übersetzt ·
Der Loopback-Test lohnt sich, in deinen Notizen aufgehoben zu werden. Hat mir zweimal geholfen.
The loopback test is worth keeping in your notes. Saved me twice.
Von English mit KI übersetzt ·
Sobald er liest, setze einen 100-nF-Kondensator neben dem Chip an den Eingang. 4-20-mA-Schleifen nehmen auf einem Breadboard viel Rauschen auf.
Once it reads, put a 100 nF cap on the input next to the chip. 4-20 mA loops pick up a lot of noise on a breadboard.
Von English mit KI übersetzt ·
Für die Skalierung können Sie die rohen mA-Werte senden und einen Scale-Block im Root-Flow von Hermetry 4-20 in 0-10 bar umrechnen lassen. Dann können Sie den Bereich später ändern, ohne den Pi anzufassen.
And for the scaling you can send the raw mA and let a Scale block in Hermetry’s root flow turn 4-20 into 0-10 bar, then you can fix the range later without touching the Pi.
Von English mit KI übersetzt ·
CE0 vs. CE1, natürlich. CS lag an Pin 24, und im Code stand 1. Ich habe es auf spi.open(0, 0) geändert, und Kanal 0 liefert jetzt 412 bei halb vollem Tank, Kanal 1 schwebt wie es sollte. Der Loopback-Test hat ebenfalls bestanden, den behalte ich also. Ich sende jetzt mA und skaliere im Flow, wie twilson vorgeschlagen hat.
CE0 vs CE1, of course. CS was on pin 24 and the code said 1. Changed it to spi.open(0, 0) and channel 0 now reads 412 with the tank half full, channel 1 floats like it should. Loopback test passed too, so I’ll keep that one. Sending mA now and scaling in the flow as twilson said.
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Mitdiskutieren
Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

