Pulsos misteriosos de RX no UART se conectam no OS X Arduino Due

14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Estou vendo oito pulsos misteriosos na linha RX quando me conecto à porta serial usando várias bibliotecas cliente (Python, JavaScript, bem como o Serial Monitor interno no IDE). Aproximadamente 78-79us cada, amostrados a 1MS / s com um Logic Pro 16.

Pulsos misteriosos

Esses oito pulsos, quando interpretados em 57600 baud, atolam o firmware Firmata. E eles acontecem em todas as conexões.

Isso está usando uma nova instalação do IDE do Arduino 1.6.8 e com vários esboços (o esboço "Blink" normal também reproduzirá isso).

O Repro está na minha máquina

  1. Instale qualquer esboço
  2. Inicie um analisador lógico se você quiser capturá-lo
  3. Vá para o Monitor serial. Eu tenho o meu configurado para 57600 baud, final de linha Newline, mas isso não importa
  4. Se desejar, feche e repita a etapa 3
  5. Observe pulsos sempre que você se conectar à porta serial

Alguma sugestão para diagnosticar isso? Parece que é o nível de driver serial de alguma forma.

Blake Ramsdell
fonte
1
Independentemente da origem, considere que isso fez um favor indicando um bug crítico no firmware que você está executando - isso não deve ser capaz de colocá-lo em um estado irrecuperável. É um erro de lógica do programa ou o código de manipulação do UART não lida adequadamente com um sinalizador de erro?
Chris Stratton
1
Em termos de rastrear a origem, que seria útil para tentar outro programa de série cliente, outro computador / sistema operacional, com outro dispositivo USB-serial, etc ...
Chris Stratton
1
Quanto à tentativa de outros programas seriais, existem várias bibliotecas que interagem com o protocolo Firmata e usam diferentes implementações seriais subjacentes (Python, JavaScript e o Arduino IDE Serial Monitor interno) que exibem o mesmo comportamento. Meu próximo plano é tentar fazer isso em uma máquina Linux e ver se vejo o mesmo comportamento, o que espero isolar se for específico do OS X.
Blake Ramsdell
2
Você também recebe um quando desconecta. A taxa de transmissão da conexão não afeta o comprimento do pulso. Minha suspeita é que é o firmware do ATMega16U2 que está fazendo isso (ou qualquer chip que esteja em qualquer versão).
Majenko
1
Quando você inicia o monitor serial, o software redefine o módulo arduino. Se o módulo arduino possui um carregador de inicialização, acho que esses são os sinais do protocolo STK500.
Mert Gülsoy

Respostas:

1

Curto:

Observando o firmware do ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) Acho que, quando você define / altera as configurações do Porta serial emulada USB, o USART é redefinido. Isso acontece mesmo quando você abre o Arduino Serial Monitor (ele deve configurar a velocidade serial, etc.). Isso causa seu pico.

Grandes:

Veja a função:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

Lá você verá que, após algumas linhas, ele redefine o USART, zerando seus registros:

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

Na página 168, da folha de dados atual do ATMEGA16U2, você encontrará que, configurando o bit 3 do UCSR1B (TXEN1), você habilita o transmissor, substituindo a operação normal da porta (ou seja, ela se torna saída). Citando a folha de dados:

Escrever este bit em um habilita o transmissor USART. O transmissor substituirá a operação normal da porta do pino TxDn quando ativado. A desativação do transmissor (escrevendo TXENn em zero) não será efetivada até que as transmissões em andamento e pendentes sejam concluídas, ou seja, quando o registro de mudança de transmissão e o registro de buffer de transmissão não contiverem dados a serem transmitidos. Quando desativado, o transmissor não substituirá mais a porta TxDn.

Portanto, ao escrever, UCSR1B = 0;você não substitui mais o pino TXD1, que atuará como entrada.

O ATMEGA16U2 TXD está conectado à linha RX do ATSAM3X8E. Em operação normal, com o UART ativado, essa linha permanece alta se nenhum dado estiver sendo transmitido. Se você desabilitar o UART, essa linha específica não será mais um driver para 1. Como o código de inicialização não define o pull-up naquele pino (e nem está configurado como saída), o pino se torna uma entrada flutuante e qualquer vazamento para O GND ou mesmo a impedância de entrada da sua sonda (que fica entre o pino e o GND), trará lentamente o nível lógico para 0.

Para substituir esse problema, você deve: 1) Modificar o firmware do ATMEGA16U2, configurando esse PIN como OUTPUT, com o valor 1. 2) Modificar o firmware do ATMEGA16U2, ativando o pull-up nesse pino. 3) (sugerido) Habilite o pull-up na linha RX no ATSAM3X8E.

next-hack
fonte