Impulsi RX misteriosi su UART si collegano su OS X Arduino Due


14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Sto vedendo otto misteriosi impulsi sulla linea RX quando mi collego alla porta seriale usando più librerie client (Python, JavaScript e il Serial Monitor integrato nell'IDE). Circa 78-79us ciascuno, campionato a 1MS / s con Logic Pro 16.

Impulsi misteriosi

Questi otto impulsi, se interpretati a 57600 baud, bloccano il firmware Firmata. E accadono su ogni connessione.

Questo utilizza una nuova installazione di Arduino 1.6.8 IDE e con più schizzi (anche il normale schizzo "Blink" riprodurrà questo).

Ripetere i passaggi sul mio computer:

  1. Installa qualsiasi schizzo
  2. Avviare un analizzatore di logica se si desidera catturarlo
  3. Vai a Monitor seriale. Ho configurato il mio per 57600 baud, fine linea Newline, ma non importa
  4. Se lo desideri, chiudi e ripeti il ​​passaggio 3
  5. Nota impulsi ogni volta che ci si collega alla porta seriale

Qualche suggerimento per diagnosticare questo? Sembra che sia in qualche modo a livello di driver seriale.


1
Indipendentemente da dove proviene, considera che ti ha fatto un favore indicando un bug critico nel firmware che stai eseguendo - questo non dovrebbe essere in grado di metterlo in uno stato irrecuperabile. È un bug logico del programma o il codice di gestione UART non gestisce in modo appropriato un flag di errore?
Chris Stratton,

1
In termini di rintracciamento della fonte, sarebbe utile provare un altro programma client seriale, un altro computer / sistema operativo, un altro dispositivo USB-seriale, ecc ...
Chris Stratton

1
Per quanto riguarda il tentativo di altri programmi seriali, ci sono più librerie che interagiscono con il protocollo Firmata e utilizzano diverse implementazioni seriali sottostanti (Python, JavaScript e il monitor seriale IDE Arduino incorporato) che presentano lo stesso comportamento. Il mio prossimo piano è provare questo su una macchina Linux e vedere se vedo lo stesso comportamento, che si spera isolerà se questo è specifico per OS X.
Blake Ramsdell,

2
Ne ottieni uno anche quando ti disconnetti. La velocità di trasmissione della connessione non ha alcun effetto sulla lunghezza dell'impulso. Il mio sospetto è che sia il firmware di ATMega16U2 a farlo (o qualunque chip sia su qualunque versione).
Majenko

1
Quando si avvia il monitor seriale, il software reimposta il modulo arduino. Se il modulo arduino ha il bootloader, penso che questi siano i segnali del protocollo STK500.
Mert Gülsoy,

Risposte:


1

Corto:

Guardando il firmware ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) lo trovo quando configuri / modifichi le impostazioni del Porta seriale emulata USB, USART viene reimpostato. Ciò accade anche quando si apre Arduino Serial Monitor (deve configurare la velocità seriale, ecc.). Questo provoca il tuo picco.

Lungo:

Guarda la funzione:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

Lì vedrai che dopo alcune righe, ripristina USART, azzerando i suoi registri:

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

A pagina 168, dell'attuale scheda tecnica ATMEGA16U2, scoprirai che, impostando il bit 3 (TXEN1) di UCSR1B, abiliti il ​​trasmettitore, ignorando il normale funzionamento della porta (cioè diventa output). Citando la scheda tecnica:

Scrivere questo bit su uno abilita il trasmettitore USART. Il trasmettitore sovrascriverà il normale funzionamento della porta per il pin TxDn quando abilitato. La disabilitazione del trasmettitore (scrivendo TXENn a zero) non diventerà effettiva fino al completamento delle trasmissioni in corso e in sospeso, vale a dire quando il registro di invio turno e il registro buffer di trasmissione non contengono dati da trasmettere. Se disabilitato, il trasmettitore non sovrascriverà più la porta TxDn.

Pertanto, scrivendo UCSR1B = 0;non si sostituisce più il pin TXD1, che fungerà da input.

ATMEGA16U2 TXD è collegato alla linea RX dell'ATSAM3X8E. Durante il normale funzionamento, con UART abilitato, quella linea rimane alta se non vengono trasmessi dati. Se disabiliti l'UART, quella particolare linea non è più un driver su 1. Poiché il codice di inizializzazione non imposta il pull-up su quel pin (e non è configurato come output), il pin diventa un input flottante e qualsiasi perdita a GND o persino l'impedenza di ingresso della sonda (che si trova tra il pin e GND), porterà lentamente il livello logico a 0.

Per ovviare a questo problema, è necessario: 1) Modificare il firmware ATMEGA16U2, impostando quel PIN come OUTPUT, con valore 1. 2) Modificare il firmware ATMEGA16U2, abilitando il pull-up su quel pin. 3) (suggerito) Abilitare il pull-up sulla linea RX sull'ATSAM3X8E.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.