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...
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
Wie du gesehen hast, gibt es deine gewünschten Bausteine nur mit SPI. SPI ist Stand der Technik! Und viel schneller als I2C!
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).
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.
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.
Hatte die Adressierung immer als angenehm empfunden, weil ich einfach direkt den IC ansprechen konnte, den ich wollte.
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
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.
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?
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...
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
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?
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.
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.
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
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.
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?
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
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
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.
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.
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.
Die Entkoppel-C's (100nF Kerko zwischen Vdd und Vss jedes ICs) fehlen noch.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.