Suche MCU mit 9 Datenbit UART

Ich muss eine Steuerplatine für einige Peripheriegeräte entwickeln, die mit 9600 Baud mit 1 Startbit, 9 Datenbits, keiner Parität und einem Stoppbit kommunizieren.

Ich bin mir nicht sicher, ob ich in der Lage bin, einen seriellen Port-Treiber zu codieren oder sogar einen vorhandenen 8-Datenbit-Treiber zu modifizieren, um 9 zu handhaben, also - kennt jemand eine MCU, die serienmäßig mit einem seriellen Port-Treiber geliefert wird, der damit umgehen kann 9 Datenbits?

Ich bevorzuge die Unterstützung von SD-Karten, und Ethernet/WLAN wäre schön (BlueTooth oder USB sind mir egal, solange sie den Preis nicht wesentlich erhöhen).

Muss rund um die Uhr in einem eingebetteten Gerät ausgeführt werden können.

Ich bevorzuge etwas mit FreeRTOS oder ähnlichem und einer guten Entwicklungs-IDE inklusive Debug-Möglichkeiten.

Verlange ich zu viel oder gibt es so ein Biest?

Gibt es einen Grund, warum Sie 9 Datenbits haben müssen? Ein bisschen mehr Informationen darüber, was Sie tun, könnten jemandem helfen, Ihnen die beste Lösung zu geben.
@Kellenjb - es ist keine ungewöhnliche Anforderung, einige Geräte möchten ein 9. Bit für die Außerbandsignalisierung verwenden, um 8-Bit-Daten weitergeben zu können, ohne sich um den Zustand kümmern oder spezielle Codes umgehen zu müssen.
Viele Mikrocontroller-UARTs haben einen optionalen 9-Bit-Modus. Hast du dich überhaupt umgesehen?
Die Entwicklung für den 24/7-WLAN-Betrieb auf einem RTOS ist um einiges aufwendiger als die Soft-Codierung eines UART.
@tyblu: Ja, aber für letzteres muss man sich eigentlich ein bisschen mit der Hardware auskennen.
Eigentlich ist Wifi nur eine mögliche zukünftige Option, um stündlich oder einmal am Tag kurze Statusmeldungen zu senden. Vergessen Sie es am besten, da es nur das Hauptproblem des 9-Datenbit-UART trübt. +1 für jeden von euch; Danke!

Antworten (5)

Die ATmega-Serie verfügt über einen 9-Bit-UART

Die Mikrocontroller der ATmega-Serie ( Datenblatt ) können 9 Datenbits verwenden, ohne das Paritätsbit zu verändern. Diese Funktionalität ist im Timing-Diagramm beschrieben:

Zeitdiagramm

Beachten Sie, dass die Bits in der Abbildung von 0-8 nummeriert sind, was insgesamt 9 Bits sind. Die Beschriftung bezieht sich auf diese Nummerierung, sie zeigt nicht an, dass Sie 0-8 Datenbits verwenden können. Die minimale Anzahl von Bits in einem Zeichen ist 5, und die maximale Anzahl ist 9, nicht 0-8.

Sie können die Breite des Datenabschnitts durch die UCSZ-Bits festlegen. Die Einstellungen werden in Tabelle 19-7 beschrieben, die unten abgebildet ist:

Tabelle 19-7

Um dies in C mit AVR Libc festzulegen , müssten Sie den folgenden Code ausführen:

#include <avr/io.h>  // _BV() macro, register definitions

// Set the Uart Character SiZe to 9 bits as described in table 19-7
UCSR1B |= _BV(UCSZ12 );
UCSR1C |= _BV(UCSZ11) | _BV(UCSZ10 );

Beachten Sie, dass Sie wahrscheinlich die anderen Bits in diesen Registern angeben möchten, wenn Sie schon dabei sind.

Viele andere Prozessoren haben dies auch

Es gibt mit ziemlicher Sicherheit andere Prozessoren, die diesen Funktionssatz unterstützen. Die ATtiny-Prozessoren von Atmel haben die gleiche USART wie die ATmega und sind Code-kompatibel, ihre AVR32-Prozessoren haben die gleiche echte 9-Bit-Unterstützung, aber eine andere Programmierschnittstelle, die dsPIC-Prozessoren unterstützen sie, aber ohne ein richtiges Paritätsbit (siehe Seite 243 dieses Datenblatts ; Bits 1 und 2 setzen, PDSEL des UxMODE-Registers) ... die Liste geht weiter. Der erste Prozessor, den ich überprüft habe, der dies nicht unterstützte, war ein Stellaris Cortex-M3-Teil, der 5-8 Datenbits unterstützt, aber nicht 8 Bits.

Aber Sie sollten Ihre anderen Einschränkungen verwenden, um die Optionen zuerst einzugrenzen.

Letztendlich sollten Sie Ihre Prozessorauswahl jedoch zuerst anhand anderer Faktoren treffen. Sie schrieben:

Ich bevorzuge die Unterstützung von SD-Karten, und Ethernet/WLAN wäre schön (BlueTooth oder USB sind mir egal, solange sie den Preis nicht wesentlich erhöhen).

Die meisten Leute greifen im SPI-Modus auf die SD-Karte zu, und fast alles hat einen oder zwei SPI-Ports. Ethernet/WiFi ist eine zu allgemeine Spezifikation und eine viel schwieriger zu erfüllende Anforderung - Möchten Sie einen integrierten MAC mit einer MII-Schnittstelle? Integrierte PHY? Möchten Sie lieber alle TCP/IP-Sachen auf dem Chip erledigen oder praktisch alles auf etwas wie einen WIZnet W5100 oder Lantronix XPort auslagern . Sie können auch Komponenten wie den ENC28J60 von Microchip verwenden , um MAC und PHY auf einen externen Chip zu verschieben, auf den über SPI zugegriffen wird. Ihre anderen Anforderungen sind viel anspruchsvoller als ein 9-Bit-UART.

Tatsächlich könnten Sie wahrscheinlich einen 1,50-Dollar-ATtiny als SPI'/I2C<->9-Bit-UART-Konverter verwenden, wenn Sie möchten. Das wäre viel billiger als die Wahl eines suboptimalen Prozessors für Ihre anderen Anforderungen.

+1 Vielen Dank für diese informative und ausführliche Antwort. Ich bin der Software-Typ und werde es mit meinem Hardware-Freund weiter besprechen müssen, aber ich denke, dass ich hier eine Antwort sehe. Danke noch einmal!
Was WLAN/Ethernet usw. betrifft, möchte ich eine Einplatinenlösung mit Gerätetreibern für alle Peripheriegeräte, einem Betriebssystem wie FreeTOS und einem integrierten TCP/IP-Stack. Ich bin ein Typ mit 30 Jahren Erfahrung mit wenig oder gar keinem H/W-Wissen und möchte so weit wie möglich vor dem H/W geschützt werden (habe eine großartige Seite zum Posten ausgewählt, huh? ;-) Idealerweise würde ich das tun wie ein Board, das ich genauso programmieren kann wie einen Windows- oder Linux-PC, obwohl mir bewusst ist, dass das nur ein Traum ist, keine Realität.
@Mawg - In diesem Fall ist es wahrscheinlich besser, einen USB <-> seriellen Dongle zu kaufen, der 9-Bit-Daten verarbeiten kann, oder ein Motherboard zu finden, das dies kann, und einfach einen normalen PC zu verwenden.

Einige Internetrecherchen weisen darauf hin, dass die folgenden Familien möglicherweise eine Hardware-9-Bit-Fähigkeit haben: ATMEGA, dsPIC, 8051, STM32 und natürlich viele andere - aber dann gibt es auch viele 7/8-Bit-nur-UART-Peripheriegeräte.

Auf Kosten eines größeren Treiber-Overheads kann ein 8-Bit-UART mit Paritätsunterstützung dazu gebracht werden, 9-Bit-Zeichen zu übertragen, indem die Parität des zu übertragenden 8-Bit-Werts bestimmt und dann der UART-Modus auf gerade oder ungerade Parität als eingestellt wird erforderlich, um den gewünschten Wert des 9. Bits zu erreichen. Beim Empfang wird das Parity-Error-Flag gelesen und daraus das 9. Bit und die errechnete Parität des 8-Bit-Wertes ermittelt.

Ein Software-UART kann natürlich eine beliebige Zeichenbreite implementieren.

+1 Vielen Dank. Ich werde diese googeln und Anfragen abschicken. Übrigens, ich bin neu in diesem Bereich und mit dem Begriff "Software-UART" nicht vertraut - bedeutet er einfach Gerätetreiber?

Ich habe UARTs beobachtet, die unterschiedliche Unterstützungsstufen für "Neun-Bit-Daten" bieten. Manchmal muss man Datenblätter genau lesen, um zu sehen, wie die Dinge wirklich funktionieren.

  1. Einige UARTs können so konfiguriert werden, dass sie acht Datenbits plus ein zusätzliches Bit senden und empfangen und über volle 9-Bit-Sende- und Empfangspuffer verfügen. Damit ist es möglich, 9-Bit-Daten flüssig und zuverlässig zu senden und zu empfangen.
  2. Einige UARTs können zum Senden und Empfangen von 9-Bit-Daten konfiguriert werden, haben aber außerhalb des Shifters keinen Sendepuffer und nur einen Einzelbyte-Empfangspuffer. Solche UARTs erfordern Babysitting mit jedem Byte von 9-Bit-Daten, können sie aber genauso zuverlässig senden und empfangen wie 8-Bit-Daten.
  3. Einige UARTs können so konfiguriert werden, dass sie acht Datenbits senden und empfangen, zusammen mit einem neunten Bit, das für Markierung oder Abstand konfiguriert werden kann, und können den Zustand des neunten Bits im letzten empfangenen Byte melden, aber sie müssen den Zustand von prüfen neunte Bit jedes empfangenen Bytes, bevor das nächste Byte empfangen wird. Vorausgesetzt, sie können eingehende Daten rechtzeitig überprüfen, kann die Kommunikation jedoch zuverlässig sein. Wenn der Empfangs-Interrupt nach der Verarbeitung eines Bytes feststellt, dass bereits ein weiteres Byte ansteht, sollte das neunte Bit des gerade verarbeiteten Bytes als unzuverlässig angenommen werden.
  4. Einige UARTs könnten wie oben sein, setzen aber den Zustand der Partei eines empfangenen Bytes, bevor das Byte selbst als verfügbar betrachtet wird; Ich bin mir nicht sicher, ob irgendjemand tatsächlich auf diese Weise funktioniert, aber es sollte beachtet werden, dass dies eine zuverlässige Übertragung und einen zuverlässigen Empfang mit Interrupts, die immer rechtzeitig behandelt wurden, nicht verhindern würde, aber möglicherweise keine zuverlässige Benachrichtigung liefert, wenn späte Interrupts zu Datenverlusten führten.
  5. Einige UARTs können so konfiguriert werden, dass sie acht Bits zusammen mit einem konfigurierbaren neunten Bit senden und empfangen, aber aus verschiedenen Gründen können sie nicht zuverlässig gleichzeitig und asynchron mit einer vernünftigen Interrupt-Struktur arbeiten. Beispielsweise könnte ein Teil die gleichen Konfigurationssteuerbits verwenden, um die ausgehende Parität und die "erwartete" eingehende Parität einzustellen, und könnte aufzeichnen, ob die Parität des letzten empfangenen Bytes "richtig" oder "falsch" war. Wenn ein Byte empfangen wird, während die Paritätseinstellung geändert wird, kann es unmöglich sein, zu wissen, ob die "richtige" oder "falsche" Bezeichnung relativ zur alten oder neuen Einstellung war.

In gewisser Weise scheint es, dass die Verwendung von Neun-Bit-Daten einfach sein sollte. Schade, dass es selten ist.

+1 und wieder eine tolle Antwort. Vielen Dank für diese informative und ausführliche Antwort. Ich bin der Software-Typ und werde es weiter mit meinem Hardware-Freund besprechen müssen, aber das hat sehr geholfen. Danke noch einmal!

In den meisten Fällen kann ein 9-Bit-UART mit 8 Datenbits und einem explizit gesetzten Paritätsbit emuliert werden. Überprüfen Sie diesen Thread für einige Diskussionen.

+1 Danke für einen tollen Link. Wenn ich etwas nicht von der Stange bekomme, gibt mir das einige Hinweise zur Codierung des Treibers. Als Bonus wird die LPC-Serie besprochen, und mir wurde empfohlen, einen LPC 1769 zu verwenden (obwohl ich nicht sicher bin, warum).

Erst gestern gab es eine Anfrage auf der Arduino-Developers-Mailingliste, Unterstützung für die serielle Bibliothek hinzuzufügen, damit Benutzer Datenbits, Stoppbits und Parität angeben können. Der Mega328 UART (auf dem die Arduino-Hardware basiert) kann tatsächlich für 9 Datenbits konfiguriert werden. Wenn also diese Patch-/Feature-Anforderung angenommen wird, könnte sie das Einrichten und Codieren recht einfach machen. Die Software ist heute nicht implementiert, aber durchaus plausibel.

+1 Vielen Dank dafür. Haben Sie eine URL, wo ich den Fortschritt verfolgen kann?
@Mawg Sie können entweder die Entwickler-Mailingliste unter arduino.cc/mailman/listinfo/developers_arduino.cc abonnieren oder einfach regelmäßig die Archive lesen - der interessante Thread trägt den Titel "Serial Port Support for Parity and Stop Bits".