- 송수신 레지스터가 독립적으로 동작되는 전이중 방식
- 동기 모드로 동작하는 마스터/슬레이브
- 에러율이 적은 보율 발생 장치
- 5,6,7,8,9 비트의데이터 비트와 1, 2 정지비트
- 홀수 및 짝수 패리티 비트 발생기와 하드웨어에 의한 패리티 검사
- 데이터 오버런 검출장치
- 프레밍 에러 검출장치
- 노이즈 검출 장치 및 디지털 저역 통과 필터
- TX Complete, TX Data Register Empty, RX Complete interrupt
- 다중 프로세서 통신 모드
- 비동기 통신 모드에서의 보율 더블러(Baud rate doubler)
// Baud rate setting
void USART_init(unsigned int baud)
{
// set baud rate
UBRRH = (unsigned char)(baud >> 8);
UBRRH = (unsigned char)baud;
UCSRB = (a << RXEN) | (1 << TXEN);
// set frame format; 8data, 2stop bit
UCSRC = (1 << USBS) | (3 << UCSZ0);
}
USART 송신기는 UCSRB 레지스터와 TXEN 비트를 1로 설정함으로써 ENABLE 하게된다. 송신기가 ENABLE 된 경우에는 TXD 핀의 범용 포트의 동작은 되지 않으며 USART 데이터 출력용으로 사용된다.
통신을 하기전에 보레이트, 동작모드, 데이터프레임등을 설정해둬야하며 동기모드로 작동시에는 XCK의 클럭은 송신클럭으로사용된다.
데이터 통신은 전송할 데이터가 송신버퍼에 로드되면 초기화 되고 CPU는 UDR에 값을 써서 송신 버퍼의 내용을 로드한다.
시프트 레지스터가 다음 데이터를 송신할 준비가 되어 있으면 송신 버퍼에 있는 데이터가 시프트 레지스터로 이동한다.
USART 의 송신기가 Data Register Empty (UDRE) 플래그를 이용하여 송신하는 과정
void USART_Transmit(unsigned char data)
{
while(!(UCSRA & (1 << UDRE)));
UDR = data;
}
////////////////////////////////////////////////////////////////////////////
USARTn 모듈
UDRn(USART I/O Data Register),
UCSRnA(USART Control & Status Register A)
UCSRnB(USART Control & Status Register B)
UCSRnC(USART Control & Status Register C)
UCSRnH/L(USART Control & Status Register A)
UCSRnA(USART Baud Rate Register)
////////////////////////////////////////////////////////////////////////////
UDRn(USART I/O Data Register) : 송수신 데이터 버퍼
모듈의 송수신 데이터 버퍼의 기능을 수행하며, 각 포트의 송신 및 수신 버퍼는 동일한 주소에 위치하지만 내부적으로 서로 다른 별개의 레지스터로서 송신할 데이터를 UDRn 에 라이트하면 이는 송신 데이터 버퍼 TXB에 저장되고 수신된 데이터를 UDRn 에서 읽으면 수신 데이터 버퍼 RXB 에 수신되어 있는 값이 읽어진다.
////////////////////////////////////////////////////////////////////////////
UCSRnA(USARTn Control & Status Register A)
USARTn 모듈의 송수신 동작을 제어하거나 송수신 상태를 저장하는 기능을 수행한다.
[ RXCn | TXCn | UDREn | FEn | DORn | PEn | U2Xn | MPCMn ]
RXCn (USART Receive Complete)
수신버퍼에 읽어지지 않는 수신문자가 들어 있으면 1로 셋
CPU가 이를 읽어서 수신버퍼가 비어 있는 상태면 0
TXCn (USARTn Transmit Complete)
송신 시프트 레지스터에 있는 송신 데이터가 모두 송신되고 UDRn 의 송신 버퍼에 아직 새로운 송신 데이터가 라이트 되지 않은 상태이면 1로 셋팅된다. (송신완료 인터럽트를 발생시킬때 사용)
UDREn (USARTn Data Register Empty)
UDRn 의 송신 버퍼에 새로운 송신 데이터를 받을 준비가 되어 있으면 1로 셋되는 상태 플래그 이며 인터럽트를 발생한다.
FEn (Frame Error)
UDRn의 수신 버퍼에 현재 저장되어 있는 데이터를 수신하는 동안에 프레임 에러가 발생하였음을 나타내는 상태 플래그로, 프레임 에러는 수신문자의 첫번째 스톱 비트가 0으로 검출되면 발생하고 UCSRAn 레지스터를 라이트 하면 0으로 클리어된다.
DORn(Data OverRun)
수신 동작에서 오버런 에러가 발생하였음을 나타내는 상태 플래그로 OverRun Error는 UDRn 의 수신 버퍼에 현재 읽지 않은 수신 문자가 들어 있는 상태에서 수신 시프트 레지스터에 새로운 데이터가 문자가 수신 완료되고 다시 그 다음 수신 데이터인 3번째 문자의 스타트 비트가 검출되면 발생한다. UCSRnA 레지스터를 라이트 하면 이 비트는 0으로 클리어 된다.
PEn(Parity Error)
UDR의 수신 버퍼에 데이터를 수신하는 동안에 패리티 에러가 발생하였음을 나타내는 상태 플래그로 UCSRnC 레지스터에 UPMn1 비트를 1로 설정할때만 발생한다.
U2Xn (Double the USARTn Transmission Speed)
비 동기 모드에서만 사용 가능한 것으로 클럭의 n 분주비를 16 에서 8로 1/2 만큼 낮추어 전송 속도를 2배 높이는 기능을 한다.
MPCMn(Multi-Processor Communication Mode)
멀티 프로세서 통신 어드레스 정보를 포함하지 않는 모든 수신 데이터는 수신부에 의하여 무시된다.
////////////////////////////////////////////////////////////////////////////
UCSRnB(USARTn Control & Status Register B)
UCSRnB USART 모듈의 송수신 동작을 제어하거나 송수신 상태를 저장한다.
[ RXCIEn | TXCIEn | UDRIEn | RXENn | TXENn | UCSZn2 | RXB8n | TXB8n ]
RXCIEn (RX Complete Interrupt Enable)
비트는 수신완료 인터럽트를 개별적으로 enable하고 1로 설정하고 SREG 레지스터의 I 비트가 1이고 UCSRnA 레지스터의 RXCn 비트가 1로 설정되어 있으면 수신완료 인터럽트가 발생한다.
TXCIEn (TX Complete Interrupt Enable)
비트는 송신완료 인터럽트를 개별적으로 enable하고 1로 설정하고 SREG 레지스터의 I 비트가 1이고 UCSRnA 레지스터의 TXCn 비트가 1로 설정되어 있으면 송신완료 인터럽트가 발생한다.
UDRIEn (USARTn Data Register Empty Interrupt Enable)
인터럽트를 개별적으로 enable하는 비트로 1로 설정하고 SREG 레지스터의 I비트가 1이고 UCSRnA 레지스터의 UDREn 비트가 1로 되면 USARTn Data Register Empty 인터럽트가 발생한다.
RXENn (Receive Enable)
모듈의 수신부가 동작하도록 enable 하는 것으로 RXDn 핀이 병렬 I/O 포트가 아니라 직렬 데이터 수신 단자로 동작하도록 설정
TXENn(Transmitter Enable)
모듈의 송신부가 동작하도록 enable하는 것으로 TXDn 핀이 병렬 I/O 포트가 아니라 직렬 데이터 송신 단자로 동작 하도록 설정
UCSZn2(Character Size)
UCSRnC 레지스터의 UCSZn1~0 비트와 함께 전송 문자의 데이터 비트수를 설정
RXB8n (Receive Data Bit 8)
수신문자가 9비트로 설정된 경우에 수신된 문자의 9번째 비트 (MSB)를 저장한다.
TXB8n(Transmit Data Bit 8)
송신문자가 9비트로 설정된 경우에 송신된 문자의 9번째 비트(MSB)를 저장한다.
////////////////////////////////////////////////////////////////////////////
UCSRnC (USARTn Control & Status Register C)
[ - | UMSELn | UPMn1 | UPMn0 | USBSn | UCSZn1 | UCSZn0 | UCPOLn ]
UMSELn(USARTn Mode Select)
모듈을 동기 전송 모드로 설정 하고 0이면 비동기 전송 모드로 전송한다.
UPMn1, 0(Parity Mode)
이비트를 1로 설정하면 패리티 검사를 할 수 있고 송신기는 자동적으로 각 프레임의 송신 데이터에 패리티 비트를 더하여 송신한다. 수신기는 UPM0 비트와 수신된 데이터를 비교한다. 만일 오류발생시 UCSRnA 레지스터의 PE플래그가 1로 셋된다
UPMn1 : 0 0 1 1
UPMn0 : 0 1 0 1
Result
Disable, appointment, Enabled even parity, Enabled odd parity
////////////////////////////////////////////////////////////////////////////
USBSn (Stop Bit select)
비트가 0이면 모듈에서 데이터 포맷을 구성하는 스탑 비트를 1개로 설정하고 1이면 2개로 설정한다.
0 : 1-bit
1 : 2-bit
////////////////////////////////////////////////////////////////////////////
UCSZn1, 0(Character size)
전송 문자의 데이터 비트 수를 설정한다.
0 0 0 5bit
0 0 1 6bit
0 1 0 7bit
0 1 1 8bit
1 0 0 appointment
1 0 1 appointment
1 1 0 appointment
1 1 1 9bit
////////////////////////////////////////////////////////////////////////////
UBRRnH/L (USARTn Baud Rate Register)
16bit 중 12bit만 사용하며 모듈의 송수신 속도를 설정하는 기능을 한다.
error[%] = (Baudrate Closest Match / Baudrate - 1) * 100%