MCP3008 Daisychainen met een Raspberry Pi

Hi Allemaal,

Ik probeer een tweetal MCP3008 te daisychainen en twee potmeters uit te lezen met mijn raspberry pi.

Als ik er één probeer uit te lezen, gaat dat goed. Echter tijdens het daisychainen gaat het fout.

Hieronder een fritzing van mijn opstelling:

En hier het elektrische schema:

Mijn daisychain is gebaseerd op het onderstaande principe:

Vervolgens probeer ik de eerste MCP3008 uit te lezen met onderstaande code in Python:

code:

import spidev
import time

spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 1000000

def read_spi(channel):
  spidata = spi.xfer2([0,(8+channel)<<4,0])
  return ((spidata[1] & 3) << 8) + spidata[2]

try:
  while True:
    channeldata = read_spi(0)
    print (channeldata)
    time.sleep(.1)

except KeyboardInterrupt:
  spi.close()

Ik krijg wel waardes binnen, maar deze fluctueren tussen de 0 en 1023, zonder dat ik de potentiometer überhaupt verander.

Heeft er iemand een idee waar het mis gaat?

Hoor het graag, alvast bedankt.

Devatu

Arco

Special Member

Ik lees nergens in de datasheet dat daisy-chaining mogelijk is?
(ze hangen gewoon alle chips aan een SPI bus, en gebruiken voor iedere chip een eigen /SS signaal...)
Misschien gaat het wel, maar ik zie niemand die dat doet. (wel goede SPI mode gekozen/werkt een enkele wel?)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

volgens mij moeten de slave selects voor ieder device apart uitgevoerd worden.

en daarbij, dat ding heeft toch 8 kanalen? waarom gebruik je alleen kanaal 1?

GMT+1
eSe

Honourable Member

PCI is een 8 bits schuifregister, simpel gesteld. Als je deze wil uitlezen, voeden dan moeten er 8 lees/schrijf pulsen gegeven worden. Je zou ze alle 3 achter elkaar kunnen uitlezen met 24 pulsen, maar het zou kunnen dat de 1ste PCI slave de bits van de 2de slave ziet als een "command" en de 2de slave de bits ziet van de 3de als een "command". Ik denk dat je de MOSI/MISO/SCLK gewoon parallel moet aansluiten en met 3 chipselects zal moeten werken.

Groetjes,
eSe

CChheecckk yyoouurr dduupplleexx sswwiittcchh..
Arco

Special Member

PCI is een 8 bits schuifregister, simpel gesteld.

Mag het SPI zijn?... (PCI werkt iets anders... :) )
Daisychaining gaat alleen als de chip daar geschikt voor is (zoals de WS2812).
Zoals @progger en ik al aangaven: gewoon SPI bus parallel aansluiten met iedere chip een eigen /SS

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

PCI is wat complexet :-) SPI dus. [edit, te laat] Ik zou ook in de datasheet wel willen zien dat je kunt chainen. Normaal is MISO alleen actief bij lezen, en schuift het niet door wat je via MOSI inschuift. Normaal, kan hier anders zijn.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
eSe

Honourable Member

Sorry, SPI, zat met mijn gedachten ergens anders :-)
En het is een dubbel schuifregister, ingaand en uitgaand met dezelfde clock. Ingaand word meestal gebruikt als command register, uitgaand als dataregister.

Groetjes,
eSe

CChheecckk yyoouurr dduupplleexx sswwiittcchh..
Arco

Special Member

Je moet via SPI opgeven welk kanaal er aan de beurt is. Bij daisy-chaining wordt die info niet aan de volgende chip doorgegeven en gaat dus nooit werken.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
KGE

Golden Member

Het principe lijkt afgekeken van de HC595 schuifregisters, helaas gaat dat niet werken met 'echte' SPI IC's zoals de MCP3008.
Je schuift nu data door naar de volgende MCP3008 die er helemaal niets van snapt en de volgende al helemaal niet :-)

SCLK, MISO en MOSI van de MPC3008 mag je dus allemaal parallel aansluiten en de /SS lijnen allemaal apart uitvoeren, 1 tegelijk laag maken en stuk voor stuk uitlezen.

Met software SPI zou je nog de truc uit kunnen halen dat je de MISO lijnen van de verschillende MCP3008 ook apart invoert dan zou je 'semi parallel' de data uit kunnen lezen.

Bedankt allen voor de antwoorden!

Ik heb wel kant en klare boards gevonden die een attiny44A chip gebruiken om SPI te daisychainen op 1 Slave select.
Via de EEPROM kun je dan adressen geven aan ieder apparaat en ze zo individueel benaderen door de daisy chain.

Wat is het verschil t.o.v. de MCP3008 hierin?

Arco

Special Member

De Attiny is een microcontroller, dus daar ben je vrij om de SPI zelf te configureren, de MCP is alleen een SPI slave...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com