안녕하세요. 오늘은 UART통신에 대해 알아보겠습니다.
UART통신은 전송(TX)/수신(RX) 핀이 각각있고 핀이 HIGH / LOW로 변하면서 통신을 합니다.
핀이 HIGH/LOW로 변하는 시간을 가지고 데이터를 판단합니다.
- Baud rate
시간은 Baud rate값으로 세팅합니다. Baud rate단위는 bps(bits per second)이고 초당 비트 수 입니다. 예를들어 Baud rate가 9600이라면 1초에 9600bit를 보냅니다. 1초에 9600bit면 1bit는 104us입니다.
위의 사진에서 HIGH/LOW가 변하는걸 1bit로 봅니다. 9600bps에서는 1bit가 104us인 모습입니다.
- 패킷 구조
START하기: UART통신핀의 상태는 기본적으로 HIGH입니다. 그래서 HIGH로 유지하다가 LOW가 되면 START가 됩니다
데이터: 일반적으로 UART통신을할때 데이터 비트는 8개로 합니다. 그 말은 한번에 0b00000000~0b11111111값을 전송합니다. 아래의 그림에 D0~D7은 비트8개를 나타냅니다.
오류검출하기 : 아래 그림에서 PB가 Parity Bit를 나타냅니다. 데이터가 오류가있는지 확인할 수 있게 도와주는 BIT입니다. PB는 데이터 비트에 따라서 HIGH가 되고 LOW가 됩니다. 예를들어 데이터의 값이 0b00001111라면 1의 개수는 짝수입니다. 짝수(even)페리티비트라면 PB는 0이되고, 홀수 페리티비트라면 PB는 1이 됩니다.
그래서 결론적으로 모드는 일반적으로 2가지 even(짝수)/odd(홀수) 페리티 모드가 있습니다.
짝수 모드는 data bits + parity bit의 HIGH의 개수가 합쳐서 짝수가 되야함
홀수 모드는 data bits + parity bit의 HIGH의 개수가 합쳐서 홀수가 되야함
일반적으로 parity bit는 미사용합니다. 그러면 HIGH/LOW로 되는게 아니라 아예 페킷구조에서 제외됩니다.
STOP하기 : HIGH로 1비트 or 2비트가 유지되면 STOP이 됩니다. stop bit가 1개일수도있고 2개일수도있습니다. 2개를 사용하는경우는 1개를 사용할때보다 시간이 오래걸리므로 데이터교환이 더 안정적입니다.
일반적으로 STOP비트는 1개 사용합니다.
일반적으로 사용하는 옵션이 데이터개수는 8개, 페리티비트 미사용(none), STOP비트 1개를 8-N-1라고 부릅니다.
-LSB(Least Significant Bit) First
UART통신은 LSB First입니다.
-실제 예시
지금까지 설명했던 내용들을 예시로 파형을 보겠습니다. (아래의 파형들은 전부 Baud rate 9600입니다)
*기본파형입니다. 8-N-1세팅입니다. LSB이므로 실제 데이터는 0b01010101입니다.
파형을 보면 START BIT 1비트사용 / DATA BIT 8비트 사용 / STOP비트 1비트 사용 이므로 합 10비트입니다.(PB는 none이므로 아예 안보냅니다)
10비트이므로 데이터의 총 시간은 1.04ms입니다.
파형에서 STOP비트 이후에 통신을 안하므로 계속 HIGH가 유지되서 티가 안납니다. 그래서 STOP BIT가 1개인지, 2개인지, 3개인지 알 수 없으므로 데이터를 2개 보내보겠습니다.
데이터를 두개 보냈습니다. STOP BIT가 1개인걸 볼 수 있습니다. STOP BIT 전송 이후에 바로 START BIT를 보내서 다음 통신을 합니다. 이제 STOP BIT가 2개인 파형을 보겠습니다.
STOP BIT가 2개인 파형입니다.
이제 parity 비트를 사용해서 보내보겠습니다. 8-E-1 세팅입니다. 데이터비트의 개수는 8개이고 HIGH의 개수는 4개입니다. 짝수모두이므로 parity bit가 LOW면 데이터비트의 개수가 짝수이므로 parity bit가 LOW인걸 볼 수 있습니다.
8-O-1 세팅을 해보겠습니다.데이터비트의 개수가 8개이고 HIGH의 개수는 4개입니다. 홀수모드이므로 parity bit가 HIGH면 데이터비트의 개수가 홀수가 됩니다. 그래서 parity bit가 HIGH가 됩니다
이제 데이터를 읽어보겠습니다. 8-N-1 세팅입니다
데이터1번의 데이터비트는 앞에서부터 읽으면 10000010이므로 0b010000001 입니다.
데이터2번의 데이터비트는 앞에서부터 읽으면 01000010이므로 0b010000010 입니다.
그러므로 데이터1번은 0x41이고 데이터2번은 0x42입니다. 아스키값으로 본다면 A,B입니다.
'지식 > MCU지식' 카테고리의 다른 글
엔디안이란?(빅엔디안, 리틀엔디안) (0) | 2023.03.26 |
---|---|
MCU GPIO 전류 측정하기 (0) | 2023.01.23 |
MCU-push pull 알아보기 (0) | 2022.06.02 |
MCU-GPIO구조 알아보기 (0) | 2022.05.22 |
MCU-플로팅현상, 풀업저항,풀다운저항이란? (2) | 2022.01.01 |