TTL串口如何工作?

电器工程 微控制器 串行 ttl
2022-01-13 05:37:50

我一直在尝试找到对 TTL 串行“标准”的良好描述,但运气不佳。我知道串行发送 (TX) 和接收 (RX) 线空闲高(在 VCC),并且当发送一个位时它们会下降到地。因此,它们与标准相反,其中“1”为高,“0”为低。

我不明白谁负责将线保持在高位以及如何传输零。发件人是否将线路驱动到高位和低位?还是接收器将线路保持在高位,而发送器将线路拉低(集电极开路)?

2个回答

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 串行的)

当然,大多数 MCU 都有硬件 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/

您并没有说太多,但是“空闲高”表明您的意思是UART。UART点对点连接到线路收发器,例如无处不在但过时的 MAX232(现在有更好的解决方案)。微控制器和收发器之间的线路也会很短;如果有要桥接的距离,它将在收发器之间。
控制器的输出是推挽式的。

在此处输入图像描述

P-MOSFET 将提供高电平,N-MOSFET 将提供低电平。其中之一必须处于活动状态,否则线路电平将浮动且未定义(或由收发器中的负载定义)。两者都能够提供/吸收一些电流并将线路拉到轨道上,因此信号形状几乎是理想的。
如果它真的是TTL,那会有所不同,就像你的问题一样(微控制器是HCMOS)。TTL 输出高度不对称:它们只能提供很小的电流,通常为 0.4mA。灌电流还可以,为 8mA。如果线路具有高电容且高速,则低源电流可能是一个问题。低驱动电流意味着电容的充电速度会比较慢,上升沿会很慢,在高速下可能会导致严重的信号失真。TTL 从未用于此目的。

您的问题也可能涉及多点线路,其中多个设备可以通话。在这种情况下,您不能使用推挽输出:如果一个设备将线路驱动为高电平,而另一个设备将其驱动为低电平,我们将发生短路。多点线路几乎总是使用上拉电阻来保持线路空闲高。然后只有低电平需要驱动线路,而不是推挽输出,我们将有一个漏极开路,只有 N-MOSFET。线路现在也被不对称驱动:上拉电阻器只能提供很小的电流,而下拉 FET 可以将线路快速驱动到地。因此,高速多点线路限制了上拉电阻。一个例子是 I2C。