Arduino có thể được sử dụng để gián điệp gián điệp trên một kết nối UART giữa hai thiết bị không?


11

Tôi có nhu cầu cài đặt Arduino (thực tế chỉ là IC) vào phần cứng hiện có để tăng cường chức năng.

Những gì tôi muốn làm là kết nối Arduino để nó "spys" trên các dòng I / O giữa hai chip trên một bảng. Nếu Arduino chọn một từ khóa cụ thể trên kết nối UART đó, nó sẽ thực hiện một hành động cụ thể trên một bộ chân đầu ra riêng biệt.

Điều tôi không chắc chắn là làm thế nào để kết nối Arduino theo cách mà nó có thể giải mã kết nối UART hiện có mà không cần tham gia? Nếu không thể, tôi quan tâm đến lý thuyết, ý tưởng, v.v.

Câu trả lời:


17

Nếu tôi hiểu chính xác, bạn có 2 thiết bị được kết nối qua UART. Tôi giả sử chỉ có các đường TX, RX và GND được kết nối giữa các thiết bị? (nghĩa là không sử dụng dòng điều khiển DTS / CTS / DTR / RTS - đây là điển hình).

Trong trường hợp này, TX (truyền) của thiết bị 1 được kết nối với RX (nhận) của thiết bị 2 và ngược lại. Căn cứ của họ được kết nối với nhau. Do đó, mỗi thiết bị có thể được truyền và nhận cùng một lúc (mỗi thiết bị truyền trên một dây riêng biệt, giao tiếp là song công hoàn toàn).

Lý do tôi đề cập đến tất cả những điều này là vì rõ ràng rằng để "đánh hơi" hoặc "lắng nghe", bạn thực sự sẽ cần 2 UART để lắng nghe cả hai phía của cuộc trò chuyện.

Về cơ bản, tất cả những gì bạn làm là đảm bảo rằng tất cả các thiết bị UART GND của 3 thiết bị đều được rút ngắn và kết nối (thực sự là "tee", như trong ống nối T, giống như hệ thống ống nước) của thiết bị 1 & thiết bị 2 của TX với 2 đường RX trên 2 UART. Đảm bảo rằng tốc độ baud đều được cấu hình giống hệt nhau.

Có rất nhiều bảng / thiết kế Arduino. Loại phổ biến nhất hiện nay, Duemilanove, sử dụng ATMega328P, mà tôi nghĩ chỉ có 1 UART (tốt, USART). Vì vậy, bạn sẽ phải kết nối IC UART thứ 2 hoặc sử dụng "bit banging" trên máy thu thứ hai.

Truyền thông AsART UART được xác định rõ, với các bit start & stop (và đôi khi là bit chẵn lẻ), vì vậy nếu bộ xử lý của bạn đủ nhanh, bạn có thể chỉ cần kết nối một trong các dòng UART TX của thiết bị với GPIO được định cấu hình làm đầu vào và thăm dò dòng đủ nhanh với quá khổ để phát hiện START & STOP và các bit mẫu. Bài viết "Bit Banging" của Jack Ganssle sẽ cho bạn nhiều điều để nhai.

Một mô tả phong nha của dạng sóng RS232 có thể được tìm thấy tại BeyondLogic .

Lưu ý rằng có các vấn đề khác, chẳng hạn như các mức điện áp (0 / + 5, -10V / + 10V, v.v.) mà bạn sẽ phải xem xét (xem phần Beyond Logic trên "Bộ chuyển đổi mức RS232"). Tôi không có đủ thông tin trên hệ thống của bạn để thảo luận về giao diện phần cứng bên cạnh phương pháp "kết nối các đường dây" được thảo luận ở trên. Giả sử các mức điện áp được khớp, thường thì không có vấn đề gì khi "phát" đường TX vào máy thu thứ hai (trình thám thính), nhưng nếu TX không có đủ ổ đĩa, bạn có thể cần phải chèn bộ đệm / trình điều khiển để ngăn chặn tín hiệu từ sự xuống cấp.


Xinh đẹp! Tôi sẽ chỉ cần dữ liệu di chuyển theo một hướng để UART duy nhất trên chip ATMega là vừa đủ! Hai chip giao tiếp với UART +/- 5V, mà tôi nghĩ là giống với ATMega. Wow, nên là nó! Cảm ơn!
Brad Hein

@BradHein, cái mà bạn gọi là "+/- 5V" thường được gọi là "cấp độ TTL" - xem en.wikipedia.org/wiki/Logic_level .
Mels

3
@Mels +/- 5V KHÔNG phải là TTL, TTL không đi dưới mặt đất. Đây là RS-232.
nmz787

9

Có một mẹo gọn gàng bạn có thể làm nếu giao tiếp chỉ theo một hướng tại một thời điểm (tức là giao tiếp song công). Sẽ không hoạt động nếu cả hai bên nói chuyện với nhau cùng một lúc (song công hoàn toàn) nhưng nếu đó là "làm điều này" "thì đây là phản hồi" "bây giờ hãy làm điều này" "đây là kiểu liên lạc mới" nó hoạt động khá tốt

Vì liên kết UART sử dụng điều kiện không hoạt động của máy phát ở mức logic cao (1), bạn sẽ sử dụng cổng AND 2 đầu vào và kết nối TX từ mỗi bên với đầu vào AND. Đầu ra của cổng AND là đầu vào của bạn cho UART của sniffer (đó là chân RX). Bây giờ, hãy lấy dòng TX của thiết bị B và cũng mang nó đến cổng I / O trên trình thám thính. Bạn sẽ cấu hình sniffer để tạo ra một ngắt khi pin này đi từ cao xuống thấp.

Để tóm tắt: thiết bị A UART TX -> VÀ cổng đầu vào. Thiết bị B UART TX -> đầu vào cổng AND khác và pin GPIO sniffer. Đầu ra của cổng AND -> dòng UART RX sniffer.

Truyền thông UART bao gồm một bit start, một số bit dữ liệu, bit chẵn lẻ tùy chọn và một hoặc nhiều bit stop. Vì trạng thái không hoạt động là mức logic cao (1), nên bắt đầu MERYI byte sẽ là mức logic thấp (0) và ngắt trên sniffer sẽ kích hoạt. Trong khi trình thám thính của bạn đang thực hiện ngắt I / O, phần cứng UART sẽ thu thập các bit từ cổng AND. Vào thời điểm UART nhận được bit stop, ngắt I / O sẽ được thực hiện lâu và ngắt UART RX sẽ kích hoạt.

Thói quen thay đổi ngắt trên IO sẽ đặt biến "hướng" để chỉ ra rằng các giao tiếp theo hướng "B-> A". Ngắt nhận UART của sniffer sẽ xem xét biến "hướng" này và ghi byte vừa nhận vào bộ đệm thích hợp. Ngắt UART RX sau đó sẽ đặt biến "hướng" trở về trạng thái "A-> B" mặc định:

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

Mã này được viết cho rõ ràng và không nhất thiết là những gì bạn viết trong tình huống thực tế. Cá nhân tôi sẽ làm cho "hướng" một con trỏ đến cấu trúc FIFO thích hợp, nhưng đó hoàn toàn là một bài tập khác. :-)

Khi thiết bị A đang nói, đường I / O không di chuyển (nó vẫn ở mức logic '1' do bộ phát UART của thiết bị B không hoạt động) và ngắt UART RX sẽ nhận được một byte, hãy xem hướng đó là A-> B và lưu trữ dữ liệu vào bộ đệm đó. Khi thiết bị B đang nói chuyện, đường I / O sẽ xuống thấp ngay khi thiết bị B bắt đầu chuyển dữ liệu ra và thói quen ngắt I / O sẽ đặt hướng để chỉ ra rằng thiết bị B đang nói chuyện. Ngắt UART RX cuối cùng sẽ kích hoạt sau khi tất cả các bit được thu thập và vì ngắt I / O đã đảm nhiệm việc thiết lập thanh ghi hướng một cách thích hợp, byte nhận được sẽ được lưu trữ trong bộ đệm chính xác.

Presto: liên lạc bán song công giữa hai thiết bị được chụp bằng một dòng UART và I / O duy nhất trên sniffer, không có giao tiếp UART bit-banged.


Hấp dẫn. Điều này đang đẩy giới hạn hiểu biết của tôi, nhưng nó thật tuyệt! Một phần tôi không hiểu là làm thế nào UART của sniffer được kết nối với mục tiêu để nó có thể chặn cả hai hướng liên lạc? Tôi có sẵn một số Ghim I / O, vì vậy tôi có thể chỉ sử dụng hai Ghim I / O bằng phương pháp này và thu thập hiệu quả cả hai hướng lưu lượng không?
Brad Hein

Dòng UART RX sniffer được kết nối với đầu ra của cổng AND. UART TX của thiết bị A được kết nối với một đầu vào của cổng AND và UART TX của thiết bị B được kết nối với đầu vào khác của cổng AND. Vì điều kiện không hoạt động (không có lưu lượng) của UART là logic '1', cổng AND kết hợp hiệu quả cả hai tín hiệu truyền thành một. Dòng I / O trên sniffer được sử dụng để phát hiện bit start của thiết bị B để nó có thể lấy byte mà nó nhận được trên UART của nó và đặt nó vào bộ đệm thích hợp (lưu lượng truy cập thiết bị A hoặc lưu lượng B của thiết bị).
akohlsmith

Đoạn mã và hệ thống dây điện của cổng AND cho phép trình thám thính ghi lại cả hai hướng của luồng lưu lượng với một UART duy nhất. CHỈ này hoạt động nếu lưu lượng là bán song công. Điều đó có nghĩa là khi một thiết bị đang nói, thiết bị kia đang lắng nghe. Nếu cả hai nói chuyện cùng một lúc (song công hoàn toàn) thì điều này sẽ không hoạt động.
akohlsmith

5

Bạn không cần phải ghim dữ liệu truyền dữ liệu của AVR vào mạch của mình. Chỉ cần kết nối dòng nhận với một nửa liên kết hiện có mà bạn muốn nghe lén. Nếu AVR cụ thể của bạn có hai cổng nối tiếp, bạn sẽ có thể theo dõi đồng thời cả hai nửa của liên kết hiện có. Bạn chỉ cần làm cho các cài đặt cổng khớp với tốc độ truyền, bit dừng, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.