하드웨어 설계에 관련한 공개 강좌를 게재하는 공간입니다.
운영진에 의해 강좌글은 편집되며, 공익을 위한 게시글은 '하드웨어 강좌'란으로 이동될 수 있습니다.
판매자 | 아크마 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
ㅇ Serial 통신은 하나의 신호선을 사용해서 데이터를 비트 단위로 보내는 방식
“예” 8비트 UART(Universal Asynchronous Receiver/Transmitter)
ㅇ Serial 통신 interface 통신 규격(RS-232C, RS-422, RS-423)
- Serial 통신 이점 : 적은 수의 통신 라인과 먼 거리 전송
- Serial 통신 전송 방식
․full duplex(동시 양방향 전송 방식) - 8051
․half duplex(서로 다른 시간 양방향 전송 방식) - 무전기
․full duplex(단방향 전송 방식) - 라디오
- 속도
․bps(bits per second) : 1초당 전송 비트의 수
․baud rate : 1초당 전송되는 변조된 신호의 수
* 8051에서는 하나의 비트가 하나의 신호이므로 같은 의미
2. 시리얼 포트 레지스터
2.1 SBUF(Serial data BUFfer)
ㅇ 송신할 데이터와 수신할 데이터를 일시적으로 저장하는 레지스터
ㅇ 이중 구조(같은 이름, 같은 주소) ; 송신용 SBUF, 수신용 SBUF
* 그림5-1 참조
2.2 SCON(Serial port CONtrol register)
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
ㅇ 비트별 제어 가능
ㅇ b7(SM0), b6(SM1)은 모드 선택 비트
SM0 SM1 모드 기능 설명 보오 레이트 |
0 0 0 Shift Register 고정 (발진 주파수÷12) 0 1 1 8bit UART 가변 (타이머에의해 설정) 1 0 2 9bit UART 고정(발진 주파수÷32, 또는 ÷64) 1 1 3 9bit UART 가변 (타이머에의해 설정) |
ㅇ SM2 : 시리얼 포트가 모드2,3일 때 멀티 프로세서 통신을 가능하게 한다.
이 비트를 “1”로 하면, 수신 데이터의 9번째 비트가 “1”이면 데이터 수신,
수신 데이터의 9번째 비트가 “0”이면 데이터 무시
ㅇ REN : 수신 가능 비트, 수신하기 위해서는 “1‘로 설정
ㅇ TB8 : 모드2,3에서 송신 데이터의 9번째 비트를 소프트웨어에 의해 제어
(“1”로 설정하였을 때는 9번째 데이터 비트가 “1”인 정보를 송신하고,
“0”으로 설정하였을 때는 9번째 데이터 비트가 “0”인 정보를 송신함)
ㅇ RB8 : 모드2,3에서 수신 데이터의 9번째 비트를 받음
ㅇ TI : 송신 인터럽트 플래그, 문자 송신의 끝에서 “1”로 설정,
소프트웨어에 의해 클리어 되어야 함
ㅇ RI : 수신 인터럽트 플래그, 문자 수신의 끝에서 “1”로 설정,
소프트웨어에 의해 클리어 되어야 함
2.3 SMOD(PCON.7)
ㅇ 2배의 보오 레이트 플래그
ㅇ SMOD를 ‘1’로 하면 보오 레이트가 2배
3. 동작 모드
3.1 모드0(8비트 쉬프트 레지스터)
ㅇ 동기식, 8데이터, 보오 레이트 : OSC/12
ㅇ TXD : 동기 CLOCK 신호, RXD : 데이터 입/출력
ㅇ 송신
- 그림5-2 참조
- SBUF에 데이터 넣음 → SBUF의 데이터가 LSB부터 RXD 단자로 차례로 출력 → TI 세트 → TI를 소프트웨어적으로 클리어
ㅇ 수신
- 그림5-3 참조
- REN=1, RI=0 이면 데이터 입력 시작 → 데이터를 Serial Port 내부의 input shift register로 순차적으로 저장 → 입력이 완료되면 SBUF로 저장 → RI 세트 →
RI를 소프트웨어적으로 클리어
3.2 모드1,2,3
ㅇ 모드1 : 비동기식, 8 데이터 UART, 보오 레이트는 타이머에 의해 가변
(8 데이터 UART : 시작 비트, 8 비트의 데이터, 종료 비트)
ㅇ 모드2 : 비동기식, 9 데이터 UART, 보오 레이트는 OSC/32 또는 OSC/64
(9 데이터 UART : 시작 비트, 8 비트의 데이터, 9번째 비트, 종료 비트)
ㅇ 모드3 : 비동기식, 9 데이터 UART, 보오 레이트는 타이머에 의해 가변
(9 데이터 UART : 시작 비트, 8 비트의 데이터, 9번째 비트, 종료 비트)
ㅇ TXD : 송신 신호, RXD : 수신 신호
ㅇ 송신
- 그림5-6 참조
- 송신 데이터를 SBUF에 데이터 넣음 → TXD 단자로 자동으로 송신(시작 비트의 송신은 SBUF로 데이터를 써넣은 명령이 완료된 시점에서 시작) → TI 세트(9번째(모드1) 또는 10번째(모드2,3)의 데이터를 송신할 때에 세트) → TI를 소프트웨어적으로 클리어
ㅇ 수신
- REN=1, RI=0 이면 데이터 입력 준비 → 수신은 RXD에 1-0 전이에 의해 시작, 모든 데이터가 Serial Port 내부의 input shift register로 순차적으로 저장 → 9번째 비트(또는 종료 비트)는 SCON의 RB8에 실림 → SBUF에 8 데이터 비트가 실림 → RI 세트 → RI를 소프트웨어적으로 클리어
ㅇ 모드별 구조 (보오 레이트)
4. 시리얼 포트 레지스터의 초기화 및 접근
4.1 수신 가능
ㅇ 수신을 위해서는 REN 플래그를 “1”로 설정
- SETB REN
- MOV SCON, #xxx1xxxxB
4.1 9번째 데이터 비트
ㅇ 모드2,3에서 송신되는 9번째 데이터 비트는 TB8에 실림,
수신되는 9번째 데이터 비트는 RB8에 위치
ㅇ 9번째 데이터 비트는 다중 프로세서 통신에 중요한 역할
4.3 패리티 비트 추가
ㅇ PSW의 P비트는 짝수 패리티 설정
ㅇ 9번째 데이터 비트에 짝수 패리티 추가
MOV C, P
MOV TB8, C
MOV SBUF, A
ㅇ 9번째 데이터 비트에 홀수 패리티 추가
MOV C, P
CPL C
MOV TB8, C
MOV SBUF, A
ㅇ 모드1에서의 패리티 추가(7비트 ASCII 코드 전송)
CLR ACC.7
MOV C, P
MOV ACC.7, C
MOV SBUF, A
4.4 인터럽트 플래그
ㅇ TI, RI 플래그는 하드웨어에 의해 1로 설정, 소프트웨어에 의해 0(클리어)
ㅇ RI는 문자 수신 끝에서 1로 설정, 초기 값은 0으로 설정해야함
WAIT: JNB RI, WAIT
CLR RI
MOV A, SBUF
ㅇ TI는 문자 송신 끝에서 1로 설정, 따라서 초기 값도 1로 설정해야됨
WAIT: JNB TI, WAIT
CLR TI
MOV SBUF, A
5. 다중 프로세서 통신
ㅇ 모드2,3에서 SM2를 1로 설정하면, 전송 수신 데이터의 9번째 데이터 비트가 1이 아니면 인터럽트를 발생하지 않음, 이 기능을 이용하여 다중 프로세서 통신
순서 |
주(Master) |
종(Slave) #1 |
종(Slave) #2 |
종(Slave) #n |
1
2
3
4
5
6
7
|
TB8=1 설정
어드레스 발생
-
TB8=0 설정
데이터 송신
데이터 송신 완료
-
|
SM2=1 설정
인터럽트 발생
어드레스 판정(No)
SM2=1(그대로)
무시
-
어드레스 발생에 따른 인터럽트 대기 |
SM2=1 설정
인터럽트 발생
어드레스 판정(No)
SM2=O 설정
데이터 수신
SM2=1 설정
어드레스 발생에 따른 인터럽트 대기 |
SM2=1 설정
인터럽트 발생
어드레스 판정(No)
SM2=1(그대로)
무시
-
어드레스 발생에 따른 인터럽트 대기 |
6. 시리얼 포트 보오 레이트
ㅇ 모드0 보오 레이트 : OSC/12
모드1, 3 보오 레이트 : 타이머/카운터1의 OV
모드2 보오 레이트 : OSC/32(SMOD=1) or OSC/64(SMOD=0)
ㅇ SMOD 설정은 비트 제어가 불가하여 “읽기-변경-쓰기” 명령 필요
MOV A, PCON
SETB ACC.7
MOV PCON, A
6.1 모드1,3 의 보오 레이트 설정
ㅇ 타이머/카운터1 사용
- 모드2(8비트 재 적재 모드) 사용
- TH1에 보오 레이트에 맞는 재적재 값 설정
․ SMOD = 0인 경우
예를 들어, 보오 레이트를 1200으로 가정하면
타이머/카운터1 OV = 1200 × 32 = 38400 ㎐
12㎒ 크리스탈 사용할 경우 타이머/카운터1의 1클록은 1㎲
MOV TH1, #-26
10진수 -26을 Hex로 변환하면,
256 - 26 = 230 = E6H
∴ MOV TH1, #0E6H