Processor
【라즈베리파이】 wiringPi C 언어 : raspberryPI 간 SPI 통신
작성자 임베디드코리아
작성일 26-02-17 18:23
조회100회
댓글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
158-840 서울시 양천구 남부순환로 571(신월동, 영남타운 307호) l 대표: 박길성 ㅣ Tel:02-2695-1114 ㅣ Fax:02-2695-1113
Copyright © 2015 Embedded Korea. All Rights Reserved.