Загадкові імпульси RX на UART підключаються на OS X Arduino Due


14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Я бачу вісім загадкових імпульсів на лінії RX, коли я підключаюся до послідовного порту за допомогою декількох бібліотек клієнтів (Python, JavaScript, а також вбудований послідовний монітор в IDE). Близько 78-79us за штуку, відібрано в 1MS / s з Logic Pro 16.

Таємничі імпульси

Ці вісім імпульсів при інтерпретації при 57600 бодах заклинають програмне забезпечення Firmata. І вони трапляються на кожному зв’язку.

Для цього використовується нова інсталяція Arduino 1.6.8 IDE і з декількома ескізами (звичайний ескіз "Blink" також відтворює це).

Кроки Repro на моїй машині:

  1. Встановіть будь-який ескіз
  2. Запустіть логічний аналізатор, якщо ви хочете його зловити
  3. Перейдіть до послідовного монітора. У мене налаштовано 57600 бод, закінчується лінія Newline, але це не має значення
  4. Якщо ви хочете, закрийте і повторіть крок 3
  5. Зверніть увагу на імпульси кожного разу при підключенні до послідовного порту

Будь-які пропозиції щодо діагностування цього? Це здається, що це серійний драйвер на певному рівні.


1
Незалежно від того, звідки він походить, врахуйте, що він зробив вам послугу, вказавши критичну помилку в прошивці, яку ви працюєте - це не повинно бути в змозі привести її до невідновного стану. Це помилка логіки програми чи код обробки UART не відповідає належним чином прапором помилки?
Кріс Страттон

1
З точки зору відстеження джерела, було б корисно спробувати ще одну серійну клієнтську програму, інший комп'ютер / операційну систему, інший USB-послідовний пристрій тощо ...
Кріс Страттон

1
Що стосується спроб інших послідовних програм, то існує декілька бібліотек, які взаємодіють з протоколом Firmata і використовують різні основні послідовні реалізації (Python, JavaScript та вбудований в Arduino IDE Serial Monitor), які проявляють однакову поведінку. Наступний мій план - спробувати це на машині Linux і побачити, чи бачу я таку саму поведінку, яка, сподіваюся, відокремиться, якщо це стосується ОС X X.
Блейк Рамсделл

2
Ви також отримуєте його при відключенні. Частота передачі передачі не впливає на довжину імпульсу. Я підозрюю, що це прошивка ATMega16U2 (або будь-яка мікросхема в будь-якій версії).
Majenko

1
Коли ви запускаєте послідовний монітор, програмне забезпечення скидає модуль arduino. Якщо в модулі arduino є завантажувач, я думаю, що це сигнали протоколу STK500.
Мерт Гюлсой

Відповіді:


1

Короткий:

Дивлячись на прошивку ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ), я знаходжу це під час налаштування / зміни параметрів. USB-емуляційний послідовний порт, USART скидається. Це трапляється навіть під час відкриття послідовного монітора Arduino (він повинен налаштувати послідовну швидкість тощо). Це спричиняє ваш шип.

Довго:

Подивіться на функцію:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

Там ви побачите, що після деяких рядків він скидає USART, обнуляючи його регістри:

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

На сторінці 168 поточної таблиці даних ATMEGA16U2 ви побачите, що, встановивши біт UCSR1B 3 (TXEN1), ви вмикаєте передавач, переосмислюючи нормальну роботу порту (тобто він стає вихідним). Цитуючи таблицю даних:

Запис цього біта в один дозволяє передавачу USART. Передавач буде змінювати нормальну роботу порту для штифта TxDn, коли його увімкнено. Вимкнення Передавача (запис TXENn до нуля) не набере чинності до тих пір, поки поточні та очікувані передачі не будуть завершені, тобто коли Регістр зсуву передачі та Реєстр буфера передачі не містять даних для передачі. Якщо його вимкнено, Передавач більше не буде змінювати порт TxDn.

Тому, написавши, UCSR1B = 0;ви більше не змінюватимете штифт TXD1, який буде виконувати функцію введення.

ATMEGA16U2 TXD підключений до лінії RX ATSAM3X8E. У нормальному режимі роботи з увімкненим UART ця лінія залишається високою, якщо дані не передаються. Якщо ви вимкнете UART, цей конкретний рядок не має більше драйвера для 1. Оскільки код ініціалізації не встановлює підтяжку на цьому штифті (і не налаштований як вихід), контакт стає плаваючим входом і будь-яким витоком GND або навіть вхідний опір вашого зонда (який знаходиться між вашим штифтом і GND) повільно доведе логічний рівень до 0.

Щоб вирішити цю проблему, вам слід: 1) Змінити вбудовану програму ATMEGA16U2, встановивши цей PIN-код як вихідний, значенням 1. 2) Змінити прошивку ATMEGA16U2, включивши підтягування цього штифта. 3) (запропоновано) Увімкніть підтягування на лінії RX на ATSAM3X8E.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.