Forum: Mikrocontroller und Digitale Elektronik Von I2C auf SPI umsteigen sinnvoll?


von Jay M. (blubb33)


Lesenswert?

Meine Steuerung (für einen Raspberry Pi) beinhaltet einen ADC, DAC und 
einen Expander. Alle Teile werden derzeit per I2C angesprochen. Damit 
komme ich gut klar und alles funktioniert wie es soll.

Aber: Mir stehen nur 8bit für den ADC/DAC (PCF8591) zu Verfügung. Das 
ist mir zu wenig. Ich möchte gerne 12bit haben. Aber genau hierin liegt 
die Schwierigkeit. Ich finde keinen 12bit ADC mit I2C Anbindung (der 
auch als Anfänger gut lötbar ist).

Für SPI finde ich alle Bauteile problemlos und günstig: MCP23S17 
(Expander), MCP4921 (DAC) und der MCP3201 (ADC).

Für mich wäre aber SPI komplett neu - deshalb wehre ich mich noch etwas 
dagegen, würde aber gerne hören, was ihr dazu meint. Ich habe das Gefühl 
(das muss gar nicht stimmen), dass alles Richtung I2C geht und SPI 
eher.. naja... sagen wir mal... etwas älter ist. (??)

Ist der Umstieg sinnvoll? Welche Vor- und Nachteile ergeben sich?

Mein Projekt ist ja mit diesen Bauteilen sehr simpel gehalten. Möchte 
aber später, wenn ich doch etwas erweitern sollte, keine böse 
Überraschung erleben wollen...

von Max H. (hartl192)


Lesenswert?

Jay Myon schrieb:
> Ist der Umstieg sinnvoll? Welche Vor- und Nachteile ergeben sich?
Vorteile: SPI ist schneller, es gibt für dich lötbare 12bit SPI ADCs und 
meiner Meinung nach einfacher.
Nachteile: Bei SPI brauchst du für jeden Slave eine eigene /CS Leitung

: Bearbeitet durch User
von Choose (Gast)


Lesenswert?

Wie du gesehen hast, gibt es deine gewünschten Bausteine nur mit SPI.
SPI ist Stand der Technik! Und viel schneller als I2C!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jay Myon schrieb:
> Ich habe das Gefühl
> (das muss gar nicht stimmen), dass alles Richtung I2C geht und SPI
> eher.. naja... sagen wir mal... etwas älter ist. (??)

Das Gefühl trügt. SPI ist für etwas andere Anwendungsgebiete, SPI ist 
kein Bus, sondern "verkraftet" mehrere Busteilnehmer nur mit zusätzliche 
Chipselect-Mechanismen, aber SPI kann mit erheblich höheren 
Datenübertragungsraten betrieben werden als I2C (bei dem 400 kHz Bittakt 
immer noch als schnell gelten, und immer noch Bausteine existieren, die 
nur für 100 kHz Bittakt ausgelegt sind).

von Jay M. (blubb33)


Lesenswert?

Vielen Dank für eure Antworten.
Das heißt also in SPI reindenken... Oje.. alles wieder von vorne. Naja, 
wird so schlimm schon nicht werden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jay Myon schrieb:
> Das heißt also in SPI reindenken... Oje.. alles wieder von vorne. Naja,
> wird so schlimm schon nicht werden.

Es ist deutlich simpler gestrickt, da es keine Adressierung gibt, und 
die Datenübertragung immer prinzipbedingt bidirektional ist.

von Jay M. (blubb33)


Lesenswert?

Hatte die Adressierung immer als angenehm empfunden, weil ich einfach 
direkt den IC ansprechen konnte, den ich wollte.

von Max H. (hartl192)


Lesenswert?

Jay Myon schrieb:
> Hatte die Adressierung immer als angenehm empfunden, weil ich einfach
> direkt den IC ansprechen konnte, den ich wollte.
Beim SPI hast du für jeden IC einen Chip-Select Pin, wenn du den auf '0' 
setzst fühlt er sich von den Daten angesprochen.
Vom Prinzip her ist SPI einfacher, keine Adressierung, Start- und Stop 
Conditions, einfach nur eine Chip-Select (/CS) Leitung.

: Bearbeitet durch User
von Michael H. (morph1)


Lesenswert?

Max H. schrieb:
> Beim SPI hast du für jeden IC einen Chip-Select Pin, wenn du den auf '0'
> setzst fühlt er sich von den Daten angesprochen.

Ist zwar jetzt eine Detailverliebtheit, aber das is so nicht richtig. 
Sagen wir besser du ziehst den Chip-Select auf den vom Chiphersteller 
vorgesehenen Pegel. Auch wenn sicher 99% aller SPI-Chips einen 
invertierten Chip-Select haben, gibt es leider auch Ausnahmen.

von X4U (Gast)


Lesenswert?

Jay Myon schrieb:
> Ich finde keinen 12bit ADC mit I2C Anbindung (der
> auch als Anfänger gut lötbar ist).

Warum nimmst du keinen Mikrocontroller der Marke deiner Wahl als 
Subsystem?

von Jay M. (blubb33)


Lesenswert?

Max H. schrieb:
> Beim SPI hast du für jeden IC einen Chip-Select Pin

Beim RPi sind spezielle Pins (GPIO 7 und 8: SPI_CE0 und SPI_CE1) 
vorgesehen. Ich verstehe nicht so ganz den Sinn, denn man wird ja mehr 
als zwei ICs ansprechen können...

von Max H. (hartl192)


Lesenswert?

Mit nur einem Slave pro SPI kann man die Problemlos verwenden, wenn man 
mehr Slaves hat muss man ein paar GPIOs dafür hernehmen. Vei der SPI Lib 
(wiringPi) die ich verwendet habe, wurde der SPI_CE0/SPI_CE1 automatisch 
vor dem Übertragen auf '0' gesetzt und danach automatisch wieder auf 
'1'.

: Bearbeitet durch User
von Jay M. (blubb33)


Lesenswert?

Schon, aber warum dann überhaupt die beiden Pins. Wenn ich doch einfach 
einen Pin je Slave verwende ist es doch egal, ob ich 7 und 8 oder 23 und 
24 nehme, oder?

von Max H. (hartl192)


Lesenswert?

Jay Myon schrieb:
> Schon, aber warum dann überhaupt die beiden Pins. Wenn ich doch einfach
> einen Pin je Slave verwende ist es doch egal, ob ich 7 und 8 oder 23 und
> 24 nehme, oder?
Um die anderen Pins musst du dich selbst kümmern. Wenn du mehr als einen 
Slave pro SPI hast, würde ich dies beiden Pins nicht verwenden und /CS 
manuell machen.

von Dirk K. (dekoepi)


Lesenswert?

Klar ist das egal - nur eben diese Pins können das alles komplett in 
Hardware steuern, also kannst du Automatismen nutzen. Bei den anderen 
GPIOs musst du dir selber Gedanken machen, wie du die Adressierung der 
Chips legst. (Ich muss zugeben, dass ich bislang immer mehrere 
SPI-Geräte nutze und daher noch nie den "Hardware-SS"-Pin genutzt habe.)

SPI ist deutlich einfacher als I2C. Habe 5 SPI-RAMs und zusätzlich 
SD-Karte mit einem 74HC138 via Multiplex auf drei GPIOs gelegt, 
korrekter könnte man 4 GPIOs nehmen und dann sogar noch mehr Geräte 
kaskadieren. Geschwindigkeiten von 20 MHz macht der Speicher etwa mit.

I2C musste ich hingegen für die beknackten Kameramodule als Bitbang 
basteln, weil die ein paar Animositäten pflegen. Also nochmal erschwert. 
Mit SPI läuft das eigentlich alles immer sofort, schnell und gut.

von Jay M. (blubb33)


Lesenswert?

Ok, eine letzte Grundlagenfrage noch und dann denke ich, dass ich alles 
zusammen habe:

Meine drei ICs versorge ich mit 5V.
Der RPi verträgt ja an den Pins nur 3,3V. Muss ich alle drei Leitungen 
(SCK, MOSI, MISO) per PullUp auf 3,3V hochziehen?

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

Jay Myon schrieb:
> Meine drei ICs versorge ich mit 5V.
Ich würe mach möglickeit alle ICs miz 3.3V versorgen
> Der RPi verträgt ja an den Pins nur 3,3V. Muss ich alle vier Leitungen
> (CS, SCK, MOSI, MISO) per PullUp auf 3,3V hochziehen?
Die SPI Pins sind Push-Pull, also ohne Pullup. Zwischen Slave Out und 
Master In brauchst du einen Pegelwandler, z.B. einen 
Spannungsteiler.

von Jay M. (blubb33)


Lesenswert?

Max H. schrieb:
> Ich würe mach möglickeit alle ICs miz 3.3V versorgen

Wieso? Ich frage deshalb, weil mir 5V direkt vorliegen (5V-Netzteil) und 
die ICs mit 5V laufen. Natürlich kann ich z.B. mit einem LM1117-3.3 auch 
3,3V generieren und damit die ICs laufen lassen, aber es ist wieder ein 
Baustein mehr. Ich sehe nicht die Notwendigkeit / den Vorteil dessen.

> Zwischen Slave Out und Master In brauchst du einen Pegelwandler

Kannst du dazu noch ein paar Worte verlieren?

von Max H. (hartl192)


Lesenswert?

Jay Myon schrieb:
> Max H. schrieb:
>> Ich würde nach Möglichkeit alle ICs mit 3.3V versorgen
> Wieso?
Spart den Pegelwandler.
> Ich frage deshalb, weil mir 5V direkt vorliegen (5V-Netzteil) und
> die ICs mit 5V laufen.
Der PRi hat auch einen +3.3V Ausgang am GPIO Header.
> Natürlich kann ich z.B. mit einem LM1117-3.3 auch
> 3,3V generieren und damit die ICs laufen lassen, aber es ist wieder ein
> Baustein mehr.
Und du Sparst die wie gesagt die Pegelwandler
>> Zwischen Slave Out und Master In brauchst du einen Pegelwandler
> Kannst du dazu noch ein paar Worte verlieren?
https://www.mikrocontroller.net/articles/Pegelwandler#5_V_.E2.87.92_3.2C3_V

: Bearbeitet durch User
von Rainer S. (rsonline)


Lesenswert?

MCP 3426A0-E/SN

AD-Wandler 16-Bit Delta-Sigma SOIC-8

Lötbar, I2C, 2,7-5,5 Volt, 2,10 €

http://www.google.com/search?q=MCP+3426A0-E%2FSN

von Jay M. (blubb33)


Lesenswert?

Max H. schrieb:
> Und du Sparst die wie gesagt die Pegelwandler
>>> Zwischen Slave Out und Master In brauchst du einen Pegelwandler

Achso... Wenn ich den IC mit 3,3V betreibe, dann brauche ich mir um die 
SPI-Leitungen quasi keine Gedanken machen, d.h. einfach anschließen und 
gut ist, ja?

@Rainer: Super. Vielen Dank. Ich finde das mit SPI jetzt gerade total 
spannend und scheinbar ist das ja zu bevorzugen. Ich versuche mich jetzt 
einfach mal daran. Falls es nicht klappt, werde ich darauf zurückkommen.

von Max H. (hartl192)


Lesenswert?

Jay Myon schrieb:
> Achso... Wenn ich den IC mit 3,3V betreibe, dann brauche ich mir um die
> SPI-Leitungen quasi keine Gedanken machen, d.h. einfach anschließen und
> gut ist, ja?
Genau.

von Jay M. (blubb33)


Angehängte Dateien:

Lesenswert?

So, dann wäre das jetzt meine Schaltung.

Kann das so funktionieren?
1) Versorgung der ICs mit 3,3V
2) ADC (erhält Input von einer pH-Sonde)
3) DAC (gibt eine analoge Spannung aus)
4) Expander (für weitere Schaltungen) - hier weiß ich nicht, wie ich 
INTA, INTB und RESET verschalten muss.

Aber sonst müsste es doch eigentlich stimmen, oder?

Wenn ja, muss ich jetzt "nur" noch für mich rauskriegen, wie ich die 
drei ICs ansprechen kann.

von Max H. (hartl192)


Lesenswert?

Die Entkoppel-C's (100nF Kerko zwischen Vdd und Vss jedes ICs) fehlen 
noch.

von c-hater (Gast)


Lesenswert?

Jay Myon schrieb:

> Beim RPi sind spezielle Pins (GPIO 7 und 8: SPI_CE0 und SPI_CE1)
> vorgesehen. Ich verstehe nicht so ganz den Sinn, denn man wird ja mehr
> als zwei ICs ansprechen können...

Wahrscheinlich hat das Teil zwei DMA-fähige SPI-Schnittstellen und das 
sind halt die diesen Schnittstellen zugeordneten CE-Pins, über die im 
DMA-Modus die Flußsteuerung ohne Eingriff der CPU erfolgt.

Wichtig besonders bei Nicht-Echtzeit-OS und Betrieb als Slave, denn ohne 
diesen Mechanismus wären unter diesen Umständen nur äußerst bescheidene 
Datenraten zuverlässig erreichbar.

von Max H. (hartl192)


Lesenswert?

Jay Myon schrieb:
> 4) Expander (für weitere Schaltungen) - hier weiß ich nicht, wie ich
> INTA, INTB und RESET verschalten muss.

INTx: Wenn du die Funktion nicht brauchst offen lassen.
Reset: 3.3V

von Jay M. (blubb33)


Lesenswert?

Super. Vielen Dank euch allen...

von Dominique (Gast)


Lesenswert?

Hi
und ist was aus dem Umstieg geworden?
vg Dom

von Jay M. (blubb33)


Lesenswert?

Das hat soweit eigentlich ganz gut geklappt. Ich merke natürlich schon, 
dass mehr Leitungen gebraucht werden. Für meine kleinen Anwendungen kann 
ich keinen Unterschied bzw. Vorteil von SPI bemerken, aber ich wollte es 
ja wie gesagt auch ausprobieren. Vielleicht wird es bei späteren 
(größeren) Anwendungen relevant.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.