연구노트/통신 설계

[I2C/SPI] SPI 통신 실험 || 아두이노 간 문자 주고 받기

ipmes 2026. 7. 31. 10:32

 

 


 

 

통신 실험

아두이노 간 문자 주고 받기

 


 

 


1부 [I2C/SPI] I2C, SPI 통신 || 간단히 알아보는 특징
2부 [I2C/SPI] I2C 통신원리 || 구조부터 통신 과정까지
3부 [I2C/SPI] SPI 통신원리 || 신호선부터 원리까지
4부 [I2C/SPI] I2C 통신 실험 || 아두이노 간 통신하기
完 [I2C/SPI] SPI 통신 실험 || 아두이노 간 문자 주고 받기

 


 

실험 구성과 통신 흐름

이번 실험은 아두이노 2대를 이용하여 SPI 통신을 구성하고, MASTER에서 전송한 문자 데이터를 SLAVE가 수신하여 시리얼로 출력하는 방식으로 진행됩니다.

 

통신 흐름은 다음과 같습니다.

 

Master

SPI.begin()으로 SPI를 초기화하고, SS 핀을 OUTPUT으로 설정하여 통신 시작/종료를 제어할 준비를 합니다.

루프마다 SS 핀을 LOW로 내려 SLAVE를 선택한 뒤, 문자 데이터를 1바이트씩 SLAVE로 전송합니다.

전송이 끝나면 MASTER는 SS 핀을 다시 HIGH로 올려 통신을 종료하고, 시리얼 모니터에 전송한 문자를 출력합니다.

 

이 과정을 통해 Master는 'A'에서 시작해 매 루프마다 1씩 증가하며, 'Z'를 초과하면 다시 'A'로 돌아가 1초 간격으로 반복 전송됩니다.

 

Slave

SLAVE는 MISO 핀을 OUTPUT으로 설정하고, SPCR 레지스터로 SPI 하드웨어를 Slave 모드로 활성화하여 통신을 받을 준비를 합니다.

이어서 SPI 인터럽트를 설정해두면, MASTER가 보낸 데이터가 들어올 때마다 인터럽트가 자동으로 발생하여 데이터를 수신합니다.

수신이 완료되면 SPDR 레지스터의 데이터를 변수에 저장하고, 플래그를 true로 설정하여 메인 루프에 새 데이터 도착을 알립니다.

 

이 과정을 통해 SLAVE는 플래그가 true가 될 때마다 플래그를 다시 false로 초기화한 뒤, 수신한 문자를 시리얼 모니터에 출력합니다.


 

주의사항 및 실험 환경에 대해

 

연결은 다음 사항을 참고합니다.

 

1. SPI는 신호선이 4개(SS, SCK, MOSI, MISO)이므로, 같은 이름의 선끼리 연결합니다.

 

MASTER의 SS ↔ SLAVE의 SS

MASTER의 SCK ↔ SLAVE의 SCK

MASTER의 MOSI ↔ SLAVE의 MOSI

MASTER의 MISO ↔ SLAVE의 MISO

 

I2C처럼 SDA-SDA, SCL-SCL로 같은 선끼리 연결하는 방식과 동일하게, SPI도 SS-SS, SCK-SCK, MOSI-MOSI, MISO-MISO로 같은 이름의 선끼리 연결해야 정상적으로 통신이 이루어집니다.

 

2. 두 아두이노의 GND는 공통으로 연결합니다.

SPI 또한 두 장치가 동일한 기준 전압을 공유해야 하므로, GND를 공통으로 연결하지 않으면 데이터가 정상적으로 인식되지 않을 수 있습니다.

 

 

 

사용될 라이브러리의 함수와 레지스터

 

실제로 통신을 해보자

이번 준비물은 아두이노 간 데이터를 송수신만 하기 때문에 아두이노 2대만 준비합니다.

 

 

위 사진과 같이 회로를 구성하면 준비는 완료됩니다.

이 상태에서 아두이노는 Master - Slave 구조로 데이터를 주고 받게 됩니다.

 

해당 배선이 실제로 구현된 모습입니다.

 

//Master 코드 입니다.
#include <SPI.h>

char sendChar = 'A';

void setup()
{
  Serial.begin(9600);

  pinMode(SS, OUTPUT);

  SPI.begin();
}

void loop()
{
  digitalWrite(SS, LOW);

  SPI.transfer(sendChar);

  digitalWrite(SS, HIGH);

  Serial.print("Send : ");
  Serial.println(sendChar);

  sendChar++;

  if (sendChar > 'Z')
    sendChar = 'A';

  delay(1000);
}

 

//Slave 코드 입니다.
#include <SPI.h>

volatile bool waitingData = false;
volatile char receiveChar;

void setup()
{
  Serial.begin(9600);

  pinMode(MISO, OUTPUT);

  SPCR |= _BV(SPE);
  SPI.attachInterrupt();
}

ISR(SPI_STC_vect)
{
  receiveChar = SPDR;
  waitingData = true;
}

void loop()
{
  if (waitingData)
  {
    waitingData = false;

    Serial.print("Receive : ");
    Serial.println(receiveChar);
  }
}

 

아두이노가 2대이기 때문에 상단 코드는 Master 역할을 할 아두이노에,

하단 코드는 Slave 역할을 할 아두이노에 넣으시면 됩니다.

 

 

해당 과정을 통해 Master와 Slave 역할을 하여 문자 데이터 'A~Z' 를 반복하여 송수신하는 과정을 확인할 수 있습니다.

 

실제 통신 사례

 

지금까지 5부에 걸쳐 I2C와 SPI 통신에 대해 알아보고, 각 방식으로 데이터를 송수신하는 동작 과정까지 직접 확인해보았습니다.

UART와 마찬가지로 I2C와 SPI 역시 활용되지 않는 곳을 찾기 어려울 정도로 다양한 분야에 폭넓게 적용되고 있습니다.

 

SPI를 비롯한 다양한 통신 프로토콜 구현 사례와 임베디드 관련 프로젝트 포트폴리오는 아래 링크에서 확인하실 수 있습니다.

 

https://ipmes.tistory.com/category/%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4

 

'포트폴리오' 카테고리의 글 목록

임베디드 시스템 ||PCB 설계 제작 |||펌웨어 개발 ||신호처리 ||응용프로그램 ||| 문의 ipmes@ipmes.co.kr ||| 010-9891-7244 , 062-226-1777

ipmes.tistory.com

 

 




TEL (062-226-1777, 010-9891-7244), E-mail (ipmes@ipmes.co.kr)

임베디드 시스템 | PCB 설계 제작 | 펌웨어 개발 | 신호처리 | 응용프로그램

 

#IPMES, #아이피엠이에스, #연구노트, #임베디드, #PCB제작, #펌웨어개발,

#하드웨어개발, #소프트웨어개발, #회로설계,

#광주PCB, #광주시제품, #광주시제품개발, #광주OEM, #광주광역시PCB,

#광주임베디드, #광주음성처리, #광주신호처리, #광주광역시임베디드,

#광주회로설계, #광주아트웍, #PCB샘플링