1. SPI (Serial Peripheral Interface) 통신이란?
SPI는 마이크로컨트롤러(MCU)와 주변 장치(센서, 메모리, 디스플레이 등) 간에 아주 빠르게 데이터를 주고받기 위해 사용하는 동기식 직렬 통신 방식입니다.
쉽게 비유하자면, 사장님(Master)과 직원(Slave) 간의 1:1 컨베이어 벨트 작업이라고 볼 수 있습니다.
SPI 통신의 4가지 핵심 선(가닥):
- SCK (Serial Clock): 사장님이 "하나, 둘, 하나, 둘" 박자를 맞춰주는 선입니다. 이 클럭 속도에 맞춰 통신이 이루어지므로 아주 고속 통신이 가능합니다.
- MOSI (Master Out Slave In): 사장님(Master)이 직원(Slave)에게 지시사항(데이터)을 보내는 선입니다.
- MISO (Master In Slave Out): 직원(Slave)이 사장님(Master)에게 결과물(데이터)을 보내는 선입니다.
- SS 또는 CS (Slave Select / Chip Select): 사장님이 여러 직원 중 "이번엔 너랑 작업할 거야"라고 특정 직원을 지목하는 선입니다.
단계별 통신 과정:
1단계: Master가 통신하고 싶은 Slave의 SS 핀을 신호(보통 Low)를 주어 깨웁니다.
2단계: Master가 SCK 선으로 일정한 박자(클럭)를 만들어냅니다.
3단계: 박자에 맞춰 MOSI 선으로 데이터를 밀어내고, 동시에 MISO 선으로 데이터를 빨아들입니다. (마치 컨베이어 벨트가 돌면서 물건을 동시에 교환하는 것과 같습니다 - Full Duplex 방식)
2. DMA (Direct Memory Access)란 무엇인가?
SPI 통신은 아주 빠릅니다. 하지만 이 빠른 속도 때문에 한 가지 문제가 발생합니다. 바로 CPU가 너무 바빠진다는 것입니다.
DMA가 없을 때 (CPU의 고군분투): SPI로 1,000개의 데이터를 보내야 한다고 가정해 봅시다.
- CPU가 메모리에서 데이터 1개를 꺼냅니다.
- CPU가 그 데이터를 SPI 전송 장치에 넣습니다.
- 전송이 끝날 때까지 기다립니다.
- 이 과정을 1,000번 반복합니다. 결국 CPU는 데이터 나르는 단순 노동을 하느라 다른 복잡한 연산이나 중요한 제어를 하나도 하지 못하게 됩니다.
DMA (직접 메모리 접근)의 등장 (택배 알바생 고용): DMA는 CPU를 대신해서 메모리와 주변 장치(SPI 등) 간의 데이터 이동을 전담하는 **'하드웨어 알바생'**입니다.
단계별 DMA 동작 과정:
1단계 (명령): CPU가 DMA 알바생에게 명령합니다. "메모리 1번지부터 1000번지까지 있는 데이터를 SPI 모듈로 보내. 난 다른 일 하러 갈 테니 다 끝나면 알려줘."
2단계 (자동 전송): CPU는 즉시 다른 복잡한 코드(예: 센서 데이터 분석, 모터 제어 등)를 실행하러 떠납니다. 그 사이 DMA는 메모리에 **직접(Direct) 접근(Access)**하여 데이터를 꺼내 SPI 모듈로 척척 보냅니다.
3단계 (완료 보고): 1,000개 전송이 모두 끝나면 DMA가 CPU에게 "사장님, 작업 다 끝났습니다!"라고 인터럽트(Interrupt) 신호를 보내 알려줍니다.
💡 요약
- SPI는 장치 간에 데이터를 고속으로 교환하는 컨베이어 벨트(통신 규약)입니다.
- DMA는 CPU 대신 그 컨베이어 벨트에 물건을 올리고 내리는 단순 반복 작업을 전담하는 자동화 기계입니다.
- 이 둘을 합치면 "CPU 부하 없이 아주 빠른 속도로 대용량 데이터를 처리"할 수 있게 됩니다.
아래 시뮬레이터를 통해 CPU가 직접 데이터를 전송할 때와 DMA가 대신 전송할 때 시스템이 어떻게 다르게 동작하는지 직접 확인해 보세요.
임베디드 시스템에서 데이터를 빠르게 주고받는 것은 매우 중요합니다. 특히 SPI(Serial Peripheral Interface)는 높은 클럭 속도를 지원하여 다양한 고속 통신에 널리 사용됩니다.
문제는 통신 속도가 빠를수록 CPU가 데이터를 하나하나 옮기느라 쉴 틈 없이 일해야 한다는 점입니다. 이때 CPU의 짐을 덜어주는 구원투수가 바로 DMA(Direct Memory Access)입니다.
- CPU 직접 전송: CPU가 매번 데이터를 메모리에서 꺼내 SPI로 보냅니다. 전송 중에는 다른 일을 거의 못 합니다.
- DMA 기반 전송: CPU는 DMA에게 전송을 지시하고 떠납니다. 전송은 DMA가 전담하고, CPU는 그동안 복잡한 제어 로직을 처리합니다.

