Pulsa RX misterius pada UART terhubung pada OS X Arduino Due

14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Saya melihat delapan pulsa misterius pada jalur RX ketika saya terhubung ke port serial menggunakan beberapa pustaka klien (Python, JavaScript, serta Monitor Seri terintegrasi di dalam IDE). Tentang 78-79 us masing-masing, sampel pada 1MS / s dengan Logic Pro 16.

Pulsa misteri

Delapan pulsa ini bila ditafsirkan pada 57600 baud akan macet pada firmware Firmata. Dan itu terjadi pada setiap koneksi.

Ini menggunakan instalasi baru Arduino 1.6.8 IDE dan dengan beberapa sketsa (sketsa "Blink" yang normal akan mereproduksi ini juga).

Langkah repro di mesin saya:

  1. Pasang sketsa apa saja
  2. Mulai penganalisis logika jika Anda ingin menangkapnya
  3. Pergi ke Serial Monitor. Tambang saya telah dikonfigurasi untuk 57600 baud, akhir baris Newline, tetapi itu tidak masalah
  4. Jika Anda mau, tutup dan ulangi langkah 3
  5. Catatan pulsa setiap kali Anda terhubung ke port serial

Ada saran untuk mendiagnosis ini? Kedengarannya seperti level driver serial dalam beberapa cara.

Blake Ramsdell
sumber
1
Terlepas dari dari mana asalnya, pertimbangkan bahwa itu telah membantu Anda dengan menunjukkan bug penting pada firmware yang Anda jalankan - ini seharusnya tidak dapat membuatnya dalam keadaan tidak dapat dipulihkan. Apakah ini bug logika program, atau apakah kode penanganan UART tidak menangani flag kesalahan dengan tepat?
Chris Stratton
1
Dalam hal melacak sumber, akan sangat membantu untuk mencoba program klien serial lain, komputer lain / sistem operasi, perangkat serial USB lain, dll ...
Chris Stratton
1
Adapun untuk mencoba program serial lainnya, ada beberapa perpustakaan yang berinteraksi dengan protokol Firmata dan menggunakan implementasi serial yang berbeda (Python, JavaScript dan built in Arduino IDE Serial Monitor) yang memperlihatkan perilaku yang sama. Rencana saya berikutnya adalah mencoba ini pada mesin Linux dan melihat apakah saya melihat perilaku yang sama, yang diharapkan akan mengisolasi jika ini adalah OS X-spesifik.
Blake Ramsdell
2
Anda juga mendapatkan satu ketika Anda memutuskan sambungan. Sambungan baud rate tidak berpengaruh pada panjang pulsa. Kecurigaan saya adalah bahwa firmware ATMega16U2 yang melakukannya (atau chip apa pun pada versi apa pun).
Majenko
1
Saat Anda memulai monitor serial, perangkat lunak akan mengatur ulang modul arduino. Jika modul arduino memiliki bootloader di dalamnya, saya pikir ini adalah sinyal protokol STK500.
Mert Gülsoy

Jawaban:

1

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.

hack berikutnya
sumber