Processor

【라즈베리파이】 라즈베리파이 2대 SPI 통신

작성자 임베디드코리아 작성일26-05-22 14:09 조회71회 댓글0건
-라즈베리파이 끼리의 SPI 통신은 한 대를 Master, 다른 한 대를 Slave로 설정하여 진행합니다.
- 라즈베리파이는 기본적으로 Master 모드만 지원하므로, Slave 역할을 수행하려면 커널 모듈 설정 변경 및 추가적인 핀(GPIO) 배선이 필요합니다.
1. 핀(Pin) 연결도
Master와 Slave 라즈베리파이의 핀을 다음과 같이 다이렉트로 연결합니다.
MOSI (Master Out Slave In) <---> MOSI
MISO (Master In Slave Out) <---> MISO
SCLK (Clock) <---> SCLK
CE0/1 (Chip Enable) <--->  GPIO 핀 (Slave의 CS 역할로 사용)
GND <---> GND (접지 필수)

2. Slave 설정 (수신기)
라즈베리파이는 기본적으로 하드웨어 슬레이브를 지원하지 않으므로, 기기 트리(Device Tree) 오버레이 설정이 필요합니다.
1) 터미널 창을 열고 /boot/firmware/config.txt 파일을 엽니다.
2) 파일 맨 아래에 dtoverlay=spi-slave를 추가하고 저장합니다.
3) 라즈베리파이를 재부팅합니다.

3. 통신 테스트 파이썬 코드
파이썬의 spidev 라이브러리를 활용하여 통신을 주고받을 수 있습니다.
Master 라즈베리파이 (송신 및 수신):

---< SPI_master.py >-----------------------------
import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0) # SPI bus 0, device 0 (CE0)
spi.max_speed_hz = 500000

try:
    while True:
        # 보낼 데이터 리스트 (0~255)
        to_send = [0x01, 0x02, 0x03]
       
        # 데이터 송신 및 수신
        received = spi.xfer2(to_send)
        print(f"Master가 보낸 데이터: {to_send}")
        print(f"Master가 받은 응답: {received}")
       
        time.sleep(1)
except KeyboardInterrupt:
    spi.close()
---------------------------------------------------------
Slave 라즈베리파이 (수신 및 응답):
---< SPI_slave.py >----------------------------
import spidev
import time

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 500000

# Slave 모드 활성화를 위한 설정 추가
spi.mode = 0b00
spi.bits_per_word = 8

try:
    print("Slave 대기 중...")
    while True:
        # Master의 클럭에 맞춰 데이터 읽기
        received = spi.readbytes(3)
        if received:
            print(f"Slave가 받은 데이터: {received}")
           
            # Master로 보낼 데이터 업데이트
            to_send = [0xAA, 0xBB, 0xCC]
            spi.writebytes(to_send)

except KeyboardInterrupt:
    spi.close()
--------------------------------------------------