Porterweiterung mit SPI

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Porterweiterung

Mit Schieberegistern lassen sich die Ports eines Mikrocontrollers auf einfache und billige Weise erweitern. Zur Ansteuerung der Schieberegister ist ein im Controller integrierter SPI-Bus nützlich, aber nicht unbedingt notwendig, da sich die Kommunikation auch in Software realisieren lässt.

Ausgänge

Um einen Controller mit zusätzlichen Ausgängen zu erweitern, bieten sich Schieberegister vom Typ 74xx595, am besten 74HCT595 (bessere Schwelle der Eingangsspannungen bei 5V-Versorgung des ICs aber 3,3V-Signalen vom uC), an. Die folgende Schaltung zeigt den Anschluß von theoretisch beliebig vielen 74xx595 an einen SPI-Bus:

Hc595-porterweiterung.png

Der SPI-Bus muss auf CPHA=CPOL=1 gestellt sein. Das auszugebende Bitmuster (z. B. 16 Bit im o.a. Beispiel) wird durch das erste Schieberegister hindurchgetaktet und über dessen Ausgangsspin in das zweite Schieberegister hineingetaktet. Dadurch wandert das Bitmuster sequentiell durch beide Bausteine. Nach 16 Taktzyklen steht es dann stabil und parallel an den Ausgängen der beiden Bausteine an.


Wenn ein höherer Strom als 6mA geschaltet werden soll, dann gibt es auch fertige Bausteine:

Low-Side-Schalter:

Die TPIC6x595-Bausteine von TI, die zwischen 100mA und über 1A dauernd "sinken" können, weil es Open-Drain-Ausgänge sind, die Lasten bis 33V/50V (je nach IC) gegen Masse schalten. MICREL bietet hier seine MIC584x-Serie, die allerdings etwas "preisempfindlicher" sind.

High-Side-Schalter:

Der MIC5891 von Micrel kann je Ausgang bis zu 500mA bei 35V liefern (aber nicht alle Ausgänge gleichzeitig).

Alternativen

Aus der CMOS-Serie 4000 ist der Typ 4094 zum 74HC595 vergleichbar, hat jedoch eine andere Anschlussbelegung und ein Ausgangslatch statt Flipflops. Das heißt, notfalls kann man den Eingang STR auf High legen, und dann zappeln die Ausgänge während des Duchschiebens. Da CMOS-Typen bis 15 V arbeiten, kann man außerdem die Anzahl von Pegelumsetzern auf 2-3 reduzieren, um beliebig viele bspw. 12-V-Ausgänge zu steuern.

Stört das Zappeln von Ausgängen während des Durchschiebens nicht, kann man einfache Schieberegister verwenden.

Eingänge

Die Anzahl der Eingänge kann z. B. mit parallel-in/serial-out Schiebregistern des Typs 4021 erhöht werden (z. B. Philips HEF4021B). Besonders verbreitet ist heutzutage der Typ 74xx165. Alternativ kann z. B. auch ein 74xx597 verwendet werden. Durch dessen zusätzlichen Eingangspuffer (Latch) ist der Schaltungsaufwand allerdings höher.

Beispielschaltung für den 74xx165:

74xx165.png


Beispielschaltplan mit 74HC595 und 74HC165 an einem SPI Bus: http://www.mikrocontroller.net/attachment.php/30856/SPI_74HC595.pdf

Hinweis: Im Beispielschaltplan ist ein zusätzlicher Port "PP0" für das Latch-Enable des 74HC165 vorgesehen. Um beliebig viele Slaves an einem SPI nutzen zu können, muß der MISO-Ausgang hochohmig sein, wenn /SS = 1 ist.

Tipp: Man kann z.B. mit einem 74LVC2G126 oder einem 74LVC2G125 das Latch-Enable-Signal aus dem /SS-Signal generieren und den Ausgang hochohmig setzen, wenn /SS = 1 ist.

Eingänge und Ausgänge zusammen

SPI-InOut.png

Hier wird gezeigt, wie man beide Schieberegister, HC595 und HC165, SPI-konform einschließen kann. Nach ~SS 1>0 wird Byte in HC165 geladen. Dann wird Byte über SPI mittels HC595 ausgegeben und gleichzeitig wird Byte von HC 165 gelesen. ~SS 0>1 überschreibt Byte in Ausgangsregister von HC595. ~SS-Linie wird als Adresse-Linie benutzt, so kann man auch andere Geräte mit SPI bedienen. Die Schaltung ist auch mit zwei seriell geschalteten HC165 in Praxis geprüft. Hier sollte aber berücksichtigt werden: HC595 nimmt alles, was über SPI gesendet wird, auch wenn ~SS hoch ist. Wenn ~SS aus Versehen 0>1 bekommt, ohne unmittelbar vorher das richtige Byte zu senden, kann HC595 falsche Byte ausgeben, das einem anderen Gerät auf der SPI-Schiene geschickt wurde. Eine Variante der Schaltung macht sie vollständig SPI-konform:

SPI-InOut 1.png

SPI-Modul sollte in MODE 0 eingestimmt werden. Hier bekommt HC595 erst dann SCK-Impulse, wenn ~SS gewählt wird. Nachdem ~SS 1>0, könnte eine kleine Verzögerung notwendig werden, um Load-Impuls auf HC165 abzuwarten. Mit ATMEGA324 und F_CPU=16 MHz reichte zwischen ~SS=0 und spi_master_transmit() 3 cycles Pause, z.B. mit asm volatile("lpm"); gemacht. Diese Schaltung hat Vorteile im Vergleich mit MCP23S17: um 1x Byte zu senden und zu empfangen, braucht man nur 1x Byte zu übertragen. MCP23S17 braucht für 1 Byte 3 Bytes für Senden und noch 3 Bytes für Empfangen. Auch Init() erübrigt sich mit HC-Logik.

Siehe auch

MCP23S17 16-Bit I/O Expander with Serial Interface

MCP23S09 von Microchip (bei Betrieb mit 3,3V sind die GPIO Ports 5V tolerant)