อนุกรม TTL ทำงานอย่างไร


15

ฉันพยายามค้นหาคำอธิบายที่ดีของอนุกรม TTL "มาตรฐาน" โดยไม่มีโชคมาก ฉันเข้าใจว่าการส่งสัญญาณแบบอนุกรม (TX) และรับ (RX) สายไม่ได้ใช้งานสูง (ที่ VCC) และพวกเขาลดลงถึงพื้นเมื่อส่งบิต เช่นนี้พวกเขากลับด้านจากบรรทัดฐานที่ "1" สูงและ "0" ต่ำ

สิ่งที่ฉันไม่เข้าใจคือผู้ที่รับผิดชอบในการถือสายสูงและวิธีการส่งเป็นศูนย์ ผู้ส่งขับสายไปที่สูงหรือต่ำหรือไม่? หรือผู้รับรับสายสูงด้วยผู้ส่งดึงสายต่ำ (เปิดสะสม)?


อ่านคำตอบของ Joby เห็นได้ชัดว่าทุกสิ่งที่ฉันคิดว่าฉันรู้คือคว่ำ :-)
blalor

Real RS232 เป็นวิธีอื่น ๆ รอบ ๆ 0 = 12v, 1 = -12v, นั่นเป็นสาเหตุที่ทำให้เกิดความสับสน
Toby Jaffey

2
จุดคำศัพท์: "อนุกรม TTL" เป็นคำที่กว้างเกินไป "ซีเรียลแบบอะซิงโครนัส (จากจุดหนึ่งไปยังอีกจุด) (ที่ระดับ TTL)" ดูเหมือนจะเป็นสิ่งที่คุณกำลังถาม (แม้ว่ามันอาจจะยังขาดอยู่ แต่อย่างน้อยก็ดีกว่า)
นิค T

3
@ Nick ชนิด OP หมายถึงคือสิ่งที่จะป้อนเข้า MAX232 ที่ฉันจะเรียกว่า "RS232 ในระดับ TTL"
Toby Jaffey

2
@Joby - ถ้าเขาใช้เพียง Tx และ Rx และคุณลบระดับของมันออกไปก็ไม่มีอะไรที่เกี่ยวกับเรื่องนี้อีกต่อไป! เรียกว่า UART
stevenvh

คำตอบ:


17

ด้วยอนุกรม TTL มีสองบรรทัดข้อมูลทิศทางเดียว แต่ละคนถูกขับเคลื่อนโดยผู้ส่งทั้งสูงและต่ำ 0 บิตจะถูกแทนด้วย 0V ต่อ 1 บิตโดย VCC

ควรตั้งพินของผู้รับเป็นอินพุต

ดังนั้นสำหรับไมโครคอนโทรลเลอร์เพื่อส่งไบต์ (8-N-1 ไม่มีการควบคุมการไหล) มันสามารถทำสิ่งนี้:

#define BAUDRATE 9600
#define DELAY (SYS_CLK/BAUDRATE)

#define UART_BITBANG_OFF     UART_BITBANG_PORT |= _BV(UART_BITBANG_PIN)
#define UART_BITBANG_ON      UART_BITBANG_PORT &= ~ _BV(UART_BITBANG_PIN)

#define UART_BITBANG_BIT(bit) {if (bit) UART_BITBANG_ON; else UART_BITBANG_OFF; _delay_us(DELAY);}

void uart_bitbang_init(void)
{
    UART_BITBANG_DDR &= ~ _BV(UART_BITBANG_PIN);        // TX output
}

void uart_bitbang_putc(uint8_t c)
{
    UART_BITBANG_BIT(1)
    UART_BITBANG_BIT((c & 0x1) == 0);
    UART_BITBANG_BIT((c & 0x2) == 0);
    UART_BITBANG_BIT((c & 0x4) == 0);
    UART_BITBANG_BIT((c & 0x8) == 0);
    UART_BITBANG_BIT((c & 0x10) == 0);
    UART_BITBANG_BIT((c & 0x20) == 0);
    UART_BITBANG_BIT((c & 0x40) == 0);
    UART_BITBANG_BIT((c & 0x80) == 0);
    UART_BITBANG_BIT(0);
}

(รหัสนี้อ่านย้อนหลังได้เล็กน้อยเนื่องจากเดิมใช้สำหรับซีเรียล TTL แบบกลับด้าน)

แน่นอน MCUs ส่วนใหญ่มี UART ฮาร์ดแวร์ซึ่งทำสิ่งนี้ให้คุณ

นี่คือสิ่งที่คุณจะเห็นในขอบเขต:

https://www.pololu.com/docs/0J25/4.a

นี่คือวิดีโอยอดเยี่ยมจาก ladyada ที่อธิบายลำดับ: http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/


ขอบคุณ Joby ดังนั้นแม้ว่าบรรทัดจะว่างสูง แต่ 0 บิตยังคงเป็น 0v โดยทั่วไปแล้วตัวรับสัญญาณจะมี pull-up ภายในบนสาย RX เพื่อที่จะไม่ลอย
blalor

@blalor เส้นจะไม่ลอยผู้ส่งคือการขับรถมัน (สมมติว่าปลายทั้งสองมีการเชื่อมต่อ)
Toby Jaffey

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

1
ค่อนข้างอวดรู้ แต่ไม่ใช่ "TTL" แค่บอกเป็นนัย ๆ ถึงระดับ? คุณอธิบายถึงการเชื่อมต่อแบบอนุกรมจากจุดหนึ่งไปยังอีกจุดหนึ่ง แต่มันอาจจะเป็นโทโพโลยีแบบหลายต้นแบบพร้อมกับไดรเวอร์ตัวสะสมแบบเปิดและ pullup (เช่น LIN แต่ด้วยระดับ TTL) "TTL อนุกรม" ดูเหมือนว่าไม่น่าเชื่อคำกว้างที่เกือบจะไร้ประโยชน์โดยไม่มีบริบทบางอย่าง
Nick T

1
มันเป็นเพียงอินเตอร์เฟสพอร์ตอนุกรมมาตรฐานที่ถอดตัวแปลงแรงดันไฟฟ้าออก
starblue

8

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

ป้อนคำอธิบายรูปภาพที่นี่

P-MOSFET จะให้ระดับสูง, N-MOSFET ในระดับต่ำ หนึ่งในนั้นต้องแอ็คทีฟไม่เช่นนั้นระดับบรรทัดจะลอยและไม่ถูกกำหนด (หรือกำหนดโดยโหลดในตัวรับส่งสัญญาณ) ทั้งสองสามารถแหล่งที่มา / จมบางส่วนในปัจจุบันและจะดึงสายไปยังรางดังนั้นรูปร่างของสัญญาณจะเกือบจะเหมาะ
ซึ่งจะแตกต่างกันถ้ามันเป็น TTL จริง ๆ ในคำถามของคุณ (ไมโครคอนโทรลเลอร์คือ HCMOS) เอาต์พุต TTL มีความไม่สมดุลสูงสามารถจ่ายกระแสได้เพียงเล็กน้อยเท่านั้นซึ่งโดยทั่วไปแล้วจะเป็น 0.4mA กำลังจมปัจจุบันตกลงที่ 8mA กระแสต่ำแหล่งที่มาอาจมีปัญหาถ้าบรรทัดมีความจุสูงและความเร็วสูง กระแสไดรฟ์ต่ำหมายความว่าความจุจะชาร์จค่อนข้างช้าและขอบที่เพิ่มขึ้นจะช้าซึ่งด้วยความเร็วสูงอาจทำให้สัญญาณผิดเพี้ยนอย่างรุนแรง TTL ไม่เคยใช้สิ่งนี้

คำถามของคุณอาจอ้างถึงสาย multidropซึ่งอุปกรณ์หลายตัวสามารถพูดคุยได้ ในกรณีนั้นคุณไม่สามารถใช้เอาต์พุตพุชพูล: หากอุปกรณ์ตัวใดตัวหนึ่งต้องขับสายสูงในขณะที่อีกตัวหนึ่งขับต่ำเราจะมีไฟฟ้าลัดวงจร เส้น Multidrop มักใช้ตัวต้านทานแบบดึงขึ้นเพื่อให้สายไม่ได้ทำงานสูง จากนั้นในระดับต่ำเท่านั้นที่ต้องมีการขับรถบรรทัดและแทนที่จะเป็นเอาท์พุทแบบดึง - ดึงเราจะมีท่อระบายน้ำแบบเปิดที่มีเพียง N-MOSFET ขณะนี้ไลน์ดังกล่าวได้รับการขับเคลื่อนแบบไม่สมมาตร: ตัวต้านทานแบบดึงขึ้นสามารถส่งกระแสได้เพียงเล็กน้อยในขณะที่ FET แบบเลื่อนลงสามารถขับเคลื่อนสายได้อย่างรวดเร็วจนถึงพื้นดิน สาย multidrop ความเร็วสูงวางข้อ จำกัด สำหรับตัวต้านทานแบบดึงขึ้น ตัวอย่างคือ I2C


"ความแพร่หลาย แต่ลงวันที่ MAX232 (ปัจจุบันมีวิธีแก้ปัญหาที่ดีกว่ามาก)" คุณยกตัวอย่างได้บ้างไหม?
m.Alin

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