add_library(spidev-lib src/spidev_lib.c)
add_library(spidev-lib++ src/spidev_lib++.cc)
add_library(spidev-lib SHARED src/spidev_lib.c)
add_library(spidev-lib++ SHARED src/spidev_lib++.cc)
cd build
cmake ..
make
make install
//spidev_lib.c
...
int spi_open(char *device, spi_config_t config){
#if 0
//기존 코드
...
#else
return config.bits_per_word;
}
int spi_xfer(int fd, uint8_t *tx_buffer, uint8_t tx_len, uint8_t *rx_buffer, uint8_t rx_len){
#if 0
//기존 코드
...
#else
return tx_buffer[0];
}
SPI 라이브러리에서는 초기 설정을 위해서 다음과 같은 구조체를 사용하고 있다.
typedef struct{
uint8_t mode;
uint8_t bits_per_word;
uint32_t speed;
uint16_t delay;
} spi_config_t;
파이썬 ctypes에서는 C와 연동을 위한 구조체를 class로 만들도록 되어있다. 상세한 내용은 상단의 파이썬 문서에 잘 정리되어 있는데, 쉽게 이해가 되는 내용은 아닌 것 같다.
아무튼 어찌어찌해서 다음과 같은 파이썬 테스트 코드를 만들게 되었다.
from ctypes import *
class SpiConfig(Structure):
_fields_ = [("mode", c_ubyte),
("bits_per_word", c_ubyte),
("speed", c_ulong),
("delay", c_uint)]
spi = CDLL("/usr/local/lib/libspidev-lib.so")
sdev = create_string_buffer(b"/dev/spidev0.0")
config = SpiCOnfig(0, 8, 4000000, 0)
fd = spi.spi_open(byref(sdev), config)
print(fd)
이 부분에서 문서를 잘 읽고 주의를 기울인 부분은
1) 각 변수의 타입 설정하는 법 c_ubyte, ...
2) 스트링의 메모리를 할당 하는 법 create_string_buffer()
3) 함수 파라미터로 포인터 전달 하는 방법 byref()
등등 이었다.
spi_open() 함수를 호출하였고 일단 파라미터는 잘 전달 된 것을 확인했다.
시스템마다 변수 타입에 따라 그 크기가 다를 수 있기 때문에 이 부분이 어떻게 처리되는지 걱정이 됐는데 별 문제는 없었다.
2. 배열 처리
다음과제는 실제 전송을 하는 부분인 spi_xfer()였는데, 이 함수의 파라미터에는 송수신을 위한 두 개의 버퍼가 사용되고 있다. 역시 문서를 참고해서 각각의 크기가 64개인 버퍼를 만들고 파라미터로 넘기는 테스트를 진행했다.
Buffer = c_ubyte * 64
TxBuffer = Buffer()
RxBuffer = Buffer()
TxBuffer[0] = 56
TxBuffer[1] = 78
ret = spi.spi_xfer(0, byref(TxBuffer), 2, byref(RxBuffer), 2)
print(ret)
Buffer는 64 바이트 크기의 배열 타입을 정의한 것이고,
이를 이용해서 TxBuffer와 RxBuffer를 만들었다. 테스트를 위해서 특정한 값을 써놓고 리턴값으로 받아 확인했는데, 역시 별 문제 없이 잘 되었다.
중요한 두 개의 함수를 부르는 데 큰 문제가 없는 듯 하니 이 방법으로 코딩을 계속 진행하기로 하였다.
'미니 프로젝트 > 라즈베리파이 REST API for SPI' 카테고리의 다른 글
라즈베리파이 4 UART 연결 테스트 (0) | 2023.07.21 |
---|---|
Flask 셋업과 액세스 테스트 - 바이너리 데이터 전송 (ft. chatGPT) (0) | 2023.05.15 |
라즈베리파이 3 SPI 테스트 (0) | 2023.05.04 |
라즈베리파이 3 SPI 포트 5 개로 늘리기 (0) | 2023.05.04 |
라즈베리파이 3 UART 연결하기 (0) | 2023.05.04 |