Làm thế nào để nối tiếp TTL làm việc?


15

Tôi đã cố gắng tìm một mô tả hay về "tiêu chuẩn" nối tiếp TTL mà không gặp nhiều may mắn. Tôi hiểu rằng các đường truyền nối tiếp (TX) và nhận (RX) không hoạt động ở mức cao (tại VCC) và chúng sẽ rơi xuống đất khi truyền một bit. Như vậy, chúng bị đảo ngược khỏi định mức, trong đó "1" cao và "0" thấp.

Điều tôi không hiểu là ai chịu trách nhiệm giữ dòng cao và cách truyền số 0. Người gửi có lái dòng lên cao và thấp không? Hoặc người nhận giữ dòng cao với người gửi kéo dòng thấp (bộ thu mở)?


Đọc câu trả lời của Joby; rõ ràng tất cả mọi thứ tôi nghĩ rằng tôi biết là đảo ngược. :-)
blalor

Real RS232 là cách khác khoảng 0 = 12 v, 1 = -12v, đó là lý do tại sao nó khó hiểu
Toby Jaffey

2
Điểm thuật ngữ: "Nối tiếp TTL" là một thuật ngữ quá rộng, "nối tiếp không đồng bộ (điểm-điểm) (ở cấp độ TTL)" dường như là những gì bạn đang hỏi về. (Mặc dù điều đó có lẽ vẫn còn thiếu, nhưng ít nhất là tốt hơn)
Nick T

3
@Nick Loại OP có nghĩa là bất cứ thứ gì được đưa vào
MAX 232

2
@Joby - Nếu anh ta chỉ sử dụng Tx và Rx, và bạn cũng loại bỏ các cấp độ của nó, thì không còn gì nữa về nó! Gọi nó là UART.
stevenvh

Câu trả lời:


17

Với nối tiếp TTL, có hai dòng dữ liệu đơn hướng. Mỗi được điều khiển bởi người gửi, cả cao và thấp. Một bit 0 được biểu thị bằng 0V một bit bởi VCC.

Pin của người nhận nên được đặt thành đầu vào.

Vì vậy, để một vi điều khiển gửi một byte (8-N-1 không có điều khiển luồng), nó có thể làm một cái gì đó như thế này:

#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);
}

(Mã này đọc ngược một chút vì ban đầu nó có nghĩa là nối tiếp TTL đảo ngược)

Tất nhiên, hầu hết các MCU đều có UART phần cứng làm tất cả điều này cho bạn.

Đây là những gì bạn thấy trên một phạm vi:

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

Đây là một video tuyệt vời từ ladyada giải thích nối tiếp: http : //www.adafbean.com/blog/2010/09/15/usb-serial-and-you-video-an-adafbean-after-school-special/


Cảm ơn, việc làm. Vì vậy, mặc dù dòng không hoạt động cao, 0 bit vẫn là 0v. Có phải máy thu thường có một pull-up bên trong trên dòng RX, để nó không nổi?
blalor

@blalor dòng sẽ không nổi, người gửi đang lái nó (giả sử cả hai đầu được kết nối)
Toby Jaffey

NewSoftSerial của Arduino cho phép kéo lên bên trong của chân cắm trên chân RX. Tôi cho rằng điều này bắt buộc nếu không có người gửi đính kèm. Cảm ơn thông tin và liên kết Adaf nhung đã thêm.
blalor

1
Là một số ít phạm vi, nhưng không "TTL" chỉ ngụ ý cấp độ? Bạn mô tả một liên kết nối tiếp điểm-điểm, nhưng nó cũng có thể là một cấu trúc liên kết đa chủ với trình điều khiển bộ thu mở và một pullup (như LIN nhưng với mức độ TTL)? "Nối tiếp TTL" có vẻ như là một thuật ngữ cực kỳ rộng mà gần như vô dụng nếu không có ngữ cảnh.
Nick T

1
Nó chỉ là giao diện cổng nối tiếp tiêu chuẩn với các bộ chuyển đổi điện áp được loại bỏ.
starblue

8

Bạn không nói bằng nhiều từ, nhưng "nhàn rỗi cao" cho thấy bạn có nghĩa là một UART. UARTs một điểm-điểm được kết nối với các bộ thu phát đường truyền, như phổ biến nhưng có niên đại MAX 232 (ngày nay có nhiều giải pháp tốt hơn). Dòng giữa vi điều khiển và thu phát cũng sẽ ngắn; nếu có khoảng cách được bắc cầu thì nó sẽ nằm giữa các máy thu phát.
Đầu ra của bộ điều khiển là một lực đẩy.

nhập mô tả hình ảnh ở đây

P-MOSFET sẽ cung cấp mức cao, N-MOSFET ở mức thấp. Một trong số chúng phải hoạt động hoặc mức dòng sẽ nổi và không được xác định (hoặc được xác định bởi tải trong bộ thu phát). Cả hai đều có thể nguồn / chìm một số dòng điện và sẽ kéo đường dây đến đường ray, vì vậy hình dạng tín hiệu sẽ gần như là lý tưởng.
Sẽ khác nếu nó thực sự là TTL, như trong câu hỏi của bạn (vi điều khiển là HCMOS). Đầu ra TTL rất bất đối xứng: chúng chỉ có thể cung cấp dòng điện nhỏ, thường là 0,4mA. Dòng chìm là OK, ở 8mA. Dòng nguồn thấp có thể là một vấn đề nếu dòng có điện dung cao và tốc độ cao. Dòng điện thấp có nghĩa là điện dung sẽ chỉ sạc tương đối chậm, và các cạnh tăng sẽ chậm, ở tốc độ cao có thể gây ra sự biến dạng tín hiệu nghiêm trọng. TTL không bao giờ được sử dụng cho việc này.

Câu hỏi của bạn cũng có thể đề cập đến một dòng đa hướng , trong đó một số thiết bị có thể nói chuyện. Trong trường hợp đó, bạn không thể sử dụng đầu ra kéo đẩy: nếu một thiết bị sẽ điều khiển dòng cao trong khi một thiết bị khác ở mức thấp thì chúng ta sẽ bị đoản mạch. Các đường đa hướng hầu như luôn luôn sử dụng điện trở kéo lên để giữ cho đường dây ở mức cao. Sau đó, chỉ cần một mức độ thấp yêu cầu lái xe đường dây, và thay vì đầu ra kéo đẩy, chúng ta sẽ có một cống mở, chỉ với N-MOSFET. Đường dây bây giờ cũng được điều khiển không đối xứng: điện trở kéo lên chỉ có thể cung cấp dòng điện nhỏ, trong khi FET kéo xuống có thể điều khiển đường dây nhanh xuống đất. Do đó, các đường đa hướng tốc độ cao đặt giới hạn cho các điện trở kéo lên. Một ví dụ là I2C.


"phổ biến nhưng ngày MAX 232 (ngày nay có nhiều giải pháp tốt hơn)" Bạn có thể đưa ra một số ví dụ?
m.Alin

3
@ m.Alin - Nói Maxim : "Nhiều nhà thiết kế bảng vẫn sử dụng MAX 232 ngày nay, mặc dù thực tế là các thiết bị cung cấp đơn lẻ đã trải qua những cải tiến lớn trong nhiều năm qua." Danh sách các máy thu phát
stevenvh
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.