610 likes | 954 Views
8051 직렬포트. 순천향대학교 정보기술공학부 이상정. 개 요. 4 가지의 동작 모드를 갖는 전이중 (full-duplex) 통신방식 의 직렬 포트 송신부와 수신부는 각각 2 중 버퍼 (double buffer) 로 구성 수신의 경우 CPU 가 먼저 수신된 데이터를 읽어가기 전에라도 다음 데이터를 수신하는 동작이 가능 송신 및 수신 데이터 버퍼로는 SBUF 가 사용 송신시에는 CPU 가 송신할 데이터를 SBUF 에 라이트하면 이는 곧바로 직렬 포트의 송신 레지스터에 로드되고 ,
E N D
8051 직렬포트 순천향대학교 정보기술공학부 이상정
개 요 • 4가지의 동작 모드를 갖는 전이중(full-duplex) 통신방식의 직렬 포트 • 송신부와 수신부는 각각 2중 버퍼(double buffer)로 구성 • 수신의 경우 CPU가 먼저 수신된 데이터를 읽어가기 전에라도 다음 데이터를 수신하는 동작이 가능 • 송신 및 수신 데이터 버퍼로는 SBUF가 사용 • 송신시에는 CPU가 송신할 데이터를 SBUF에 라이트하면 이는 곧바로 직렬 포트의 송신 레지스터에 로드되고, • CPU가 SBUF를 리드하면 수신 레지스터가 읽혀진다. 순천향대학교 정보기술공학부 이 상 정 2
P.190 그림 8.10 순천향대학교 정보기술공학부 이 상 정 3
SCON 레지스터 • Serial Port Control Register 순천향대학교 정보기술공학부 이 상 정 4
SCON 레지스터 • TI 및 RI 비트 • 각각 1문자의 송신이 완료되어 송신부가 비거나(empty) • 1문자가 수신되어 수신부가 차게 되면(full) 1로 세트되어 인터럽트를 발생시키는 플래그 • TB8 및 RB8 비트 • 모드 2와 모드 3의 11비트 프레임에서 9번째 데이터 비트를 표시 • 모드 1이고 SM2=0인 경우 RB8은 스톱비트 저장 • SM0∼SM1 비트는 직렬 포트의 동작 모드를 설정 순천향대학교 정보기술공학부 이 상 정 5
SCON 레지스터 • SM2 비트 • 1로 설정하면 모드 2와 모드 3에서 9번째 비트가 RB8=1로 수신되었을 경우에만 직렬 포트 인터럽트가 발생되고 RB8=0인 경우에는 인터럽트가 발생되지 않는다. • 모드 1에서 SM2=1로 설정하면 데이터 비트에 이어서 스톱 비트가 올바르게 수신된 경우에만 인터럽트가 발생한다. • 예: MOV SCON, #52H ; 01010010B • SM0 SM1 = 01 : 모드 1, SM2 = 0 • REN =1 : receive enable • TI = 1 : transmit interrupt flag 순천향대학교 정보기술공학부 이 상 정 6
PCON 레지스터 • Power Control Register 순천향대학교 정보기술공학부 이 상 정 7
PCON 레지스터 • 보레이트(baud rate) 발생기로 타이머 1을 사용하는 경우에는 SMOD 비트를 사용하여 보레이트를 2배 높게 설정 • 직렬 포트의 동작 모드 1∼3에서 SMOD=0이면 정상적인 보레이트로 설정되고, • SMOD=1이면 보레이트가 2배 높은 값으로 설정된다. • SMOD0 • 0이면 SCON.7 비트가 SM0으로 사용되고, • 1이면 SCON.7 비트가 FE(Framing Error)로 사용된다. 순천향대학교 정보기술공학부 이 상 정 8
동작 모드 0 • 동기식 반이중(half-duplex)통신 모드 • 실제의 직렬 통신에 사용하기보다는 병렬 I/O 확장용으로 사용하기 위한 것 • 이 모드에서는 TxD 단자가 시프트 클럭으로 사용되고, RxD는 직렬 데이터 송신 및 수신 단자로 사용된다. • 송수신 데이터는 항상 8비트로 구성되고 LSB부터 전송되며, 보레이트는 시스템 클럭의 1/12로 고정된다. 순천향대학교 정보기술공학부 이 상 정 9
P.193 그림 8.12 순천향대학교 정보기술공학부 이 상 정 10
동작 모드 0 • 송신 동작 • SBUF에 송신 데이터를 라이트함으로써 개시되며, • 1머신 사이클 후에 LSB(b0)부터 전송이 시작된다. 정확히 1머신 사이클에 1비트씩 전송되며, • MSB가 송신되고 나면 TI 인터럽트 플래그이 1로 세트된다. • 수신 동작 • REN=1인 상태에서 수신완료 인터럽트 플래그 RI를 0으로 클리어시키면 수신 데이터의 입력이 시작 • RxD 단자로 입력되는 수신 데이터의 각 비트는 TxD 단자로 입력되는 동기 시프트 클럭의 상승 에지에서 직렬 포트 내부의 입력 시프트 레지스터에 차례로 저장 • 8비트의 데이터가 모두 수신되면 시프트 레지스터의 데이터는 SBUF로 옮겨지고 수신 인터럽트 플래그 RI가 1로 세트된다. 순천향대학교 정보기술공학부 이 상 정 11
그림 8.13 8.14 순천향대학교 정보기술공학부 이 상 정 12
동작 모드 1 • 가장 널리 사용되는 표준적인 10비트 프레임(1 스타트 비트, 8 데이터 비트, 1 스톱 비트)의 비동기 전송 모드 • 보레이트는 타이머 1이나 타이머 2를 사용하여 사용자가 임의로 설정 • 타이머 2를 사용하는 경우에는 송신 클럭과 수신 클럭을 각각 독립적으로 인에이블시킬 수 있으므로 이들 중에 하나는 타이머 1을 사용하고 다른 하나는 타이머 2를 사용하도록 설정할 수도 있다. 순천향대학교 정보기술공학부 이 상 정 14
그림 8.16 순천향대학교 정보기술공학부 이 상 정 15
동작 모드 1 • 송신 동작 • SBUF에 송신 데이터를 라이트함으로써 개시 • SBUF를 라이트하면 즉시 송신 시프트 레지스터의 9번째 비트에 1이 로드되며, 이것은 수신측에서 스톱 비트로 작용한다. • 송신측에서 9번째 비트인 스톱 비트(1)를 전송하기 시작하는 순간에 TI를 세트시켜 송신완료 인터럽트를 발생한다. • 수신 동작 • REN=1인 상태에서 RxD 신호의 하강 에지가 입력되면 시작 • 스타트 비트(0)가 올바르게 검출되었으면 이후 8비트의 데이터 D0∼D7을 수신하여 시프트 레지스터에 저장 순천향대학교 정보기술공학부 이 상 정 16
동작 모드 1 • 마지막으로 9번째의 스톱 비트가 1로 올바르게 수신되었으면 RI=0인 조건에서 RI를 1로 세트시켜 수신 인터럽트를 발생한다 • 만약 SCON 레지스터에서 SM2=0이면 스톱 비트의 수신에 관계없이 RI=0이기만 하면 RI가 세트된다. • 수신된 스톱 비트는 SCON 레지스터의 RB8에 저장되며, 8개의 데이터 비트는 시프트 레지스터에서 SBUF로 로드된다. 순천향대학교 정보기술공학부 이 상 정 17
동작 모드 2와 3 • 11비트 프레임(1 스타트 비트, 8 데이터 비트, 프로그래머블한 9번째 비트, 1 스톱 비트)의 비동기 전송 모드 • 모드 3과 함께 주로 멀티프로세서 시스템에서 프로세서 사이의 통신에 사용 • 9번째 비트는 SCON 레지스터의 TB8 비트에 라이트함으로써 송신되며, 수신된 9번째 비트는 SCON 레지스터의 RB8 비트에 저장된다. • SCON 레지스터에서 SM2=1로 설정하면 RB8 비트가 1로 수신되었을 경우에만 직렬 포트 인터럽트가 발생되고 0으로 수신된 경우에는 인터럽트가 발생되지 않는다. 순천향대학교 정보기술공학부 이 상 정 19
동작 모드 2와 3 • 모드 3은 모드 2와 동일한 동작을 수행하며 단지 보레이트만이 다르다. • 모드 2에서는 보레이트를 시스템 클럭의 1/32이나 1/64로 설정할 수 있는데 비하여, • 모드 3에서는 보레이트를 타이머 1이나 타이머 2를 사용하여 임의로 설정할 수 있다. 순천향대학교 정보기술공학부 이 상 정 20
보레이트(Baud rate)의 발생 • 직렬 포트의 동작 모드 1과 3 • 타이머 1을 사용하는 방법과 타이머 2를 사용하는 방법이 있다. • 이중에서 타이머 1을 사용하는 경우에는 타이머 1을 모드 2(8비트 auto-reload mode)로 설정하여 분주비를 임의로 지정 • 타이머2를 사용하여 보레이트를 발생시키는 경우킬 수도 있다. 이때는 타이머 2의 16비트 보레이트 발생기 모드를 사용하므로 시스템 클럭이 11.0592MHz가 아니더라도 상당히 정확한 보레이트를 발생시킬 수 있다. 순천향대학교 정보기술공학부 이 상 정 21
보레이트(Baud rate)의 발생 순천향대학교 정보기술공학부 이 상 정 22
보레이트(Baud rate)의 발생 순천향대학교 정보기술공학부 이 상 정 23
보레이트 발생 방법 순천향대학교 정보기술공학부 이 상 정 24
보레이트 발생 방법 순천향대학교 정보기술공학부 이 상 정 25
프로그램 예 1 • 직렬포트를 통해 타이머 1을 사용한 9600 bps 속도의 모드 1 동작으로 데이터를 송수신하는 어셈블리 프로그램 • 데이터 송수신은 인터립트가 아닌 폴링방식 사용 • 수신(입력)된 문자 다시 송신(출력): echo print • 소문자를 대문자로 송신: 수신문자-32 • 모드 1 송신 MOV SCON, #52H SM0 SM1 = 01 : 모드 1, SM2 = 0REN =1 : receive enableTI = 1 : transmit interrupt flag, 초기 무한루프 탈출 순천향대학교 정보기술공학부 이 상 정 26
프로그램 예 1 • 타이머1, 모드 2 사용하여 9600 bps 보레이트 설정 MOV TMOD, #20H ; Timer 1, Mode 2 MOV TH1, #0FDH ; 9600 bps MOV TL1, #0FDH MOV PCON, #0 ; disable double baud rate SETB TR1 • 문자 버퍼(30H)에 수신 RXD_CH: JNB RI, RXD_CH ; receive ready? CLR RI MOV 30H, SBUF ; receive 순천향대학교 정보기술공학부 이 상 정 27
프로그램 예 1 • 버퍼(30H) 문자 송신 TXD_CH: JNB TI, TXD_CH ; transmit ready? CLR TI MOV SBUF, 30H ; transmit 순천향대학교 정보기술공학부 이 상 정 28
프로그램 예 1 CSEG AT 8000H ; main program CALL SER_INIT CLR C LOOP: CALL GETCH CALL PUTCH ; echo print MOV A, 30H SUBB A, #32 ; conversion from lower to upper character MOV 30H, A CALL PUTCH JMP LOOP 순천향대학교 정보기술공학부 이 상 정 29
프로그램 예 1 ; serial port initializarion SER_INIT: MOV TMOD, #20H ; Timer 1, Mode 2 MOV TH1, #0FDH ; 9600 bps MOV TL1, #0FDH MOV PCON, #0 ; disable double baud rate MOV SCON, #52H ; TI=1, REN=1, Mode 1 SETB TR1 ; start count RET ; get character from serial port GETCH: RXD_CH: JNB RI, RXD_CH ; receive ready? CLR RI MOV 30H, SBUF ; receive RET 순천향대학교 정보기술공학부 이 상 정 30
프로그램 예 1 ; put character to serial port PUTCH: TXD_CH: JNB TI, TXD_CH ; transmit ready? CLR TI MOV SBUF, 30H ; transmit RET END 순천향대학교 정보기술공학부 이 상 정 31
프로그램 예 2 • 직렬포트를 통해 타이머 1을 사용한 9600 bps 속도의 모드 1 동작으로 데이터를 송수신하는 C 프로그램 • 데이터 송수신은 인터립트가 아닌 폴링방식 사용 • 수신(입력)된 문자 다시 송신(출력): echo print • 소문자를 대문자로 송신: 수신문자-32 순천향대학교 정보기술공학부 이 상 정 43
프로그램 예 2 #include <reg52.h> void serial_init(void) { TMOD = 0x20; // Timer 1, Mode 2 TH1 = TL1 = 0xfd; // 9600 bps PCON = 0x00; // disable double baud rate SCON = 0x52; // TI=1, REN=1, Mode 1 TR1 = 1; // start count } void putch(char ch) { while (!TI) ; SBUF = ch; TI = 0; } 순천향대학교 정보기술공학부 이 상 정 44
프로그램 예 2 char getch(void) { char ch; while (!RI) ; ch = SBUF; RI = 0; return ch; } 순천향대학교 정보기술공학부 이 상 정 45
프로그램 예 2 main() { char c; serial_init(); while (1) { c = getch(); putch(c); // echo print putch(c-32); } } 순천향대학교 정보기술공학부 이 상 정 46