Processor

【라즈베리파이】 wiringPi C 언어 : raspberryPI 간 SPI 통신

작성자 임베디드코리아 작성일26-02-17 18:23 조회111회 댓글0건
◆ 라즈베리파이 간 SPI 통신은 Master-Slave 구조로/dev/spidev0.0 장치 파일을 통해 C언어로 구현한다.
◆ wiringPi 또는 리눅스 표준 ioctl API를 사용한다.
◆ 4선(MOSI, MISO, SCLK, CE0)과 접지(GND)를 연결한다.
◆ raspi-config에서 SPI를 활성화한 후 spidev.h를 통해 데이터를 송수신한다

■ 라즈베리파이 2대 연결 (GPIO 핀)
Master MOSI (GPIO 10)  >  Slave MOSI (GPIO 10)
Master MISO (GPIO 9)    >  Slave MISO (GPIO 9)
Master SCLK (GPIO 11)    >  Slave SCLK (GPIO 11)
Master CE0 (GPIO 8)      >  Slave CE0 (GPIO 8)
GND                          >  GND

--->>> 예제 : spi_test.c  <<<------------------------------------
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <string.h>

int main() {
    int fd;
    uint8_t mode = SPI_MODE_0;
    uint8_t bits = 8;
    uint32_t speed = 500000; // 500kHz
   
    // SPI 장치 열기
    fd = open("/dev/spidev0.0", O_RDWR);
    if (fd < 0) return -1;

    // SPI 설정
    ioctl(fd, SPI_IOC_WR_MODE&mode);
    ioctl(fd, SPI_IOC_WR_BITS_PER_WORD&bits);
    ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ&speed);

    // 전송할 데이터 및 수신 버퍼
    uint8_t tx[] = {0x01, 0x02, 0x03, 0x04};
    uint8_t rx[4] = {0};

    struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx.rx_buf = (unsigned long)rx.len = 4.speed_hz = speed.bits_per_word = bits};

    // 데이터 송수신 (Full-duplex)
    if (ioctl(fd, SPI_IOC_MESSAGE(1)&tr) < 1) {
        perror("SPI transfer failed");
    }

    printf("Received: %02X %02X %02X %02X\n", rx[0], rx[1], rx[2], rx[3]);

    close(fd);
    return 0;
}
-----------------------------------------------------------------------------------------------
$ gcc  -o  spi_test  spi_test.c
$ sudo  ./spi_test