Pendek:
Melihat firmware ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) Saya menemukan itu, ketika Anda mengkonfigurasi / mengubah pengaturan pengaturan Port serial USB yang diemulasi, USART diatur ulang. Ini terjadi bahkan ketika Anda membuka Arduino Serial Monitor (harus mengkonfigurasi kecepatan serial, dll.). Ini menyebabkan lonjakan Anda.
Panjang:
Lihat fungsinya:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
Di sana Anda akan melihat bahwa setelah beberapa baris, itu me-reset USART, dengan memusatkan registernya:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
Pada halaman 168, dari lembar data ATMEGA16U2 saat ini, Anda akan menemukan bahwa, dengan mengatur bit 3 UCSR1B (TXEN1), Anda mengaktifkan pemancar, mengesampingkan operasi port normal (yaitu menjadi output). Mengutip lembar data:
Menulis bit ini ke satu memungkinkan Transmitter USART. Transmitter akan mengesampingkan operasi port normal untuk pin TxDn saat diaktifkan. Penonaktifan Transmitter (menulis TXENn ke nol) tidak akan menjadi efektif sampai transmisi yang sedang berlangsung dan yang tertunda selesai, yaitu, ketika Transmit Shift Register dan Transmit Buffer Register tidak mengandung data yang akan dikirim. Ketika dinonaktifkan, Transmitter tidak akan lagi mengesampingkan port TxDn.
Oleh karena itu, dengan menulis UCSR1B = 0;
Anda tidak lagi menimpa pin TXD1, yang akan bertindak sebagai input.
ATMEGA16U2 TXD terhubung ke jalur RX ATSAM3X8E. Dalam operasi normal, dengan UART diaktifkan, saluran itu tetap tinggi jika tidak ada data yang dikirim. Jika Anda menonaktifkan UART, baris tertentu tidak lagi menjadi driver 1. Karena kode inisialisasi tidak mengatur pull-up pada pin tersebut (dan tidak dikonfigurasi sebagai output), pin tersebut menjadi input mengambang, dan setiap kebocoran ke GND atau bahkan impedansi input dari probe Anda (yang berada di antara pin Anda dan GND), perlahan akan membawa tingkat logika ke 0.
Untuk mengatasi masalah ini, Anda harus: 1) Memodifikasi firmware ATMEGA16U2, dengan menetapkan PIN sebagai OUTPUT, dengan nilai 1. 2) Memodifikasi firmware ATMEGA16U2, dengan mengaktifkan penarik pada pin tersebut. 3) (disarankan) Mengaktifkan pull-up pada garis RX pada ATSAM3X8E.