TTLシリアルはどのように機能しますか?


15

私はTTLシリアル「標準」の良い説明をあまり運なしに見つけようとしてきました。シリアル送信(TX)および受信(RX)ラインはアイドル状態(VCC)であり、ビットが送信されるとグランドに落ちることを理解しています。そのため、「1」が高く、「0」が低い標準から反転しています。

私が理解していないのは、誰が回線を高く保持する責任があり、ゼロがどのように送信されるかです。送信者は回線を高低に駆動しますか?または、レシーバーはラインをハイに保ち、センダーはラインをローに維持しますか(オープンコレクター)?


Jobyの答えを読んでください。どうやら私が知っていたと思っていたすべてが逆になったようです。:-)
blalor

本物のRS232は、0 = 12v、1 = -12vの周りの別の方法です。それが混乱の
原因です

2
用語のポイント:「TTLシリアル」は非常に広義の用語であり、「(ポイントツーポイント)非同期シリアル(TTLレベルで)」はあなたが求めているもののようです。(それでもまだ足りないかもしれませんが、少なくともより良い)
ニックT

3
OP手段がMAX232に供給されているものの種類を@Nick、私は「TTLレベルでRS232」のことを呼びたい
トビーJaffey

2
@Joby-彼がTxとRxのみを使用し、そのレベルも削除する場合、RS232はもう何もありません!それをUARTと呼びます。
-stevenvh

回答:


17

TTLシリアルには、2つの単方向データ回線があります。それぞれは、高低両方の送信者によって駆動されます。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/


ありがとう、ジョビー。そのため、ラインがハイにアイドル状態であっても、0ビットは依然として0vです。通常、レシーバーはRXラインに内部プルアップを備えているため、フローティングしませんか?
-blalor

@blalor回線はフロートしない、送信者はそれを駆動している(両端が接続されていると仮定)
トビージャフィー

ArduinoのNewSoftSerialは、RXピンでAVRの内部プルアップを有効にします。送信者が添付されていない場合、これ必要だと思います。情報と追加されたAdafruitリンクをありがとう。
-blalor

1
多少つまらないものですが、「TTL」は単にレベルを意味するのではありませんか?ポイントツーポイントシリアルリンクについて説明しますが、オープンコレクタードライバーとプルアップ(LINのようなTTLレベル)を備えたマルチマスタートポロジにすることもできますか?「TTLシリアル」は、文脈がなければほとんど役に立たない信じられないほど広い用語のようです。
ニックT

1
これは、電圧コンバータを取り除いた標準のシリアルポートインターフェイスです。
スターブルー

8

あまり多くの言葉で言うことはありませんが、「アイドルハイ」はUARTを意味することを示唆しています。UARTは、ユビキタスではあるが日付の古いMAX232のように、ライントランシーバーに接続されたポイントツーポイントです(現在、はるかに優れたソリューションがあります)。マイクロコントローラーとトランシーバー間の回線も短くなります。ブリッジする距離がある場合は、トランシーバー間です。
コントローラーの出力はプッシュプルです。

ここに画像の説明を入力してください

P-MOSFETは高レベルを提供し、N-MOSFETは低レベルを提供します。それらの1つがアクティブであるか、回線レベルがフロートして未定義(またはトランシーバーの負荷によって定義)になる必要があります。どちらもある程度の電流をソース/シンクすることができ、ラインをレールに引き寄せるので、信号形状はほぼ理想的です。
あなたの質問のように、それが本当にTTLである場合、これは異なります(マイクロコントローラはHCMOSです)。TTL出力は非常に非対称です。通常、わずか0.4mAの電流しか供給できません。シンク電流は8mAでOKです。ラインの静電容量が大きく高速の場合、低ソース電流が問題になることがあります。駆動電流が小さいということは、静電容量が比較的ゆっくりと充電されるだけで、立ち上がりエッジが遅くなり、高速では深刻な信号歪みが発生する可能性があることを意味します。TTLはこれには使用されません。

あなたの質問は、複数のデバイスが会話できるマルチドロップ回線にも言及しています。その場合、プッシュプル出力を使用できません。あるデバイスがラインをハイに駆動し、別のデバイスがラインをローに駆動すると、短絡が発生します。マルチドロップラインは、ほとんどの場合、プルアップ抵抗を使用してラインをアイドル状態に保ちます。次に、ラインを駆動する必要があるのは低レベルのみであり、プッシュプル出力の代わりに、N-MOSFETだけでオープンドレインができます。ラインは非対称に駆動されるようになりました。プルアップ抵抗はわずかな電流しか供給できませんが、プルダウンFETはラインを高速でグランドに駆動できます。したがって、高速マルチドロップラインでは、プルアップ抵抗に制限があります。例はI2Cです。


「ユビキタスだが時代遅れのMAX232(最近でははるかに優れたソリューションがあります)」いくつか例を挙げていただけますか?
m。アリン

3
@ m.Alin- マキシムは言います:「多くのボード設計者は、単電源デバイスが長年にわたって大幅に改善されたという事実にもかかわらず、今日でもMAX232を使用しています。」トランシーバーのリスト
-stevenvh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.