Tajemnicze impulsy RX na UART łączą się z OS X Arduino Due

14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Widzę osiem tajemniczych pulsów na linii RX, kiedy łączę się z portem szeregowym za pomocą wielu bibliotek klienta (Python, JavaScript, a także wbudowanego monitora szeregowego w IDE). Około 78-79us za sztukę, próbkowane z prędkością 1MS / s za pomocą Logic Pro 16.

Tajemnicze impulsy

Te osiem impulsów interpretowanych przy prędkości 57600 bodów zablokuje oprogramowanie układowe Firmata. I zdarzają się przy każdym połączeniu.

Wykorzystuje to nową instalację Arduino 1.6.8 IDE i wiele szkiców (normalny szkic „Blink” również to odtworzy).

Kroki Repro na moim komputerze:

  1. Zainstaluj dowolny szkic
  2. Uruchom analizator logiki, jeśli chcesz go złapać
  3. Przejdź do Monitor szeregowy. Mam mój skonfigurowany na 57600 bodów, zakończenie linii Newline, ale to nie ma znaczenia
  4. Jeśli chcesz, zamknij i powtórz krok 3
  5. Uwaga pulsuje przy każdym podłączeniu do portu szeregowego

Wszelkie sugestie dotyczące diagnozowania tego? Wygląda na to, że w jakiś sposób jest to poziom sterownika szeregowego.

Blake Ramsdell
źródło
1
Niezależnie od tego, skąd pochodzi, należy wziąć pod uwagę, że wyświadczył ci przysługę, wskazując krytyczny błąd w uruchomionym oprogramowaniu układowym - nie powinno to być w stanie doprowadzić do stanu niemożliwego do odzyskania. Czy to błąd logiczny programu, czy też kod obsługi UART nie radzi sobie odpowiednio z flagą błędu?
Chris Stratton
1
Jeśli chodzi o śledzenie źródła, pomocne byłoby wypróbowanie innego programu klienta szeregowego, innego komputera / systemu operacyjnego, innego urządzenia szeregowego USB itp.
Chris Stratton
1
Jeśli chodzi o wypróbowanie innych programów szeregowych, istnieje wiele bibliotek, które współdziałają z protokołem Firmata i używają różnych podstawowych implementacji szeregowych (Python, JavaScript i wbudowany monitor szeregowy Arduino IDE), które wykazują to samo zachowanie. Moim następnym planem jest wypróbowanie tego na komputerze z systemem Linux i sprawdzenie, czy widzę to samo zachowanie, które, mam nadzieję, wyodrębni, jeśli jest to specyficzne dla systemu OS X.
Blake Ramsdell,
2
Dostajesz także jeden po rozłączeniu. Szybkość transmisji połączenia nie ma wpływu na długość impulsu. Podejrzewam, że to oprogramowanie układowe ATMega16U2 to robi (lub jakikolwiek układ w dowolnej wersji).
Majenko
1
Po uruchomieniu monitora szeregowego oprogramowanie resetuje moduł arduino. Jeśli moduł arduino ma bootloader, myślę, że są to sygnały protokołu STK500.
Mert Gülsoy

Odpowiedzi:

1

Krótki:

Patrząc na oprogramowanie układowe ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) stwierdzam, że podczas konfigurowania / zmiany ustawień Emulowany port szeregowy USB USART jest resetowany. Dzieje się tak nawet po otwarciu Arduino Serial Monitor (musi skonfigurować prędkość szeregową itp.). To powoduje twój skok.

Długo:

Spójrz na funkcję:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

Tam zobaczysz, że po niektórych wierszach resetuje USART, zerując swoje rejestry:

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

Na stronie 168 aktualnego arkusza danych ATMEGA16U2 przekonasz się, że ustawiając bit 3 UCSR1B (TXEN1), włączasz nadajnik, zastępując normalne działanie portu (tzn. Staje się on wyjściowy). Cytując arkusz danych:

Zapisanie tego bitu do jednego umożliwia nadajnik USART. Nadajnik zastąpi normalne działanie portu dla styku TxDn, jeśli jest włączony. Wyłączenie nadajnika (zapis TXENn na zero) nie zacznie obowiązywać, dopóki transmisje trwające i oczekujące nie zostaną zakończone, tj. Gdy rejestr przesunięcia transmisji i rejestr bufora transmisji nie będą zawierały danych do przesłania. Po wyłączeniu nadajnik nie będzie już zastępował portu TxDn.

Dlatego pisząc UCSR1B = 0;, nie zastępujesz już styku TXD1, który będzie działał jako wejście.

ATMEGA16U2 TXD jest podłączony do linii RX ATSAM3X8E. W normalnej pracy, przy włączonym UART, linia ta pozostaje wysoka, jeśli żadne dane nie są przesyłane. Jeśli wyłączysz UART, ta konkretna linia nie będzie już sterownikiem do 1. Ponieważ kod inicjujący nie ustawia podciągania na tym pinie (i nie jest skonfigurowany jako wyjście), pin staje się zmiennoprzecinkowym wejściem, a wszelkie wycieki do GND, a nawet impedancja wejściowa twojej sondy (która jest pomiędzy pinem a GND), powoli doprowadzi poziom logiczny do 0.

Aby rozwiązać ten problem, należy: 1) Zmodyfikować oprogramowanie układowe ATMEGA16U2, ustawiając ten PIN jako WYJŚCIE, o wartości 1. 2) Zmodyfikować oprogramowanie układowe ATMEGA16U2, umożliwiając podciągnięcie na ten pin. 3) (sugerowane) Włącz podciąganie na linii RX w ATSAM3X8E.

następny hack
źródło