Arduino สามารถใช้เป็น "สายลับ" ในการเชื่อมต่อ UART ระหว่างอุปกรณ์สองเครื่องได้หรือไม่?


11

ฉันต้องการติดตั้ง Arduino (อันที่จริงแค่ IC) ลงในฮาร์ดแวร์ที่มีอยู่เพื่อปรับปรุงการทำงาน

สิ่งที่ฉันต้องการจะทำคือการเชื่อมต่อ Arduino เพื่อให้ "spys" บนเส้น I / O ระหว่างสองชิปบนกระดาน หาก Arduino หยิบคำค้นหาที่เฉพาะเจาะจงในการเชื่อมต่อ UART นั้นมันจะทำการกระทำเฉพาะในชุดขาออกแยกต่างหาก

สิ่งที่ฉันไม่แน่ใจเกี่ยวกับวิธีการเชื่อมต่อ Arduino ในวิธีที่มันสามารถถอดรหัสการเชื่อมต่อ UART ที่มีอยู่โดยไม่ต้องเข้าร่วม? ถ้าเป็นไปไม่ได้ฉันสนใจในทฤษฎีความคิด ฯลฯ

คำตอบ:


17

ถ้าฉันเข้าใจถูกต้องคุณมี 2 อุปกรณ์ที่เชื่อมต่อผ่าน UART ฉันคิดว่าเป็นเพียงสาย TX, RX และ GND ที่เชื่อมต่อระหว่างอุปกรณ์หรือไม่ (กล่าวคือไม่มีบรรทัดควบคุม DTS / CTS / DTR / RTS ที่ใช้ - นี่เป็นเรื่องปกติ)

ในสถานการณ์นี้ TX ของอุปกรณ์ 1 (การส่ง) เชื่อมต่อกับ RX (รับ) ของอุปกรณ์ 2 และในทางกลับกัน พื้นที่ของพวกเขาเชื่อมต่อกัน ดังนั้นอุปกรณ์แต่ละชิ้นสามารถส่งและรับได้ในเวลาเดียวกัน (แต่ละการส่งผ่านสายแยกต่างหากการสื่อสารเป็นแบบฟูลดูเพล็กซ์)

เหตุผลที่ฉันพูดถึงทั้งหมดนี้เป็นเพราะเห็นได้ชัดว่า "ดมกลิ่น" หรือ "ฟัง" คุณจะต้องใช้ 2 UART เพื่อฟังการสนทนาทั้งสองด้าน

โดยพื้นฐานแล้วสิ่งที่คุณต้องทำก็คือตรวจสอบให้แน่ใจว่า UART GNDs ของอุปกรณ์ทั้ง 3 ตัวนั้นสั้นและเชื่อมต่อ (จริง ๆ "ที" ในอุปกรณ์ T-fitting เช่นประปา) อุปกรณ์ TX 1 และ 2 ของอุปกรณ์ TX กับ 2 RX ใน 2 UART ตรวจสอบให้แน่ใจว่าอัตราการรับส่งข้อมูลทั้งหมดได้รับการกำหนดค่าเหมือนกัน

มีบอร์ด / การออกแบบ Arduino จำนวนมาก ที่พบบ่อยที่สุดในปัจจุบันคือ Duemilanove ใช้ ATMega328P ซึ่งฉันคิดว่ามีเพียง UART เพียง 1 ตัวเท่านั้น (เช่น USART) ดังนั้นคุณจะต้องต่อสาย UART IC ตัวที่ 2 หรือรีสอร์ตที่ "bit banging" บนตัวรับสัญญาณที่สอง

การสื่อสาร Async UART ได้รับการกำหนดไว้อย่างดีโดยมีบิตเริ่มต้นและหยุด (และบางครั้งบิตพาริตี้) ดังนั้นหากโปรเซสเซอร์ของคุณเร็วพอคุณสามารถเชื่อมต่อหนึ่งในสาย UART TX ของอุปกรณ์กับ GPIO ที่กำหนดค่าเป็นอินพุตและสำรวจความคิดเห็น เร็วพอกับการสุ่มตัวอย่างเพื่อตรวจหา START & STOP และบิตตัวอย่าง บทความ"การต่อสู้บิต" โดย Jack Ganssleจะทำให้คุณเคี้ยวมากมาย

คำอธิบายที่เหมาะสมของรูปแบบของคลื่น RS232 สามารถพบได้ที่BeyondLogic

โปรดทราบว่ามีปัญหาอื่น ๆ เช่นระดับแรงดันไฟฟ้า (0 / + 5, -10V / + 10V ฯลฯ ) ที่คุณจะต้องพิจารณา (ดูหัวข้อ Beyond Logic ใน "ตัวแปลงระดับ RS232") ฉันไม่มีข้อมูลเพียงพอในระบบของคุณเพื่อหารือเกี่ยวกับการเชื่อมต่อฮาร์ดแวร์นอกเหนือจากวิธี "เชื่อมต่อสาย" ที่กล่าวถึงข้างต้น สมมติว่าระดับแรงดันไฟฟ้าตรงกันโดยปกติจะไม่มีปัญหาในการ "ที" สาย TX เข้ากับตัวรับสัญญาณที่สอง (ตัวดมกลิ่น) แต่ถ้า TX ไม่มีไดรฟ์เพียงพอคุณอาจต้องใส่บัฟเฟอร์ / ไดรเวอร์เพื่อป้องกัน สัญญาณจากการย่อยสลาย


สวย! ฉันต้องการข้อมูลที่เดินทางไปในทิศทางเดียวดังนั้น UART เดียวบนชิป ATMega ก็เพียงพอแล้ว! ชิปทั้งสองสื่อสารกับ +/- 5V UART ซึ่งฉันคิดว่าเหมือนกับ ATMega ว้าวนั่นน่าจะเป็น! ขอบคุณ!
แบรดไฮน์

@BradHein สิ่งที่คุณกำลังเรียก "+/- 5V" มักจะเรียกว่า "ระดับ TTL" - ดูen.wikipedia.org/wiki/Logic_level
เมลส์

3
@Mels +/- 5V ไม่ใช่ TTL, TTL ไม่ลงไปที่ Ground นี่คือ RS-232
nmz787

9

มีเคล็ดลับเรียบร้อยที่คุณสามารถทำได้หากการสื่อสารเป็นไปในทิศทางเดียวเท่านั้นในแต่ละครั้ง (เช่นการสื่อสารแบบ half-duplex) มันจะไม่ทำงานถ้าทั้งสองฝ่ายคุยกันในเวลาเดียวกัน (full duplex) แต่ถ้าเป็นเรื่องปกติของคุณ "ทำสิ่งนี้" "ตกลงนี่คือคำตอบ" "ตอนนี้ทำสิ่งนี้" "ตกลงนี่คือการตอบสนองใหม่" ประเภทการสื่อสาร มันใช้งานได้ค่อนข้างดี

เนื่องจากลิงก์ UART ใช้สภาพที่ไม่ได้ใช้งานของเครื่องส่งสัญญาณในระดับตรรกะสูง (1) คุณจะต้องใช้ 2-input AND gate และเชื่อมต่อ TX จากแต่ละด้านเข้ากับ AND ผลลัพธ์ของเกท AND คืออินพุตของคุณไปยัง UART ของดมกลิ่น (คือ RX pin) ตอนนี้ใช้สาย TX ของอุปกรณ์ B และนำไปยังพอร์ต I / O บนดมกลิ่น คุณจะกำหนดค่าดมกลิ่นเพื่อสร้างการขัดจังหวะเมื่อพินนี้ไปจากสูงไปต่ำ

ในการสรุป: อุปกรณ์ A UART TX -> AND อินพุตเกต อุปกรณ์ B UART TX -> อื่น ๆ และอินพุตเกทและดมกลิ่น GPIO เอาต์พุตของ AND gate -> บรรทัดดมกลิ่น UART RX

การสื่อสาร UART ประกอบด้วยบิตเริ่มต้นบิตข้อมูลจำนวนหนึ่งบิตพาริตี้เสริมและบิตหยุดหนึ่งบิตขึ้นไป เนื่องจากสถานะว่างเป็นลอจิกสูง (1) การเริ่มต้นของทุก ๆ ไบต์จะเป็นลอจิกต่ำ (0) และการขัดจังหวะบนดมกลิ่นจะเริ่มขึ้น ในขณะที่ดมกลิ่นของคุณกำลังดำเนินการขัดจังหวะ I / O ฮาร์ดแวร์ UART จะรวบรวมบิตจากประตูและ เมื่อถึงเวลาที่ UART ได้รับบิตหยุดการขัดจังหวะ I / O จะเสร็จสิ้นนานและการขัดจังหวะโดย UART RX จะเริ่มขึ้น

รูทีน interrupt-on-IO-change จะตั้งค่าตัวแปร "direction" เพื่อระบุว่าการสื่อสารอยู่ในทิศทาง "B-> A" UART ของ sniffer ที่ได้รับอินเตอร์รัปต์จะดูที่ตัวแปร "direction" นี้และเขียนไบต์ที่เพิ่งได้รับไปยังบัฟเฟอร์ที่เหมาะสม การขัดจังหวะ UART RX จะตั้งค่าตัวแปร "direction" กลับไปเป็นสถานะ "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 กำลังพูดสาย I / O ไม่ขยับ (มันยังคงอยู่ที่ตรรกะ '1' เนื่องจากอุปกรณ์ส่งสัญญาณ UART ของอุปกรณ์ B ไม่ได้ใช้งาน) และการขัดจังหวะ UART RX จะได้รับไบต์ดูว่าทิศทางคือ A-> B และเก็บข้อมูลไว้ในบัฟเฟอร์นั้น เมื่ออุปกรณ์ B กำลังพูดสาย I / O จะลดลงทันทีที่อุปกรณ์ B เริ่มขยับข้อมูลออกและรูทีนการขัดจังหวะ I / O จะกำหนดทิศทางเพื่อระบุว่าอุปกรณ์ B กำลังพูดถึง การขัดจังหวะของ UART RX จะเริ่มขึ้นในที่สุดหลังจากรวบรวมบิตทั้งหมดและเนื่องจาก I / O ขัดจังหวะได้รับการดูแลการตั้งค่าทิศทางการลงทะเบียนอย่างเหมาะสมไบต์ที่ได้รับจะถูกเก็บไว้ในบัฟเฟอร์ที่ถูกต้อง

Presto: การสื่อสารฮาล์ฟดูเพล็กซ์ระหว่างอุปกรณ์สองเครื่องที่จับด้วยสาย UART และ I / O เดี่ยวบนดมกลิ่นโดยไม่มีการสื่อสาร UART แบบกระแทกเล็กน้อย


ที่น่าสนใจ นี่เป็นการผลักดันขีด จำกัด ของความเข้าใจของฉัน แต่มันยอดเยี่ยมมาก! ส่วนหนึ่งที่ฉันไม่เข้าใจคือการเชื่อมต่อ UART ของดมกลิ่นกับเป้าหมายเพื่อให้สามารถดักจับทั้งสองทิศทางของการสื่อสารได้อย่างไร ฉันมีพิน I / O หลายตัวฉันสามารถใช้พิน I / O สองอันโดยใช้วิธีนี้และรวบรวมทั้งสองทิศทางของการรับส่งข้อมูลได้อย่างมีประสิทธิภาพหรือไม่
แบรดไฮน์

บรรทัดดมกลิ่น UART RX เชื่อมต่อกับเอาต์พุตของเกต AND UART TX ของอุปกรณ์ A เชื่อมต่อกับอินพุตหนึ่งของเกท AND และอุปกรณ์ B ของเท็กซัสเชื่อมต่อกับอินพุตอื่นของเกต AND เนื่องจากสภาพว่าง (ไม่มีการรับส่งข้อมูล) ของ UART เป็นตรรกะ '1' ประตู AND จะรวมสัญญาณทั้งสองเข้าด้วยกันอย่างมีประสิทธิภาพ บรรทัด I / O บน sniffer ใช้เพื่อตรวจจับบิตเริ่มต้นของอุปกรณ์ B เพื่อให้สามารถรับไบต์ที่ได้รับบน UART และวางไว้ในบัฟเฟอร์ที่เหมาะสม (ปริมาณการใช้งานอุปกรณ์หรือปริมาณอุปกรณ์ B)
akohlsmith

ส่วนของรหัสและการเดินสายของประตู AND ช่วยให้ผู้ดมกลิ่นสามารถบันทึกทั้งสองทิศทางของการไหลของการจราจรด้วย UART เดียว ใช้งานได้หากการรับส่งข้อมูลเป็นฮาล์ฟดูเพล็กซ์ นั่นหมายความว่าเมื่ออุปกรณ์หนึ่งกำลังพูดถึงอีกอุปกรณ์หนึ่งกำลังฟัง หากทั้งคู่คุยกันในเวลาเดียวกัน (ฟูลดูเพล็กซ์) นี่จะไม่ทำงานเลย
akohlsmith

5

คุณไม่ต้องติดหมุดส่งสัญญาณของ AVR เข้ากับวงจรของคุณ เพียงเชื่อมต่อสายรับกับครึ่งหนึ่งของลิงค์ที่มีอยู่ที่คุณต้องการดักฟัง หาก AVR เฉพาะของคุณมีพอร์ตอนุกรมสองพอร์ตคุณควรจะสามารถสอดแนมทั้งสองส่วนของลิงก์ที่มีอยู่ในเวลาเดียวกัน คุณเพียงแค่ต้องทำการตั้งค่าพอร์ตให้ตรงกับอัตรา baud ที่มีอยู่หยุดบิตเป็นต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.