Wie kann ich die Anzahl der Hardware-UARTs in einem Design mit einer einzigen UART-MCU erhöhen?

Ich verwende eine TI CC430 MCU, weil sie ein eingebettetes CC1101-Funk-Frontend enthält. Ich würde wirklich gerne bei dieser MCU bleiben. Ich muss jedoch gleichzeitig mit einem separaten seriellen Funkgerät, einem FTDI (uart-> USB) und einem RS232-GPS interagieren. Es wäre also schön, 3 separate UARTS auf der MCU zu haben.

Welche Optionen habe ich, um die Anzahl der UARTs zu erhöhen? Ich habe überlegt, ein CPLD hinzuzufügen und den einzelnen UART auf 3 Ausgänge zu muxen, aber ich mag diesen Ansatz wirklich nicht, weil es nicht wirklich 3 gleichzeitige Verbindungen sind.

Antworten (3)

Sie könnten einen zusätzlichen UART über SPI oder I2C hinzufügen. Diese verfügen über interne FIFO-Puffer, sodass Sie sie regelmäßig auf Inhalt überprüfen und sie einige Pufferung übernehmen lassen. Wahrscheinlich bieten NXP, TI, Maxim diese Teile an. MAX3100, SC16IS752 usw. Sie könnten dazu auch eine zweite MCU hinzufügen, aber da Sie bereits einen recht einfachen Mikrocontroller mit 1 UART verwenden und daran festhalten möchten, erscheint das übertrieben.

Sie können auch einen Multiplexer verwenden, um zwischen den UARTs zu wählen, mit denen Ihr Mikro spricht. Aber wie Sie erwähnt haben, werden Daten gleichzeitig übertragen, das wird nicht funktionieren.

Software Serial könnte Ihre letzte Option sein, aber es kann sehr ärgerlich sein, damit umzugehen, wenn Ihr Mikrocontroller auch andere Dinge tut.

Danke für den Hinweis. Ich habe einen externen UART in Betracht gezogen, aber ich habe keine Erfahrung damit. Irgendwelche Ratschläge zu Fallstricken bei diesem Ansatz?
Ich habe in der Vergangenheit überlegt, sie bei einigen Projekten zu verwenden, aber am Ende habe ich mich für einen größeren Mikrocontroller entschieden. Meine Kenntnisse reichen also nur bis zu deren Existenz und Funktionsbeschreibung.

Wenn Sie die Pins zur Verfügung haben, können Sie "bit blast" oder "Software Serial" ausführen.

Hier programmieren Sie die MCU, um eine serielle Verbindung mit einfachen GPIO-Leitungen zu emulieren.

Der Code ist zeitkritisch, daher muss beim Schreiben darauf geachtet werden. Es gibt verschiedene Online-Tutorials zum Schreiben, aber ich habe es noch nie auf einem MSP430-Chip ausprobiert, daher kenne ich die Einzelheiten nicht.

Die andere Option wäre die Verwendung eines externen seriellen Geräts, das über ein anderes System wie SPI oder I²C mit der MCU verbunden wird. Ich weiß nicht, was an dieser Front verfügbar ist - vielleicht würde eine andere MCU, die als SPI-Slave-Gerät läuft, die Arbeit erledigen?

Möglicherweise finden Sie die parallele Version des FTDI-Chips nützlicher, selbst wenn Sie Schieberegister oder ein CPLD verwenden müssen, um Ihre E/A-Anforderungen zu reduzieren. In einer meiner Anwendungen habe ich ein CPLD verwendet, um einen FTDI-Chip und einige andere Dinge mit einem 3-Draht-Bus (clk, mcu-data-out und mcu-data-in) zu verbinden. Alle Drähte sind im Leerlauf niedrig. Zwei ansteigende Flanken an mcu-data-out bei niedrigem Takt setzen den Bus zurück. Wenn clk niedrig ist und data beide niedrig sind, zeigt mcu-data-in an, ob es etwas gibt, das die Aufmerksamkeit der CPU erfordert. Wenn clk niedrig und mcu-data hoch ist, zeigt mcu-data-in an, ob die letzte Operation erfolgreich war. Wenn clk hoch ist, liefert mcu-data-in die von einem SPI-Transceiver erwarteten Daten.

Ein Vorteil der Verwendung der parallelen Version des FTDI-Chips auf diese Weise besteht darin, dass Sie Ihre CPU aufwecken lassen können, wenn Daten verfügbar werden, und die Daten dann schnell auslesen können. Mit der seriellen Version des FTDI-Chips müssen Sie bereit sein, Daten zu empfangen, wenn CTS aktiviert ist, aber Sie werden nicht feststellen, dass Daten verfügbar sind, wenn CTS deaktiviert ist. Ich frage mich, wem ich bei FTDI ins Ohr flüstern müsste, damit sie der seriellen Version ihres Chips eine solche Funktion hinzufügen oder einen Modus ähnlich dem Dreidrahtmodus hinzufügen?