Таинственные RX импульсы на UART подключаются на OS X Arduino Due

14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Я вижу восемь таинственных импульсов на линии RX, когда я подключаюсь к последовательному порту, используя несколько клиентских библиотек (Python, JavaScript, а также встроенный Serial Monitor в IDE). Около 78-79 долл. США за штуку, отбор проб со скоростью 1 мс / с на Logic Pro 16.

Тайные импульсы

Эти восемь импульсов при интерпретации со скоростью 57600 бодов заклинивают прошивку Firmata. И они случаются при каждом соединении.

Для этого используется новая установка среды разработки Arduino 1.6.8 и несколько эскизов (обычный эскиз «Blink» также воспроизведет это).

Репро шаги на моей машине:

  1. Установить любой эскиз
  2. Запустите логический анализатор, если вы хотите его поймать
  3. Перейти к последовательному монитору. Мой настроен на 57600 бод, конец строки Newline, но это не имеет значения
  4. Если хотите, закройте и повторите шаг 3
  5. Примечание импульсы каждый раз, когда вы подключаетесь к последовательному порту

Любые предложения для диагностики этого? Похоже, это серийный уровень драйвера в некотором роде.

Блейк Рамсделл
источник
1
Независимо от того, откуда он исходит, учтите, что он сделал вам одолжение, указав на критическую ошибку в прошивке, которую вы используете - это не должно привести к невозможности ее восстановления. Это программная логическая ошибка или код обработки UART неправильно обрабатывает флаг ошибки?
Крис Страттон
1
С точки зрения отслеживания источника, было бы полезно попробовать другую программу последовательного клиента, другой компьютер / операционную систему, другое устройство USB-serial и т. Д.
Крис Стрэттон
1
Что касается тестирования других последовательных программ, есть несколько библиотек, которые взаимодействуют с протоколом Firmata и используют различные базовые последовательные реализации (Python, JavaScript и встроенный Arduino IDE Serial Monitor), которые демонстрируют такое же поведение. Мой следующий план - попробовать это на компьютере с Linux и посмотреть, вижу ли я то же поведение, которое, будем надеяться, изолирует, если это зависит от OS 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 Serial Monitor (он должен настроить скорость последовательного порта и т. Д.). Это вызывает ваш всплеск.

Длинная:

Посмотрите на функцию:

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 вы обнаружите, что, устанавливая бит 3 UCSR1B (TXEN1), вы включаете передатчик, переопределяя нормальную работу порта (т. Е. Он становится выходным). Цитирование таблицы данных:

Запись этого бита в один включает передатчик USART. При включении передатчик отменяет нормальную работу порта для контакта TxDn. Отключение передатчика (запись TXENn в ноль) не вступит в силу до тех пор, пока не будут завершены текущие и ожидающие передачи, то есть когда регистр сдвига передачи и регистр буфера передачи не содержат данных для передачи. Когда отключено, передатчик больше не будет переопределять порт TxDn.

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

ATMEGA16U2 TXD подключен к линии RX ATSAM3X8E. При нормальной работе с включенным UART эта линия остается высокой, если данные не передаются. Если вы отключите UART, эта конкретная линия больше не будет драйвером 1. Поскольку код инициализации не устанавливает подтягивание на этом выводе (и при этом он не настроен как выход), вывод становится плавающим входом, и любая утечка к GND или даже входной импеданс вашего датчика (который находится между вашим выводом и GND), медленно снизит логический уровень до 0.

Чтобы устранить эту проблему, вам необходимо: 1) изменить прошивку ATMEGA16U2, установив этот PIN-код как OUTPUT со значением 1. 2) изменить прошивку ATMEGA16U2, включив подтягивание на этом выводе. 3) (рекомендуется) Включите подтягивание на линии RX на ATSAM3X8E.

следующего хак
источник