Bisakah Arduino digunakan untuk "memata-matai" pada koneksi UART antara dua perangkat?

11

Saya perlu menginstal Arduino (sebenarnya hanya IC) ke perangkat keras yang ada untuk meningkatkan fungsionalitas.

Yang ingin saya lakukan adalah menghubungkan Arduino sehingga "memata-matai" pada garis I / O antara dua chip di papan. Jika Arduino mengambil kata kunci tertentu pada koneksi UART itu, Arduino akan melakukan tindakan spesifik pada set pin output yang terpisah.

Apa yang saya tidak yakin adalah bagaimana menghubungkan Arduino sedemikian rupa sehingga dapat memecahkan kode koneksi UART yang ada tanpa berpartisipasi? Jika tidak memungkinkan, saya tertarik pada teori, ide, dll.

Brad Hein
sumber

Jawaban:

17

Jika saya mengerti benar, Anda memiliki 2 perangkat yang terhubung melalui UART. Saya menganggap hanya garis TX, RX, dan GND yang terhubung di antara kedua perangkat? (Yaitu, tidak ada garis kontrol DTS / CTS / DTR / RTS yang digunakan - ini tipikal).

Dalam skenario ini, device 1's TX (transmit) terhubung ke device 2's RX (accept), dan sebaliknya. Alasan mereka terhubung satu sama lain. Dengan demikian, setiap perangkat dapat mentransmisikan dan menerima pada saat yang sama (masing-masing mentransmisikan pada kabel yang terpisah, komunikasi full-duplex).

Alasan saya menyebutkan semua ini adalah karena menjadi jelas bahwa untuk "mengendus" atau "mendengarkan", Anda sebenarnya membutuhkan 2 UART untuk mendengarkan kedua sisi percakapan.

Pada dasarnya, semua yang akan Anda lakukan adalah memastikan bahwa GND UART ketiga perangkat disingkat, dan hubungkan (benar-benar, "tee", seperti pada perangkat T-fitting, seperti pipa ledeng) 1 & perangkat 2 garis TX ke 2 jalur RX pada 2 UART. Pastikan bahwa baud rate semuanya dikonfigurasi secara identik.

Ada banyak papan / desain Arduino. Yang paling umum saat ini, Duemilanove, menggunakan ATMega328P, yang saya pikir hanya memiliki 1 UART (well, USART). Jadi, Anda harus memasang IC UART ke-2, atau menggunakan "bit banging" pada receiver kedua.

Komunikasi Async UART didefinisikan dengan baik, dengan bit mulai & berhenti (dan kadang-kadang bit paritas), jadi jika prosesor Anda cukup cepat, Anda dapat dengan mudah menyambungkan salah satu saluran TX UART perangkat ke GPIO yang dikonfigurasi sebagai input, dan polling garis cukup cepat dengan oversampling untuk mendeteksi START & STOP dan sampel bit. Artikel "Bit Banging" oleh Jack Ganssle akan memberi Anda banyak hal untuk dikunyah.

Deskripsi yang layak tentang gelombang RS232 dapat ditemukan di BeyondLogic .

Perhatikan bahwa ada masalah lain seperti level tegangan (0 / + 5, -10V / + 10V, dll.) Yang harus Anda pertimbangkan (lihat bagian Beyond Logic pada "RS232 Level Converters"). Saya tidak memiliki cukup informasi tentang sistem Anda untuk membahas interfacing perangkat keras selain pendekatan "sambungkan jalur" yang dibahas di atas. Dengan asumsi level tegangan cocok, biasanya itu tidak masalah untuk "tee" garis TX ke penerima kedua (sniffer), tetapi jika TX tidak memiliki cukup drive, Anda mungkin perlu memasukkan buffer / driver untuk mencegah sinyal dari merendahkan.

Radian
sumber
Cantik! Saya hanya perlu data perjalanan dalam satu arah sehingga UART tunggal pada chip ATMega cukup! Kedua chip berkomunikasi dengan +/- 5V UART, yang saya pikir sama dengan ATMega. Wow, seharusnya begitu! Terima kasih!
Brad Hein
@BradHein, apa yang Anda sebut "+/- 5V" biasanya disebut sebagai "level TTL" - lihat en.wikipedia.org/wiki/Logic_level .
Mels
3
@Mels +/- 5V BUKAN TTL, TTL TIDAK pergi di bawah Tanah. Ini RS-232.
nmz787
9

Ada trik yang dapat Anda lakukan jika komunikasi hanya satu arah pada satu waktu (yaitu komunikasi setengah dupleks). Ini tidak akan berfungsi jika kedua belah pihak berbicara satu sama lain pada saat yang sama (dupleks penuh) tetapi jika itu khas Anda "lakukan ini" "ok inilah jawabannya" "sekarang lakukan ini" "ok inilah respons baru" jenis komunikasi ini bekerja dengan baik.

Karena tautan UART menggunakan kondisi siaga pemancar pada level logika tinggi (1), Anda akan menggunakan gerbang AND 2-input dan menghubungkan TX dari setiap sisi ke input AND. Output dari gerbang AND adalah input Anda ke UART sniffer Anda (ini pin RX). Sekarang ambil garis TX perangkat B dan juga bawa ke port I / O pada sniffer. Anda akan mengonfigurasi sniffer untuk menghasilkan interupsi ketika pin ini beralih dari tinggi ke rendah.

Untuk rekap: perangkat A UART TX -> DAN masukan gerbang. Perangkat B UART TX -> input DAN gerbang lainnya DAN pin SNIO sniffer. Output dari AND gate -> sniffer jalur UART RX.

Komunikasi UART terdiri dari bit awal, sejumlah bit data, bit paritas opsional, dan satu atau beberapa bit stop. Karena status siaga adalah logika tinggi (1), awal SETIAP byte akan menjadi logika rendah (0) dan interupsi pada sniffer akan menyala. Saat sniffer Anda menjalankan interupsi I / O, perangkat keras UART akan mengumpulkan bit dari gerbang AND. Pada saat UART menerima bit stop, interupsi I / O akan lama dilakukan dan interupsi UART RX akan menyala.

Rutin interrupt-on-IO-change akan menetapkan variabel "direction" untuk menunjukkan bahwa komunikasi berada di arah "B-> A". UART sniffer's accept interrupt akan melihat variabel "direction" ini dan menulis byte yang baru saja diterima ke buffer yang sesuai. Interupsi UART RX kemudian akan mengatur variabel "direction" kembali ke keadaan "A-> B" default:

volatile int direction = 0;           /* 0 = A -> B */

void io_interrupt(void)
{
    direction = 1;                    /* switch direction, now B -> A */
}

void uart_interrupt(void)
{
    unsigned char b;

    b = UART_RX_REG;
    if(direction) {
        store_byte_to_device_b_sniff_buffer(b);
    } else {
        store_byte_to_device_a_sniff_buffer(b);
    }

    direction = 0;                   /* reset direction to default A -> B */
}

Kode ini ditulis untuk kejelasan dan belum tentu apa yang akan Anda tulis dalam situasi dunia nyata. Secara pribadi saya akan membuat "arah" pointer ke struktur FIFO yang sesuai, tapi itu latihan lain sepenuhnya. :-)

Ketika perangkat A berbicara, garis I / O tidak bergerak (tetap pada logika '1' karena pemancar UART perangkat B menganggur), dan interupsi UART RX akan menerima byte, melihat bahwa arahnya adalah A-> B , dan menyimpan data ke buffer itu. Ketika perangkat B berbicara, garis I / O akan turun segera setelah perangkat B mulai memindahkan data, dan rutin interupsi I / O akan menetapkan arah untuk menunjukkan bahwa perangkat B sedang berbicara. Interupsi UART RX pada akhirnya akan menyala setelah semua bit dikumpulkan dan karena I / O interupsi telah mengatur pengaturan register arah secara tepat, byte yang diterima akan disimpan dalam buffer yang benar.

Presto: komunikasi setengah dupleks antara dua perangkat yang ditangkap dengan satu jalur UART dan I / O pada sniffer, tanpa komunikasi UART yang sedikit menggedor.

akohlsmith
sumber
Menarik. Ini mendorong batas pemahaman saya, tapi itu bagus! Salah satu bagian yang saya tidak mengerti adalah bagaimana UART sniffer terhubung ke target sehingga dapat mencegat kedua arah komunikasi? Saya memiliki beberapa Pin I / O, jadi bisakah saya menggunakan dua Pin I / O menggunakan metode ini dan secara efektif mengumpulkan kedua arah lalu lintas?
Brad Hein
Garis UART RX sniffer terhubung ke output dari gerbang AND. Perangkat A's UART TX terhubung ke satu input dari gerbang AND, dan perangkat B's UART TX terhubung ke input lain dari gerbang AND. Karena kondisi siaga (tidak ada lalu lintas) dari UART adalah logika '1', gerbang AND secara efektif menggabungkan kedua sinyal transmisi menjadi satu. Garis I / O pada sniffer digunakan untuk mendeteksi bit awal perangkat B sehingga dapat mengambil byte yang diterimanya pada UART-nya dan meletakkannya di buffer yang sesuai (lalu lintas perangkat A atau lalu lintas perangkat B).
akohlsmith
Fragmen kode dan kabel gerbang AND memungkinkan sniffer untuk merekam kedua arah aliran lalu lintas dengan UART tunggal. Ini HANYA berfungsi jika lalu lintas setengah dupleks. Itu berarti bahwa ketika satu perangkat berbicara, yang lain sedang mendengarkan. Jika keduanya berbicara pada saat yang sama (dupleks penuh) maka ini tidak akan berfungsi sama sekali.
akohlsmith
5

Anda tidak harus mengaitkan pin data transmisi AVR ke sirkuit Anda. Cukup sambungkan jalur penerimaan ke setengah dari tautan yang ada yang ingin Anda dengar. Jika AVR khusus Anda memiliki dua port serial, Anda harus dapat memata-matai kedua bagian dari tautan yang ada secara bersamaan. Anda hanya perlu membuat pengaturan port sesuai dengan baud rate, stop bit, dll.

JustJeff
sumber