Geheimnisvolle RX-Impulse auf UART verbinden sich unter OS X Arduino Due

14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Ich sehe acht mysteriöse Impulse auf der RX-Leitung, wenn ich über mehrere Client-Bibliotheken (Python, JavaScript sowie den in der IDE integrierten seriellen Monitor) eine Verbindung zum seriellen Port herstelle. Ungefähr 78-79us pro Stück, gemessen mit 1MS / s mit einem Logic Pro 16.

Rätselhafte Impulse

Diese acht Impulse stören die Firmata-Firmware, wenn sie mit 57600 Baud interpretiert werden. Und sie passieren bei jeder Verbindung.

Hierbei wird eine neue Installation der Arduino 1.6.8-IDE mit mehreren Skizzen verwendet (die normale "Blink" -Skizze gibt dies auch wieder).

Repro Schritte auf meinem Computer:

  1. Installieren Sie eine Skizze
  2. Starten Sie einen Logikanalysator, wenn Sie ihn abfangen möchten
  3. Wechseln Sie zu Serial Monitor. Ich habe meine für 57600 Baud, Newline Leitungsende konfiguriert, aber es spielt keine Rolle
  4. Wenn Sie möchten, schließen Sie und wiederholen Sie Schritt 3
  5. Beachten Sie die Impulse jedes Mal, wenn Sie eine Verbindung zum seriellen Port herstellen

Irgendwelche Vorschläge zur Diagnose? In gewisser Weise klingt es so, als ob es sich um einen seriellen Treiber handelt.

Blake Ramsdell
quelle
1
Unabhängig davon, woher es kommt, sollten Sie bedenken, dass es Ihnen einen Gefallen getan hat, indem es auf einen kritischen Fehler in der Firmware hinweist, die Sie ausführen. Dies sollte nicht in der Lage sein, es in einen nicht behebbaren Zustand zu versetzen. Handelt es sich um einen Programmlogikfehler, oder behandelt der UART-Verarbeitungscode ein Fehlerflag nicht ordnungsgemäß?
Chris Stratton
1
In Bezug auf das Aufspüren der Quelle wäre es hilfreich, ein anderes serielles Client-Programm, ein anderes Computer- / Betriebssystem, ein anderes USB-serielles Gerät usw. auszuprobieren.
Chris Stratton,
1
Was das Ausprobieren anderer serieller Programme betrifft, gibt es mehrere Bibliotheken, die mit dem Firmata-Protokoll interagieren und unterschiedliche zugrunde liegende serielle Implementierungen (Python, JavaScript und der eingebaute Arduino IDE Serial Monitor) verwenden, die dasselbe Verhalten aufweisen. Mein nächster Plan ist es, dies auf einem Linux-Computer zu versuchen und zu prüfen, ob ich das gleiche Verhalten sehe, was hoffentlich einschränken wird, ob dies OS X-spezifisch ist.
Blake Ramsdell
2
Sie erhalten auch eine, wenn Sie die Verbindung trennen. Die Baudrate der Verbindung hat keinen Einfluss auf die Länge des Impulses. Mein Verdacht ist, dass es die Firmware des ATMega16U2 ist, die das macht (oder welcher Chip auch immer, auf welcher Version es sich befindet).
Majenko
1
Wenn Sie den seriellen Monitor starten, setzt die Software das Arduino-Modul zurück. Wenn das Arduino-Modul einen Bootloader enthält, sind dies meiner Meinung nach die STK500-Protokollsignale.
Mert Gülsoy

Antworten:

1

Kurz:

Betrachtet man die ATMEGA16U2-Firmware ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ), so stelle ich fest, dass beim Konfigurieren / Ändern der Einstellungen der USB emulierte serielle Schnittstelle, der USART wird zurückgesetzt. Dies geschieht auch, wenn Sie den Arduino Serial Monitor öffnen (er muss die serielle Geschwindigkeit usw. konfigurieren). Dies verursacht Ihre Spitze.

Lange:

Funktion anschauen:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

Dort sehen Sie, dass nach einigen Zeilen der USART zurückgesetzt wird, indem seine Register auf Null gesetzt werden:

/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
    UCSR1B = 0;
    UCSR1A = 0;
    UCSR1C = 0;

Auf Seite 168 des aktuellen ATMEGA16U2-Datenblattes finden Sie, dass Sie durch Setzen von Bit 3 (TXEN1) von UCSR1B den Sender aktivieren und den normalen Port-Betrieb außer Kraft setzen (dh, er wird ausgegeben). Zitat aus dem Datenblatt:

Durch Schreiben dieses Bits auf eins wird der USART-Transmitter aktiviert. Der Sender überschreibt den normalen Port-Betrieb für den TxDn-Pin, wenn er aktiviert ist. Die Deaktivierung des Senders (Schreiben von TXENn auf Null) wird erst wirksam, wenn laufende und anstehende Übertragungen abgeschlossen sind, dh wenn das Sendeschieberegister und das Sendepufferregister keine zu sendenden Daten enthalten. Wenn deaktiviert, überschreibt der Sender den TxDn-Port nicht mehr.

Wenn UCSR1B = 0;Sie also schreiben , überschreiben Sie nicht mehr den TXD1-Pin, der als Eingang fungiert.

Der ATMEGA16U2 TXD ist an die RX-Leitung des ATSAM3X8E angeschlossen. Im normalen Betrieb bleibt diese Leitung bei aktiviertem UART hoch, wenn keine Daten übertragen werden. Wenn Sie den UART deaktivieren, ist diese bestimmte Leitung kein Treiber mehr für 1. Da der Initialisierungscode das Pull-up für diesen Pin nicht festlegt (und auch nicht als Ausgang konfiguriert ist), wird der Pin zu einem potentialfreien Eingang und führt zu einer Leckage GND oder sogar die Eingangsimpedanz Ihrer Sonde (die zwischen Ihrem Pin und GND liegt) bringen den Logikpegel langsam auf 0.

Um dieses Problem zu umgehen, sollten Sie entweder: 1) die ATMEGA16U2-Firmware ändern, indem Sie diese PIN als AUSGANG mit dem Wert 1 festlegen. 2) die ATMEGA16U2-Firmware ändern, indem Sie das Pull-up auf diesen Pin aktivieren. 3) (empfohlen) Aktivieren Sie das Pull-up auf der RX-Leitung des ATSAM3X8E.

Next-Hack
quelle