Erhöhen Sie die GPIO-Ausgänge

Ich arbeite an einem Projekt, in dem ich 32 Ausgänge von einer MCU benötige, die nur 8 freie Ausgänge hat.

Um mein Ziel zu erreichen, habe ich folgende Voraussetzungen:

  • Ich muss in der Lage sein, mehr als einen Ausgang gleichzeitig umzuschalten

  • Daten müssen so schnell wie möglich eintreffen

  • Ich kann keine Datenpakete verlieren

  • Die Daten sollten zuverlässig übertragen werden

Ich überlege, einen 4-16 Decoder zu verwenden, aber ich kann damit nicht mehr als einen Ausgang gleichzeitig schalten.

Ich kann die I2C-Kommunikation verwenden, um meine IOs-Pins zu erweitern, aber ich bin mir nicht sicher, ob ich Probleme mit Timing und Datenpaketen haben werde.

Eine Möglichkeit besteht darin, Multiplexing zu verwenden.

Ich verwende einen AM3359 ARM Cortex-A8 @ 25Mhz

Irgendwelche anderen Ideen?

Müssen Sie ein bestimmtes Datenprotokoll verwenden? Obwohl Sie mehr als einen Ausgang gleichzeitig umschalten müssen, müssen Sie in der Lage sein, ALLE Ausgänge gleichzeitig umzuschalten (dh gibt es eine maximale Anzahl synchroner Ausgänge)?
Sie sagen, Sie brauchen 32 Ausgänge, aber die Daten müssen so schnell wie möglich "eintreffen". Was bedeutet das? "So schnell wie möglich" zu sagen ist Unsinn ... was ist Ihre wirkliche Anforderung?
@JoeHass Es ist, dass ich Geschwindigkeit brauche, um die Ausgabe umzuschalten, ich muss zum Beispiel alles in weniger als 1 us erledigen. Die Zeit, in der ich den GPIO im uC in die Zeit einstelle, in der die endgültige Ausgabe diesen Zustand erreicht.
@gbmhunterIch muss kein bestimmtes Protokoll verwenden. Ich kann etwas SPI oder I2C verwenden. Die Ausgänge, die ich gleichzeitig umschalten kann, sind zufällig, sodass ich nur einen oder zwei gleichzeitig umschalten kann, da ich alle Ausgänge gleichzeitig umschalten kann.
Alles in 1us zu tun bedeutet, dass Sie die externen GPIOs mit 1 MHz oder mehr umschalten, und daher muss die Kommunikation mit ihnen noch schneller sein. Welcher Mikrocontroller und Taktfrequenz? Warum nicht einfach ein größeres Paket kaufen?
@ pjc50 - Ich muss diese MCU verwenden, keine andere Wahl. Es ist ein AM3359 ARM Cortex-A8, aber ich habe nur 8 freie Ausgänge, die ich verwenden kann.

Antworten (3)

I2C arbeitet standardmäßig mit 100 kHz, 400 kHz, 1 MHz und 3,4 MHz. Viele i2c-Expander können das tun, was Sie brauchen, sowohl Eingang als auch Ausgang. Und es hat Bestätigungsbits, damit Sie (irgendwie) wissen, ob ein Expander das Datenpaket empfangen hat.

Ohne Ihre genauen Datenratenanforderungen zu kennen, kann ich nicht sicher sein, aber i2c-Expander sind so gut wie jeder andere Typ.

Update: Da Sie 1MHz und einen 25MHz MCU erwähnt haben, könnte der Microchip MCP23009 3,4MHz 8bit I2C Expander funktionieren. Mit einem Spannungsteiler am Adress-Pin können bis zu 8 auf einem einzigen Bus verwendet werden. Der MCP23018 ist die 16-Bit-Version, Sie benötigen also nur 2 (und könnten sie bei Bedarf abtasten).

Alternativ gibt es SPI-Expander, die bis zu 10 MHz erreichen können. Der MCP23009/18 kann sowohl I2C bei 3,4 MHz als auch SPI bei 10 MHz, sodass Sie beide testen können, um zu sehen, was am besten zu Ihnen passt.

@butzke aktualisiert

Ein üblicher Ansatz besteht darin, eine Kette von 74HC595 oder ähnlichen Serial-In-Parallel-Out-Schieberegister-Chips zu verwenden und die Kette über die Taktausgangs- und MOSI-Drähte eines SPI-Ports sowie einen "normalen" I/O anzusteuern Stift. Der SPI-Clock-Output-Pin sollte mit dem Shift-Clock-Eingang jedes Schieberegisters verbunden sein, und der gewöhnliche I/O-Pin sollte mit dem Register-Clock-Eingang jedes Shifters verbunden sein. Ein Shifter sollte seinen Dateneingang mit MOSI verbunden haben; Ein zweiter Shifter sollte seinen Dateneingang mit dem Datenausgang des ersten verbinden. Wenn es einen dritten Schalthebel gibt, sollte sein Dateneingang mit dem Datenausgang des zweiten verbunden werden usw.

Unter Verwendung dieses Ansatzes können drei Prozessorpins mit einer beliebigen Anzahl von Schieberegisterchips verbunden werden, die gemeinsam eine beliebige Anzahl von Pins steuern. Um die Ausgänge einzustellen, senden Sie an den SPI-Port die Daten, die in alle Shifter gehen sollen, und senden Sie zuerst die Daten für den Shifter, der am weitesten vom Prozessor entfernt ist. Sobald alle Daten gesendet wurden, bewirkt das Pulsen des Registertaktpins hoch und dann niedrig, dass sich alle Schieberegisterausgänge gleichzeitig ändern. Man kann bei jedem Schritt so viele oder so wenige Ausgänge wie gewünscht ändern; Der einzige Faktor, der die Anzahl der Ausgänge begrenzt, die man steuern kann, ist die Notwendigkeit, den Zustand jedes Ausgangs jedes Mal neu zu spezifizieren, wenn man einen von ihnen ändern möchte.

Wenn Sie nur bestimmte Gruppen von Ausgängen benötigen, um gleichzeitig wechseln zu können, kann es hilfreich sein, mehrere unabhängige Schieberegisterketten zu haben. Alle Ketten können sich den Taktausgang und die MOSI-Pins teilen (unter Verwendung eines Registertaktausgangs pro Kette), wenn man sicherstellt, dass, sobald der Code beginnt, Daten in eine Kette zu verschieben, alle Daten für diese Kette gesendet und vor dem SPI getaktet werden Bus wird für irgendetwas anderes verwendet. Wenn man 240 Ausgänge hat, die gelegentlich geändert werden müssen, und 16, die etwas häufiger geändert werden müssen, bedeutet das Geben der Chips, die 16 sich häufig ändernde Ausgänge steuern, ihren eigenen Registertaktpin, dass das Ändern dieser Pins nur das Senden von zwei Bytes aus dem SPI erfordern wird statt 32.

Kannst du ein Designbeispiel posten?
@Butzke: schau dir das an: protostack.com/blog/2010/05/…

Wie @passerby sagt, ist I2C das einfachste Protokoll, eine Leitung für Daten und eine andere für die Uhr. Sie können es mit Sodtware erstellen, und ich denke, dass die Timing-Anforderungen minimal sind, und da Sie den Expander nur als Ausgänge verwenden, wird es keine geben Irgendein Problem ... Ich denke, es gibt kein Minimum für I2C ...

Eine andere Idee, die ich dachte, ist die Verwendung von Latches mit einem Decoder, um den Bus zu adressieren, aber mit diesem Maximum können Sie 16 Ausgänge erreichen.