Le MCP3008 ne donne que 0 ou 1023 : comment prouver que le SPI fonctionne sur un Pi 3B+ ?
Traduit de English par IA ·
Projet du week-end parti de travers. Pi 3B+, un MCP3008 sur une breadboard, lecture d’un transmetteur de pression 4-20 mA installé sur ma cuve d’eau de pluie via une résistance de 150 ohms (donc 0,6 à 3,0 V). Le plan est d’envoyer tank_bar à Hermetry toutes les minutes.Le SPI est activé dans raspi-config, /dev/spidev0.0 et /dev/spidev0.1 existent tous les deux. Mais le canal 0 reste à 0 en permanence, et quand je touche le fil il passe à 1023 puis revient. Le canal 1 (rien de connecté) donne la même chose. Mon 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]
Comment savoir si le SPI lui-même fonctionne, avant d’incriminer la puce ? J’ai déjà remplacé le MCP3008 une fois.
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.
Traduit de English par IA ·
je suis le sujet, j’ai un MCP3008 dans un tiroir que je n’ai jamais réussi à faire fonctionner non plus
following, I have an MCP3008 in a drawer I never got working either
Traduit de English par IA ·
VREF est-elle reliée à 3,3 V ? Si VREF est flottante, vous obtenez exactement ce comportement 0 / 1023.
Is VREF tied to 3.3 V? If VREF floats you get exactly that 0 / 1023 behaviour.
Traduit de English par IA ·
VREF et VDD sont tous deux à 3,3 V, AGND et DGND sont à la masse. Vérifié deux fois.
VREF and VDD both on 3.3 V, AGND and DGND on ground. Checked twice.
Traduit de English par IA ·
Testez d’abord le SPI seul, en boucle (loopback), sans puce. Retirez le MCP3008, reliez MOSI (GPIO10, broche 19) à MISO (GPIO9, broche 21) avec un cavalier, puis lancez :
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 affiche les mêmes octets que TX, la partie Pi fonctionne. Si RX ne contient que des 00 ou des FF, le SPI ne tourne pas vraiment.Mon intuition porte cependant sur votre code : spi.open(0, 1) utilise la sélection de puce CE1, soit GPIO7 sur la broche 26. La plupart des tutoriels MCP3008 câblent CS sur CE0, soit GPIO8 sur la broche 24. Si votre CS va à la broche 24, la puce n’est jamais sélectionnée, sa sortie flotte, et vous obtenez 0 avec de temps en temps 1023 quand vous la touchez. Déplacez le fil sur la broche 26 ou remplacez le code par spi.open(0, 0). J’ai fait exactement cette confusion sur un banc de test au travail.Le fait que le canal 1 donne la même valeur est révélateur : une puce non sélectionnée renvoie les mêmes données parasites sur chaque canal.
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.
Traduit de English par IA ·
Le test en boucle (loopback) mérite d’être gardé dans vos notes. Il m’a sauvé deux fois.
The loopback test is worth keeping in your notes. Saved me twice.
Traduit de English par IA ·
Une fois que la lecture fonctionne, place un condensateur de 100 nF sur l’entrée, à côté de la puce. Les boucles 4-20 mA captent beaucoup de bruit sur une breadboard.
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.
Traduit de English par IA ·
Pour la mise à l’échelle, vous pouvez envoyer les mA bruts et laisser un bloc Scale dans le flux racine de Hermetry convertir 4-20 en 0-10 bar. Vous pourrez ainsi corriger la plage plus tard sans toucher au 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.
Traduit de English par IA ·
CE0 ou CE1, bien sûr. CS était sur la broche 24 et le code indiquait 1. Je l’ai remplacé par spi.open(0, 0) et le canal 0 affiche maintenant 412 avec le réservoir à moitié plein, le canal 1 flotte comme il se doit. Le test en boucle (loopback) a aussi réussi, donc je garde celui-là. J’envoie les mA maintenant et je fais la mise à l’échelle dans le flux, comme l’a dit 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.
- Vous devez être connecté pour répondre à ce sujet.
Rejoignez la discussion
Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

