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?
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:
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:
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.
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.
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.
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.
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.
In gewisser Weise scheint es, dass die Verwendung von Neun-Bit-Daten einfach sein sollte. Schade, dass es selten ist.
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.
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.
Kellenjb
Chris Stratton
Olin Lathrop
tyblu
Olin Lathrop
Mawg sagt, Monica wieder einzusetzen