[IOT-005][기초] UART·I2C·SPI 통신 차이 한눈에 보기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[IOT-005][기초] UART·I2C·SPI 통신 차이 한눈에 보기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 228회 작성일 26-09-01 13:34

본문

[이번 수업]

마이크로컨트롤러와 센서·화면·메모리를 연결할 때 자주 쓰는 UART, I2C, SPI의 선 구성과 데이터 전달 방식을 비교합니다.

[선수지식]

IOT-001의 전압·디지털 신호와 IOT-004의 GPIO 입력·출력을 알고, 16진수 한 바이트를 읽을 수 있으면 좋습니다.

[학습목표]

1. UART·I2C·SPI의 선과 통신 상대를 설명한다.
2. 속도·장치 수·배선에 맞는 방식을 고른다.
3. 주소와 명령, 데이터 바이트를 구분한다.

[핵심개념]

세 방식은 가까운 칩과 장치가 비트를 주고받는 직렬 통신입니다. 실제 연결에는 신호선뿐 아니라 같은 기준 전압을 쓰기 위한 GND가 필요합니다. 핀 이름과 지원 버스, 전압, 최대 속도는 보드와 부품 데이터시트를 먼저 확인해야 합니다.

UART는 별도 클록 선 없이 TX로 보내고 RX로 받는 비동기 통신입니다. 두 장치를 연결할 때 한쪽 TX를 다른 쪽 RX에 교차 연결합니다. 양쪽의 baudrate(초당 신호 속도), 데이터 비트, parity(간단한 오류 확인 비트), stop 비트가 같아야 합니다. 주소가 기본 제공되지 않아 보통 두 장치 연결과 디버그 로그에 간단합니다.

I2C는 데이터 SDA와 클록 SCL 두 신호선을 여러 장치가 공유합니다. controller가 통신을 시작하고 7비트 주소로 target을 고른 뒤 ACK 또는 NACK로 응답 여부를 확인합니다. SDA와 SCL은 선을 직접 높은 전압으로 밀어 올리지 않는 open-drain 방식이므로 전원 쪽으로 당기는 풀업 저항이 필요합니다. 같은 주소의 장치가 둘이면 주소 핀 변경이나 버스 분리가 필요합니다.

SPI는 controller가 SCK 클록을 만들고 COPI(MOSI)로 보내며 CIPO(MISO)로 받습니다. 장치마다 CS(칩 선택) 선을 두어 통신 대상을 고릅니다. 주소와 ACK가 공통 규칙으로 정해져 있지 않아 부품 데이터시트의 명령 형식을 따라야 합니다. 보통 높은 전송률을 선택하기 쉽지만 장치가 늘수록 CS 선도 늘어납니다. 클록 극성과 위상을 뜻하는 mode, 비트 순서, 최대 주파수가 양쪽에서 맞아야 합니다.

따라서 간단한 1:1 로그는 UART, 여러 저속 센서를 적은 선으로 연결할 때는 I2C, 빠른 화면·메모리 전송에는 SPI를 먼저 검토합니다. 실제 선택은 거리, 전압, 장치 수, 데이터시트 제한을 함께 봅니다.

[따라하기]

다음은 온도 25를 각 방식의 메시지처럼 표현하는 로컬 연습입니다. 실제 핀을 구동하지 않으며 bus_bytes.py로 저장합니다.

```python
temperature = 25
uart_message = f"T={temperature}\n".encode("ascii")
i2c_address = 0x48
spi_command = bytes([0x03, 0x00, 0x10])

print("UART:", uart_message.hex(" "))
print(f"I2C: address=0x{i2c_address:02X}, data={temperature:02X}")
print("SPI:", spi_command.hex(" "))
```

macOS·Linux는 `python3 bus_bytes.py`, Windows는 `py bus_bytes.py`로 실행합니다. 예상 결과입니다.

```text
UART: 54 3d 32 35 0a
I2C: address=0x48, data=19
SPI: 03 00 10
```

UART 값은 `T=25`와 줄바꿈의 ASCII 바이트입니다. I2C의 0x48은 장치 주소이고 0x19는 25의 16진수입니다. SPI 바이트는 예시 명령·주소이며 실제 의미는 부품마다 다릅니다.

[흔한 실수]

- GND를 공유하지 않거나 3.3V 핀에 5V 신호를 연결합니다.
- UART의 TX끼리 연결하거나 baudrate·parity를 다르게 설정합니다.
- I2C 풀업 저항, 주소 충돌, ACK 실패를 확인하지 않습니다.
- SPI의 CS 제어, mode, 비트 순서가 데이터시트와 다릅니다.
- 긴 점퍼선에서 높은 속도부터 사용해 신호가 불안정해집니다.

[보안 주의]

전원을 끈 상태에서 배선하고 측정기로 전압을 확인하세요. RS-232 전압을 마이크로컨트롤러 UART 핀에 직접 연결하지 않습니다. UART 같은 디버그 포트는 펌웨어나 비밀값을 노출할 수 있으므로 제품에서는 불필요한 포트를 끄고 로그에 자격증명을 남기지 마세요. 실습은 본인 소유 장치와 격리된 전원에서만 합니다.

[직접 해볼 과제]

1. 센서 4개, 선 수 제한, 빠른 화면 전송이라는 세 상황에 UART·I2C·SPI 중 하나를 고르고 이유를 적으세요.
2. temperature를 30으로 바꾸어 I2C data와 UART 바이트가 어떻게 달라지는지 확인하세요.

[확인문제]

1. UART 두 장치의 TX와 RX는 어떻게 연결하나요?
2. I2C의 SDA와 SCL에 풀업 저항이 필요한 이유는 무엇인가요?
3. SPI 장치마다 CS 선과 mode 확인이 필요한 이유는 무엇인가요?

[다음 학습]

IOT-006에서는 Wi-Fi·Bluetooth·저전력 무선 통신의 거리와 전력 사용을 비교합니다.

[공식 참고 자료]

- I2C-bus specification UM10204: https://community.nxp.com/pwmxy87654/attachments/pwmxy87654/nxp-designs/931/1/UM10204.pdf
- UART 공식 문서: https://docs.micropython.org/en/latest/library/machine.UART.html
- I2C 공식 문서: https://docs.micropython.org/en/latest/library/machine.I2C.html
- SPI 공식 문서: https://docs.micropython.org/en/latest/library/machine.SPI.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
2,088
어제
5,103
최대
16,772
전체
773,142
Copyright © 소유하신 도메인. All rights reserved.