MCP3008 yalnızca 0 ya da 1023 veriyor: Pi 3B+ üzerinde SPI'nin çalıştığını nasıl kanıtlarım?
Yapay zekâ tarafından English dilinden çevrildi ·
Hafta sonu projesi ters gitti. Pi 3B+, breadboard üzerinde bir MCP3008, yağmur suyu tankımdaki 4-20 mA basınç vericisini 150 ohm’luk bir direnç üzerinden okuyor (yani 0,6 ila 3,0 V). Plan, her dakika tank_bar değerini Hermetry’ye göndermek.SPI, raspi-config içinde etkin ve /dev/spidev0.0 ile /dev/spidev0.1 ikisi de mevcut. Ama kanal 0 sürekli 0 okuyor ve kabloya dokunduğumda 1023’e sıçrayıp geri dönüyor. Kanal 1 (hiçbir şey bağlı değil) aynı değeri okuyor. Kodum:
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]
Çipi suçlamadan önce SPI’nin kendisinin çalışıp çalışmadığını nasıl anlarım? MCP3008’i bir kez zaten değiştirdim.
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.
Yapay zekâ tarafından English dilinden çevrildi ·
takip ediyorum, ben de çekmecede duran bir MCP3008’i hiç çalıştıramadım
following, I have an MCP3008 in a drawer I never got working either
Yapay zekâ tarafından English dilinden çevrildi ·
VREF 3.3 V’a bağlı mı? VREF yüzen durumdaysa tam olarak bu 0 / 1023 davranışını görürsünüz.
Is VREF tied to 3.3 V? If VREF floats you get exactly that 0 / 1023 behaviour.
Yapay zekâ tarafından English dilinden çevrildi ·
VREF ve VDD ikisi de 3,3 V’ta, AGND ve DGND toprağa bağlı. İki kez kontrol ettim.
VREF and VDD both on 3.3 V, AGND and DGND on ground. Checked twice.
Yapay zekâ tarafından English dilinden çevrildi ·
Önce çip olmadan, loopback ile SPI’yi tek başına test edin. MCP3008’i çıkarın, MOSI (GPIO10, pin 19) ile MISO (GPIO9, pin 21) arasına bir jumper kablo takın ve şunu çalıştırın:
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"
RX, TX ile aynı baytları gösteriyorsa Pi tarafı sorunsuz demektir. RX tamamen 00 veya FF ise SPI gerçekten çalışmıyor demektir.Ama bence sorun kodunuzda: spi.open(0, 1) çip seçimi olarak CE1’i kullanır; bu da pin 26’daki GPIO7’dir. Çoğu MCP3008 eğitiminde CS, CE0’a, yani pin 24’teki GPIO8’e bağlanır. CS’iniz pin 24’e gidiyorsa çip hiç seçilmez, çıkışı havada kalır ve ona dokunduğunuzda 0 ile ara sıra 1023 görürsünüz. Ya kabloyu pin 26’ya taşıyın ya da kodu spi.open(0, 0) olarak değiştirin. Bunun tam aynı karışıklığını işte bir test tezgahında yaşadım.Kanal 1’in de aynı değeri vermesi ipucu: seçilmemiş bir çip her kanalda aynı anlamsız değeri üretir.
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.
Yapay zekâ tarafından English dilinden çevrildi ·
Loopback testini notlarınızda saklamaya değer. Bana iki kez işe yaradı.
The loopback test is worth keeping in your notes. Saved me twice.
Yapay zekâ tarafından English dilinden çevrildi ·
Okuma yapmaya başladığında, çipin yanındaki girişe 100 nF’lik bir kondansatör koy. 4-20 mA döngüleri breadboard üzerinde çok fazla gürültü toplar.
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.
Yapay zekâ tarafından English dilinden çevrildi ·
Ölçeklendirme için ham mA değerini gönderebilirsiniz; Hermetry’nin root akışındaki bir Scale bloğu 4-20 değerini 0-10 bar’a çevirir. Böylece aralığı daha sonra Pi’ye dokunmadan düzeltebilirsiniz.
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.
Yapay zekâ tarafından English dilinden çevrildi ·
Tabii ki CE0 ile CE1 meselesi. CS pini 24 numaraya bağlıydı ama kod 1 diyordu. spi.open(0, 0) olarak değiştirdim ve kanal 0 artık tank yarı doluyken 412 okuyor, kanal 1 de beklendiği gibi boşta kalıyor. Loopback testi de geçti, o yüzden onu tutacağım. Şimdi mA gönderiyorum ve twilson’ın dediği gibi ölçeklendirmeyi akışta yapıyorum.
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.
- Bu konuyu yanıtlamak için giriş yapmış olmalısınız.
Sohbete katılın
Soru sormak ve yanıtlamak, yararlı gönderileri beğenmek ve sorununuzu çözen yanıtı işaretlemek için oturum açın. Her katkı puan ve seviye kazandırır.

