콘텐츠로 바로가기

Bus Communication Protocols

칩 내부와 외부의 장치들이 데이터를 교환하기 위해 사용하는 전기적 규약인 I2C, SPI, UART, CAN 버스의 물리적 신호 체계와 제어 로직을 다루는 학습 노드입니다.

Article
M

Me

hyunyoun's Blog

computer-architecture-embedded-systemscomputer-architectureembedded-systemshardware-software-interface-physicsbus-communication-protocolslearningmmiodma10 min read

1. Overview

버스 통신 프로토콜(Bus Communication Protocols)은 CPU 코어가 실리콘 다이(Die)의 외로운 감옥을 벗어나, 마더보드에 주렁주렁 매달린 센서, 메모리, 심지어 자동차 엔진 칩과 대화하기 위해 만들어낸 전기적 펄스의 공용어(Lingua Franca)이자 기계적 외교술입니다.

학습자는 클럭 전선 하나를 아끼기 위해 송수신 양측이 시간(타이밍)을 소름 돋게 맞춰야 하는 비동기 통신 UART부터 뜯어보고, 마스터가 노예 칩(Slave) 100개의 주소를 부르며 단 2가닥의 선으로 통제하는 **I2C(오픈 드레인 회로)**의 우아한 느림을 해부합니다. 나아가 칩 선택 선(CS)을 냅다 꽂고 초당 수십 메가비트를 양방향으로 쏟아내는 SPI의 고속 푸시-풀(Push-Pull) 물리와, 엔진 진동과 번개 속에서도 에러율 0%를 유지하며 '차동 신호(Differential)'로 멱살을 잡고 우선순위를 쟁취하는 산업용 CAN 버스를 통달하여 하드웨어 인터페이싱의 마스터 역량을 확보합니다.

2. Scope & Boundaries

In-Scope

  • 비동기 통신 역학 (Asynchronous): UART/USART (TX/RX 크로스 오버, Baud Rate 타이밍, Start/Stop 비트 동기화).
  • 동기식 버스 구조 (Synchronous Shared Bus): I2C (SDA/SCL, 풀업 저항, 오픈 드레인(Open-Drain), 주소 핑, NACK/ACK 핸드셰이크).
  • 동기식 전이중 통신 (Full-Duplex): SPI (MOSI/MISO/SCK/CS, 마스터-슬레이브 직결 래치 링 버퍼 매커니즘).
  • 차동 기반 다중 마스터 (Differential Multi-Master): CAN 버스 (CAN_H/CAN_L 차동 전압, CSMA/CR 우선순위 중재, 비트 스터핑).

Out-of-Scope

  • 고속 직렬 스위칭 네트워크: 마더보드의 뼈대인 PCIe(PCI Express)나 USB 프로토콜의 패킷 엔드포인트 계층 \rightarrow 02-05-05. PCIe, DMA & IO Virtualization 영역.
  • 무선 통신 RF 기저대역 변조: Bluetooth, Wi-Fi 신호 위상 변조(QAM/PSK) \rightarrow 08-01. Network Physics & Routing 영역.

Boundaries

  • Bus Communication vs. GPIO (02-05-01): GPIO 핀 통제(02-05-01)가 단순히 "핀 1개를 HIGH(3.3V)/LOW(0V)로 올려 LED 불을 끄고 켜는 무식한 완력"이라면, 버스 통신은 "이 HIGH/LOW를 1초에 10만 번씩 정밀한 패턴(프레임)으로 쪼개서 상대방 칩 내부의 레지스터 값을 읽어오는 외교적 언어"입니다.

3. Counterexample

  • UART 타이밍 오차 무시 (Baud Rate Mismatch Catastrophe): 송신 측(A)은 115200 속도로 비트를 밀어내는데, 수신 측(B)의 클럭 오실레이터가 온도 때문에 미세하게 틀어져 110000 속도로 읽는 상황. I2C나 SPI처럼 클럭 선(SCL/SCK)이 멱살을 잡아 이끌어 주지 않는 비동기 통신(UART)에서는, 첫 1~2비트는 우연히 맞을지 몰라도 8비트 끝자락(스톱 비트)에 가면 오차가 눈덩이처럼 누적되어 엉뚱한 허공(프레이밍 에러)을 읽게 됩니다. 결과적으로 터미널엔 깨진 외계어()만 쏟아집니다.
  • I2C 오픈-드레인 미구현 (Push-Pull Collision Fire): I2C 통신 선로(SDA)를 세팅할 때 핀 모드를 오픈 드레인(Open-Drain)과 풀업 저항이 아닌, 일반 GPIO 푸시-풀(Push-Pull) 출력으로 꽂아버리는 전기적 방화 행위. 마스터가 논리 1(3.3V 전류 방출)을 쏘는 순간 슬레이브가 논리 0(GND 접지)을 쏘게 되면, 3.3V 전원 핀에서 GND로 어떠한 저항(저항값 0)도 없이 쌩 전기가 직통으로 쇼트(Short-circuit)되어 흐릅니다. 0.1초 만에 마더보드에서 매캐한 연기가 피어오르며 통신 칩이 타버립니다.

4. Prerequisites

  • 디지털 논리 전압 (Basic): 3.3V와 0V가 1과 0을 상징하며, 트랜지스터 게이트가 열리고 닫히는 원리에 대한 직관이 필요합니다. (02-01-01 Digital Logic)
  • MCU 하드웨어 맵 (Basic): 버스 통신 컨트롤러(USART, SPI Peripheral) 역시 특수 기능 레지스터(SFR) 덩어리이므로 메모리 맵 I/O의 개념을 알아야 합니다. (02-05-01 Bare-metal)

5. Learning Map

Sequence Core Cluster Objective & Description Evidence (BoK)
1 UART (Asynchronous) 클럭 전선 하나를 아끼기 위해 서로 타이머(Baud)만 믿고 비트를 허공에 던지는 가장 원시적 핏줄을 쥡니다. P1
2 I2C (Open-Drain) 통신 선 2가닥으로 센서 100개를 줄줄이 매달고, 전기가 쇼트 나지 않게(풀업/오픈드레인) 양보하는 철학을 뜯어봅니다. P5
3 SPI (Full-Duplex) 양보 따윈 버리고 슬레이브 멱살(CS)을 쥔 뒤 쌍방향(MISO/MOSI)으로 비트를 맞교환해 치워버리는 고속 기하학을 해부합니다. Industry
4 CAN (Differential) 차동 신호 방패로 엔진 노이즈를 막고, 0(Dominant)이 1을 논리적으로 씹어먹어 우선순위를 결정하는 산업망을 쥡니다. Industry

6. Learning Topics

Basic

Core Topic 01: 비동기 시리얼의 무모함과 동기화, UART (Asynchronous)

  • Why to Learn: MCU 개발의 첫걸음이자 영원한 친구. 복잡한 클럭(Clock) 동기화 선 없이 오직 2가닥(TX, RX)만으로 컴퓨터 터미널에 디버그 텍스트(printf)를 띄워 칩 내부의 혼돈을 관측하는 창문을 열기 위함입니다.
  • What to Learn:
    • Concepts: 비동기 통신(Asynchronous), 보드 레이트(Baud Rate).
    • Skills: 프레임 구조(Start Bit 0, Data 8-bit, Parity, Stop Bit 1), 샘플링(Sampling) 타점.
    • Tools: USB-to-TTL 시리얼 모듈.
    • Trade-offs: 선을 아끼고 장거리(RS-232, RS-485 변환)를 가기 좋지만, "나는 1초에 115200번 칠 테니 넌 115200번 읽어"라는 소프트웨어적 약속이 환경 온도나 칩 오실레이터 오차로 3%만 엇나가도 통신 전체가 외계어로 붕괴하는 클럭 비동기화의 필연적 리스크.
  • How to Learn:
    • 1단계: 선로가 1(HIGH)로 떠 있다가 갑자기 0(LOW)으로 뚝 떨어지는 Start Bit를 감지한 순간, 수신 칩이 내부 타이머를 미친 듯이 굴려 정확히 비트 너비의 절반 지점(Center)마다 타점을 찍어(Sampling) 데이터를 훔쳐 오는 외줄 타기를 해부합니다.
    • 2단계: LSB(가장 덜 중요한 비트)부터 꼬리를 물고 역순으로 날아간 뒤 마지막 Stop Bit(1) 방벽이 쳐지는 1바이트 10비트 프레이밍 궤적을 뜯어봅니다.
  • Implement: 0과 1로 된 가상의 파형 스트링 "11110_10000010_111"을 밀어 넣었을 때, Start=0을 캐치한 시점부터 Baud 박자마다 타점을 찍어 10000010 (역순 01000001 = 'A')을 디코딩하는 파이썬 UART 수신 파서 시뮬레이션 코드.

Core Topic 02: 2가닥 버스와 타협의 미학, I2C (Inter-Integrated Circuit)

  • Why to Learn: 손톱만 한 마더보드 공간에 가속도 센서, 온도 센서, EEPROM 수십 개를 욱여넣을 때, 칩 하나 추가할 때마다 핀을 뚫지 않고 오직 2가닥 버스(SDA, SCL)만으로 모든 노예(Slave)를 통제하는 경제성을 장악하기 위해서입니다.
  • What to Learn:
    • Concepts: 동기식 셰어드 버스(Synchronous Shared Bus), 마스터-슬레이브(Master-Slave).
    • Skills: I2C 어드레싱(7-bit 주소핑), 오픈 드레인(Open-Drain) 물리, 풀업 저항(Pull-up), ACK/NACK ハンドシェイク.
    • Tools: 로직 애널라이저(Logic Analyzer).
    • Trade-offs: 핀 2개로 센서 127개를 매다는 극강의 공간 절약 효과를 얻지만, 칩 두 개가 동시에 말하다(쇼트) 불타는 걸 막기 위해 오픈-드레인과 풀업 저항(스프링처럼 서서히 전압이 차오름)을 쓰다 보니 파형이 둥글게 뭉개져 통신 스피드(400kHz~1MHz)가 바닥을 기는 커패시턴스의 딜레마.
  • How to Learn:
    • 1단계: 통신 선을 아무도 강제로 3.3V(1)로 밀어 올리지 못하고 오직 GND(0)로 끄집어 내릴(Drain) 수만 있게 만든 뒤, 외부 저항(Pull-up)의 힘으로 천천히 1이 차오르게 만드는(Wired-AND) 하드웨어 쇼트 방지 물리를 해부합니다.
    • 2단계: 마스터가 클럭(SCL)을 치며 "야, 주소 0x68번!"을 외치면, 슬레이브들이 다 듣고 있다가 자기 주소가 아니면 무시하고 0x68 칩만 마지막 클럭에 데이터 핀(SDA)을 0으로 확 끌어내려 "저깄슴다(ACK)"라고 응답하는 중앙 지휘망을 뜯어봅니다.
  • Implement: 마스터 1개와 3개의 가상 슬레이브 딕셔너리(0x10, 0x20, 0x30)를 세팅. 마스터가 [Start][0x20][Read] 패킷 배열을 던지면, 오직 0x20 객체만 활성화되어 ACK(0)를 리턴하고 내부 센서 데이터 [0xFA]를 버스로 뱉어내는 I2C 버스 핸드셰이킹 시뮬레이션.

Practical

Core Topic 03: 타협 없는 쌍방향 폭격기, SPI (Serial Peripheral Interface)

  • Why to Learn: 고해상도 LCD 화면을 그리거나 기가바이트 플래시 메모리를 미친 듯이 복사해야 할 때, I2C의 답답한 느림과 주소 부르기(핑) 오버헤드를 싹 버리고 초고속 1<1> 하드코어 통신망을 구축하기 위함입니다.
  • What to Learn:
    • Concepts: 전이중 통신(Full-Duplex), 푸시-풀(Push-Pull) 논리, 시프트 레지스터(Shift Register) 링.
    • Skills: 4선식 구조(MOSI, MISO, SCK, CS/SS), CPOL(클럭 극성)/CPHA(위상) 타이밍 세팅.
    • Tools: 고속 오실로스코프.
    • Trade-offs: 오픈 드레인 따위 버리고 칩이 직접 전압을 강제로 쏘는(Push-Pull) 구조라 수십 메가헤르츠(MHz)의 폭발적 속도를 얻지만, 슬레이브가 1개 추가될 때마다 멱살을 잡는 칩 셀렉트(CS) 선이 마더보드에 1가닥씩 늘어나 핀 부족 사태가 터지는 배선(Wiring) 지옥.
  • How to Learn:
    • 1단계: 주소를 부르는 낭비 따윈 없이, 마스터가 특정 슬레이브의 CS 핀을 0(LOW)으로 냅다 끄집어 내리는 순간 해당 슬레이브가 하드웨어적으로 노예 모드에 돌입하는 절대 복종 물리망을 해부합니다.
    • 2단계: MOSI(마스터 \rightarrow 슬레이브)와 MISO(슬레이브 \rightarrow 마스터) 두 고속도로가 개통되고, 클럭이 한 번 튈 때마다 양쪽 칩 내부에 있는 8칸짜리 원형 배열(Shift Register)이 기계식 톱니바퀴처럼 맞물려 돌며 1바이트를 서로 강제 교환(Swap)해버리는 전이중(Full-Duplex) 역학을 뜯어봅니다.
  • Implement: 사이즈가 8비트인 두 개의 리스트 Master_Reg = [1,0,1,0,1,0,1,0]Slave_Reg = [0,0,0,0,1,1,1,1] 를 만들고. 8번의 순환 루프(Clock)를 돌며 .pop(0) 한 값을 상대방의 .append()로 집어넣어, 8클럭 종료 후 마스터와 슬레이브의 메모리 상태가 완벽하게 맞교환(Swap)되는 SPI 링 버퍼 시뮬레이션 작성.

Advanced

Core Topic 04: 엔진 노이즈를 뚫는 차동 무장망, CAN (Controller Area Network)

  • Why to Learn: 번개가 치고 점화 플러그 스파크 전자기파가 미친 듯이 튀는 2톤짜리 자동차 쇳덩이 안에서, 통신 선로 전압이 100V까지 널뛰더라도 에러율 0%로 브레이크(ABS) 신호를 박아넣는 무결성 산업망을 장악하기 위해서입니다.
  • What to Learn:
    • Concepts: 차동 신호(Differential Signaling), 멀티 마스터(Multi-Master).
    • Skills: CAN_H / CAN_L 전압 물리, Dominant(0) / Recessive(1) 비트, CSMA/CR 충돌 해결(Arbitration), 비트 스터핑(Bit Stuffing).
    • Tools: CAN 버스 아날라이저(PCAN).
    • Trade-offs: "누구 칩에게"라는 목적지 주소를 완전히 지워버리고 "RPM 데이터", "온도 데이터"라는 데이터 이름표(ID)만 버스에 뿌리는 브로드캐스팅 방식 덕분에 설계 유연성은 극강이지만, 악의적 해커(칩)가 0번(최우선순위) 메시지를 0.001초마다 쏘아대면 다른 모든 브레이크/핸들 제어가 버스에 묻혀 멈춰버리는(DoS 공격) 치명적 구조 결함.
  • How to Learn:
    • 1단계: 통신선을 3.3V(1)와 0V(0)로 나누지 않고, 두 전깃줄(CAN_H, CAN_L)의 "전압 차이"가 0V면 논리 '1' (Recessive, 힘 뺌), 두 선의 전압을 쫙 찢어 2V 차이를 만들면 논리 '0' (Dominant, 전압 빡 줌)으로 판정하여 외부 번개 10,000V가 두 선을 같이 때려도 '차이값'은 절대 보존되는 기적의 노이즈 방공망을 해부합니다.
    • 2단계: 두 칩이 우연히 동시에 버스에 메시지를 쏠 때, 0(Dominant) 전압을 쏜 놈과 1(Recessive)을 쏜 놈이 겹치면 물리적으로 0이 버스를 지배(Wired-AND)하므로, ID 번호표(0에 가까울수록 VIP)가 더 낮은 칩이 말다툼에서 승리하여 버스를 끝까지 독점하는 비파괴적 충돌 중재(CSMA/CR)를 뜯어봅니다.
  • Implement: 3개의 CAN 노드 객체(ID_A = 0x0A(00001010), ID_B = 0x0B(00001011), ID_C = 0x10(00010000))를 동시에 송신 상태로 두고 비트단위(Bit-wise) 시뮬레이터를 돌립니다. 버스의 상태는 노드들의 min(bit)(논리 AND)가 되고, 자기가 쏜 비트 1이 버스에선 0으로 관측된 순간 패배 플래그를 띄우며 송신을 중단(Lost Arbitration)해, 가장 낮은 ID(0x0A)만 통신 루프 끝까지 살아남는 궤적 덤프.

7. Terminology

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core)
Open-drain 출력이 '0'일 때는 접지되나 '1'일 때는 끊긴 상태로, 외부 풀업 저항에 의해 전위가 결정되는 회로 물리입니다. 기본 결선 방식 Pull-up Push-pull '그냥 1이 나가는 것' 아님 Industry Spec core
Full-duplex 데이터의 송신과 수신이 서로 독립된 전선을 통해 동시 물리적으로 가능한 방식입니다. 추천 소통 방향 SPI / Channel Half-duplex '속도가 2배'인 것은 아님 P1:CS2023/ES core
Baud rate 1초 동안 통신 선로를 통해 전송되는 물리적 실제 상태 변화(Symbol)의 횟수입니다. 실무 동기화 기준 BPS / Timing Frequency '비순수 데이터 속도'와 차이 Industry. Interface core
Dominant (지배적) CAN 버스에서 낮은 전압 차이가 높은 전압 차이를 물리적으로 덮어써서 버스 상태를 결정짓는 우위 현상입니다. 심화 충돌 중재 Arbitration Recessive '소프트웨어 우선순위'와 무관 Industry 11898 core

8. References

Primary

Secondary

  • [Art of Electronics] Horowitz & Hill — Deep dive into Open-drain & Signals.
  • [Controller Area Network (CAN) Basics] Microchip — Detailed CAN physics.

Industry

  • [NXP: I2C-bus specification and user manual] — The definitive I2C guide.
  • [Motorola: SPI Block Guide] — The original SPI standard.

9. Final Checklist

Primary

  • 'SPI' 통신이 'I2C'보다 물리적으로 수십 배 빠른 데이터 전송이 가능한 근본적인 이유(핀 구성, 동기 방식)를 설명 가능한가? (P1)
  • 'UART' 결선 시 송신(TX)과 수신(RX)을 왜 교차(Cross)해서 연결해야 하는지 물리적 경로 관점에서 입증할 수 있는 가? (P1)

Secondary

  • I2C 버스에 장치가 너무 많이 물렸을 때, '풀업 저항'의 임계값에 의해 신호의 상승 시간(Rise time)이 지연되어 통신이 깨지는 현상을 소통 가능한가?
  • CAN 버스에서 자신의 ID를 보내는 도중 타 장치의 'Dominant' 비트를 감지했을 때, 하위 장치가 왜 즉각 전송을 포기해야 하는지 물리적 정당성을 증명할 수 있는 가?

Industry

  • 노이즈가 심한 전기 자동차 엔진룸 부근의 센서 데이터 전송 시, 왜 SPI 대신 CAN이나 차분 신호 방식이 필수적인지 설득 근거를 제안할 수 있는 가? (SFIA)
  • 통신 모듈의 'Framing Error' 발생 시, 하드웨어 오실레이터의 온도 드리프트(Drift)로 인한 타이밍 오차 가능성을 진단할 수 있는 가?

Hardware-Software Interface Physics

4 / 6