Короткий:
Дивлячись на прошивку 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.