El MCP3008 solo da 0 o 1023: ¿cómo demuestro que el SPI funciona en una Pi 3B+?
Traducido del English por IA ·
Proyecto de fin de semana que se torció. Pi 3B+, un MCP3008 en una protoboard, leyendo un transmisor de presión de 4-20 mA en mi depósito de agua de lluvia a través de una resistencia de 150 ohmios (es decir, de 0,6 a 3,0 V). El plan es enviar tank_bar a Hermetry cada minuto.SPI está habilitado en raspi-config, y /dev/spidev0.0 y /dev/spidev0.1 existen. Pero el canal 0 marca 0 todo el tiempo y, al tocar el cable, salta a 1023 y vuelve. El canal 1 (sin nada conectado) marca lo mismo. Mi código:
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]
¿Cómo sé si el SPI en sí funciona, antes de culpar al chip? Ya cambié el MCP3008 una vez.
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.
Traducido del English por IA ·
siguiendo el hilo, tengo un MCP3008 en un cajón que tampoco logré hacer funcionar
following, I have an MCP3008 in a drawer I never got working either
Traducido del English por IA ·
¿VREF está conectada a 3,3 V? Si VREF está flotando, obtienes exactamente ese comportamiento de 0 / 1023.
Is VREF tied to 3.3 V? If VREF floats you get exactly that 0 / 1023 behaviour.
Traducido del English por IA ·
VREF y VDD están ambos a 3,3 V, AGND y DGND están a tierra. Lo he comprobado dos veces.
VREF and VDD both on 3.3 V, AGND and DGND on ground. Checked twice.
Traducido del English por IA ·
Pruebe primero el SPI por sí solo con un loopback, sin chip. Saque el MCP3008, ponga un cable puente desde MOSI (GPIO10, pin 19) a MISO (GPIO9, pin 21) y ejecute:
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"
Si RX muestra los mismos bytes que TX, la parte de la Pi está bien. Si RX es todo 00 o FF, el SPI no está funcionando realmente.Aun así, mi sospecha está en su código: spi.open(0, 1) usa el chip select CE1, que es GPIO7 en el pin 26. La mayoría de los tutoriales del MCP3008 conectan CS a CE0, es decir, GPIO8 en el pin 24. Si su CS va al pin 24, el chip nunca se selecciona, su salida queda flotando y obtiene 0 con algún 1023 cuando lo toca. O bien mueva el cable al pin 26, o cambie el código a spi.open(0, 0). Yo mismo cometí exactamente esta confusión en un banco de pruebas en el trabajo.Que el canal 1 dé el mismo valor es la pista: un chip no seleccionado devuelve la misma basura en todos los canales.
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.
Traducido del English por IA ·
La prueba de loopback merece la pena guardarla en tus notas. Me salvó dos veces.
The loopback test is worth keeping in your notes. Saved me twice.
Traducido del English por IA ·
Una vez que lea, coloca un condensador de 100 nF en la entrada, junto al chip. Los lazos de 4-20 mA captan mucho ruido en una protoboard.
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.
Traducido del English por IA ·
Para el escalado puede enviar los mA sin procesar y dejar que un bloque Scale en el flujo raíz de Hermetry convierta 4-20 en 0-10 bar. Así podrá ajustar el rango más adelante sin tocar la Pi.
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.
Traducido del English por IA ·
CE0 frente a CE1, por supuesto. CS estaba en el pin 24 y el código decía 1. Lo cambié a spi.open(0, 0) y el canal 0 ahora lee 412 con el tanque medio lleno, el canal 1 flota como debe. La prueba de loopback también pasó, así que me quedo con esa. Ahora envío mA y escalo en el flujo, como dijo twilson.
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.
- Debes estar registrado para responder a este debate.
Únete a la conversación
Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

