Чи може Arduino використовуватися для "шпигування" на зв'язку UART між двома пристроями?


11

У мене є необхідність встановити Arduino (фактично лише ІС) в існуюче обладнання для підвищення функціональності.

Що я хотів би зробити, це з'єднати Arduino так, щоб він "шпигував" за лініями вводу / виводу між двома мікросхемами на платі. Якщо Arduino підбере певне ключове слово на цьому підключенні UART, він виконає певну дію на окремому наборі вихідних штифтів.

Я не впевнений у тому, як з'єднати Arduino таким чином, щоб він міг декодувати наявне з'єднання UART без участі? Якщо це неможливо, мене цікавлять теорії, ідеї тощо.

Відповіді:


17

Якщо я правильно розумію, у вас підключено два пристрої через UART. Я припускаю, що тільки TX, RX та GND лінії, підключені між пристроями? (тобто не використовуються контрольні лінії DTS / CTS / DTR / RTS - це типово).

У цьому випадку TX (передача) пристрою 1 підключений до RX (прийому) пристрою 2 і навпаки. Їх підстави пов'язані між собою. Таким чином, кожен пристрій може одночасно передавати і приймати (кожен передає на окремому проводі, зв’язок є повнодуплексним).

Причина, про яку я все це згадую, полягає в тому, що стає зрозуміло, що для того, щоб «нюхати» або «послухати», вам насправді знадобляться 2 UART для прослуховування обох сторін розмови.

В основному, все, що ви повинні зробити, - це забезпечити короткий короткочасний GND усіх 3 пристроїв і підключити (дійсно, «трійник», як у Т-фітингу, як сантехніка) пристрою 1 та лінії TX пристрою 2 до 2-х ліній RX на 2 UART. Переконайтесь, що швидкості передачі передач усі налаштовані однаково.

Є багато дощок / конструкцій Arduino. Найпоширеніший на сьогоднішній день, Duemilanove, використовує ATMega328P, який, на мою думку, має лише 1 UART (ну USART). Таким чином, вам або доведеться підключити 2-й UART IC, або вдатися до "бітного удару" на другому приймачі.

Зв'язок Async UART чітко визначений, з бітами запуску і зупинки (а іноді і бітами парності), тому якщо ваш процесор досить швидкий, ви можете просто підключити одну з ліній UART TX пристрою до GPIO, налаштованого як вхідний сигнал, і запитувати лінію досить швидко з надмірним зразком для виявлення START & STOP та біт зразка. Стаття Джека Гансса "Біт стукає " дасть вам багато чого пережовувати.

Гідний опис форми хвилі RS232 можна знайти на BeyondLogic .

Зауважте, що є й інші проблеми, такі як рівні напруги (0 / + 5, -10 В / + 10 В і т.д.), які вам доведеться враховувати (див. Розділ "Більше логіки" на "Перетворювачі рівня RS232"). У мене недостатньо інформації щодо вашої системи, щоб обговорити апаратне взаємодію, окрім підходу "підключити лінії", обговореного вище. Якщо припустити, що рівні напруги збігаються, зазвичай це не є проблемою "підключити" лінію TX до другого приймача (sniffer), але якщо у TX недостатньо приводу, вам може знадобитися вставити буфер / драйвер, щоб запобігти сигнал від деградації.


Гарний! Мені знадобляться лише дані, що подорожують в одному напрямку, тому одного UART на чіпі ATMega достатньо! Два мікросхеми спілкуються з +/- 5V UART, що, на мою думку, є таким же, як у ATMega. Нічого собі, так і повинно бути! Спасибі!
Бред Хайн

@BradHein, те, що ви називаєте "+/- 5V", зазвичай називають "рівнем TTL" - див. En.wikipedia.org/wiki/Logic_level .
Мельс

3
@Mels +/- 5V НЕ TTL, TTL НЕ йде нижче рівня землі. Це RS-232.
nmz787

9

Ви можете зробити акуратний трюк, якщо спілкування ведеться лише в одному напрямку (тобто напівдуплексне спілкування). Це не спрацює, якщо обидві сторони розмовляють між собою одночасно (повний дуплекс), але якщо це типовий "зробіть це" "нормально, ось відповідь" "зараз зробіть це" "добре ось новий тип відповіді" це працює досить добре.

Оскільки посилання UART використовує неробочий стан передавача на логічно високому рівні (1), ви б використовували 2-вхідний і затворний І підключали TX з кожної сторони до входу AND. Вихід воріт AND - це ваш вхід до UART вашого сніфера (це RX-контакт). Тепер візьміть лінію TX пристрою B, а також піднесіть його до порту вводу / виводу на снайфері. Ви налаштуєте sniffer для створення переривання, коли цей штифт перейде від високого до низького.

Для резюме: пристрій AART TX -> AND вхід на ворота. Пристрій B UART TX -> інший І вхід І ворота та нюхальний GPIO контакт. Вихід лінії І - - sniffer лінія UART RX.

Комунікації UART складаються з початкового біта, деякої кількості бітів даних, необов'язкового біта парності та одного або декількох стоп-бітів. Оскільки стан холостого ходу є логічно високим (1), то початок кожного байта буде логічно низьким (0), і переривання на sniffer запуститься. Поки ваш sniffer виконує переривання вводу / виводу, апаратне забезпечення UART буде збирати біти з воріт AND. До того моменту, коли UART отримає стоп-біт, переривання вводу / виводу буде зроблено довго, і перерва UART RX запуститься.

Підпрограма перерви на введення-виведення встановлює змінну "напрям", яка вказує на те, що комунікації йдуть у напрямку "B-> A". Переривання прийому UART sniffer буде дивитись на цю змінну "напряму" і записувати щойно отриманий байт у відповідний буфер. Потім перерив UART RX поверне змінну "напрям" назад до стану "A-> B" за замовчуванням:

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 */
}

Цей код написано для наочності, а не обов'язково для написання в реальній ситуації. Особисто я б зробив "напрямок" вказівника на відповідну структуру FIFO, але це вже інша вправа. :-)

Коли пристрій A розмовляє, лінія вводу / виводу не рухається (вона залишається в логіці "1", оскільки передавач UART пристрою B не працює), а переривник UART RX отримає байт, дивіться, що напрямок A-> B , і зберігати дані до цього буфера. Коли пристрій B розмовляє, лінія вводу / виводу знизиться, як тільки пристрій B почне перемикати дані, і програма переривання вводу / виводу встановить напрямок, який вказує на те, що пристрій B говорить. Переривання UART RX в кінцевому підсумку спрацює після того, як всі біти будуть зібрані, і оскільки переривання вводу / виводу переймається правильним встановленням регістру напрямків, отриманий байт буде зберігатися у правильному буфері.

Presto: напівдуплексний зв’язок між двома пристроями, захопленими однією лінією UART та вводу / виводу на нюхалеві, без зв’язку біт-ударів UART.


Інтригуючий. Це розсуває межі моїх розумінь, але це чудово! Одну частину, яку я не розумію, - це те, як UART sniffer підключений до цілі, щоб він міг перехоплювати обидва напрямки спілкування? У мене є кілька контактів вводу / виводу, тому я можу просто використовувати два штифти вводу / виводу за допомогою цього методу і ефективно збирати обидва напрямки руху?
Бред Хайн

Лінія SARTER UX RX підключена до виходу затвора AND. UART TX пристрою A підключений до одного входу затвора AND, а UART TX пристрою B підключений до іншого входу затвора AND. Оскільки умова простою (без руху) UART є логікою "1", ворота AND ефективно поєднує обидва сигнали передачі в один. Рядок вводу / виводу на снайфері використовується для виявлення пускового біта пристрою В, щоб він міг приймати байт, який він отримує, на своєму UART і помістити його у відповідний буфер (пристрій A трафік або пристрій B трафік).
akohlsmith

Фрагмент коду та провідність воріт AND дозволяють sniffer записувати обидва напрямки потоку руху за допомогою одного UART. Це ТІЛЬКИ працює, якщо трафік є напівдуплексним. Це означає, що коли один пристрій розмовляє, інший слухає. Якщо обидва розмовлятимуть одночасно (повний дуплекс), це взагалі не буде працювати.
akohlsmith

5

Вам не доведеться підключати штифт передачі даних AVR до своєї схеми. Просто підключіть лінію прийому до половини існуючого посилання, яке ви хочете підслухати. Якщо ваш конкретний AVR має два послідовних порти, ви повинні мати змогу одночасно шпигувати за обома половинами існуючого посилання. Вам просто потрібно, щоб налаштування портів відповідали наявній швидкості передачі, зупиняють біти тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.