TTL 시리얼은 어떻게 작동합니까?


15

TTL 시리얼 "표준"에 대한 좋은 설명을 찾기 위해 노력하고 있습니다. 직렬 전송 (TX) 및 수신 (RX) 회선이 유휴 상태가 높고 (VCC에서) 비트가 전송 될 때 접지로 떨어짐을 이해합니다. 따라서 "1"이 높고 "0"이 낮은 표준과 반대입니다.

내가 이해하지 못하는 것은 누가 회선을 높게 유지하고 누가 0이 전송되는지를 책임집니다. 발신자가 회선을 높고 낮게 설정합니까? 또는 발신자가 회선을 낮게 당겨서 (수신기 수집기) 수신자가 회선을 높게 유지합니까?


Joby의 답변을 읽으십시오. 내가 알고 있다고 생각한 모든 것이 거꾸로 된 것 같습니다. :-)
blalor

실제 RS232는 0 = 12v, 1 = -12v 주위의 다른 방법입니다. 그래서 혼동되는 이유
Toby Jaffey

2
용어 설명 : "TTL 직렬"은 심각하게 과장된 용어입니다. "(TTL 수준에서) 비동기 직렬 (TTL 수준)"은 여러분이 요구하는 것 같습니다. (아마도 여전히 부족하지만 적어도 더 나을 것입니다)
Nick T

3
@Nick OP가 의미하는 것은 MAX232에 공급되는 것입니다. "TTL 레벨의 RS232"라고
부르겠습니다

2
@Joby-Tx와 Rx 만 사용하고 레벨도 제거하면 더 이상 RS232가 없습니다! 그것을 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 직렬을위한 것이기 때문에 약간 뒤로 읽습니다)

물론 대부분의 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 줄이 뜨지 않습니다, 발신자가 그것을 운전하고 있습니다 (양끝이 연결되어 있다고 가정)
Toby Jaffey

Arduino의 NewSoftSerial은 RX 핀에서 AVR의 내부 풀업을 가능하게합니다. 나는이 가정 되어 부착 보낸 사람이없는 경우 필요합니다. 정보 및 추가 된 Adafruit 링크에 감사드립니다.
blalor

1
다소 비관적이지만 "TTL"이 단지 레벨을 의미하지는 않습니까? 포인트-투-포인트 직렬 링크를 설명하지만 오픈 콜렉터 드라이버 및 풀업 (LIN과 같은 TTL 레벨의)이있는 다중 마스터 토폴로지 일 수 있습니까? "TTL serial"은 문맥이 없으면 거의 쓸모없는 엄청나게 넓은 용어 처럼 보입니다 .
Nick T

1
전압 변환기가 제거 된 표준 직렬 포트 인터페이스 일뿐입니다.
starblue

8

많은 말로 말하지는 않지만 "유휴 높음"은 UART를 의미합니다. UART는 유비쿼터스이지만 최신 MAX232와 같이 라인 트랜시버에 지점 간 연결되어 있습니다 (현재는 훨씬 더 나은 솔루션이 있습니다). 마이크로 컨트롤러와 트랜시버 사이의 연결선도 짧습니다. 브리지 할 거리가 있으면 트랜시버 사이에 있습니다.
컨트롤러의 출력은 푸시 풀입니다.

여기에 이미지 설명을 입력하십시오

P-MOSFET은 하이 레벨을 제공하고 N-MOSFET은 로우 레벨을 제공합니다. 이들 중 하나가 활성화되어 있거나 라인 레벨이 플로팅되어 정의되지 않았거나 트랜시버의로드에 의해 정의되어야합니다. 둘 다 전류를 소싱 / 싱킹 할 수 있고 라인을 레일로 끌어 당기므로 신호 형태가 거의 이상적입니다.
귀하의 질문 (마이크로 컨트롤러는 HCMOS)에서와 같이 실제로 TTL 인 경우에는 다릅니다. TTL 출력은 매우 비대칭 적입니다. 일반적으로 0.4mA의 작은 전류 만 공급할 수 있습니다. 싱킹 전류는 8mA에서 정상입니다. 라인의 커패시턴스가 높고 고속 인 경우 낮은 소스 전류가 문제가 될 수 있습니다. 낮은 구동 전류는 커패시턴스가 상대적으로 느리게 충전되고 상승 에지가 느려서 고속에서 심각한 신호 왜곡을 유발할 수 있음을 의미합니다. 이를 위해 TTL이 사용되지 않습니다.

귀하의 질문은 여러 장치가 대화 할 수 있는 멀티 드롭 라인 을 나타낼 수도 있습니다. 이 경우 푸시 풀 출력을 사용할 수 없습니다. 한 장치는 라인을 높이고 다른 장치는 줄을 높이면 단락됩니다. 멀티 드롭 라인은 거의 항상 풀업 저항을 사용하여 라인을 유휴 상태로 유지합니다. 그러면 로우 레벨 만이 라인 구동이 필요하며 푸시 풀 출력 대신 N-MOSFET만으로 오픈 드레인이 발생합니다. 이 라인은 이제 비대칭 적으로 구동됩니다. 풀업 저항은 전류를 거의 공급할 수없고 풀다운 FET는 라인을 빠르게 접지로 구동 할 수 있습니다. 따라서 고속 멀티 드롭 라인은 풀업 저항을 제한합니다. 예는 I2C입니다.


"유비쿼터스이지만 날짜는 MAX232 (현재 훨씬 더 나은 솔루션이 있습니다)"몇 가지 예를 들어 주시겠습니까?
m.Alin

3
@ m.Alin- Maxim은 "단일 공급 장치가 수년에 걸쳐 크게 개선되었다는 사실에도 불구하고 많은 보드 설계자들이 오늘날 MAX232를 사용하고있다"고 말했다. 트랜시버 목록
stevenvh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.