MCP3202는 마이크로칩에서 나온 12bit ADC 칩이다.
에전에 쓰고 남은 것이 있어 SPI 테스트에 사용하기로 했다. 칩에 대한 자세한 설명은 스킵.
SPI 각 신호선을 연결하고 가변저항(10k-50k)을 돌렸을 때 각도에 비례하는 숫자 값을 읽어 낼 수 있으면 된다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <spidev_lib.h>
spi_config_t spi_config;
uint8_t tx_buffer[32];
uint8_t rx_buffer[32];
void main( void)
{
int spifd;
uint8_t ch = 0;
spi_config.mode=0;
spi_config.speed=8000000;
spi_config.delay=0;
spi_config.bits_per_word=8;
spifd=spi_open("/dev/spidev0.3",spi_config);
memset(tx_buffer,0,32);
memset(rx_buffer,0,32);
tx_buffer[0] = 1;
tx_buffer[1] = 0b101+ch;
tx_buffer[1] <<= 5;
tx_buffer[2] = 0;
spi_xfer(spifd,tx_buffer,3,rx_buffer,3);
printf("rx_buffer=%02x %02x %02x\n", rx_buffer[0], rx_buffer[1], rx_buffer[2]);
spi_close(spifd);
}
SPI는 대기 상태에서의 클럭 신호의 극성(CPOL), 데이터를 읽는 타이밍(CPHA)에 따라 4가지 모드가 있다.
코드에서 spi_config.mode 값으로 모드를 선택할 수 있다. MCP3202의 경우 기본값인 0을 그대로 사용하면 된다.
위 그림은 SCK와 Dout의 파형을 찍어본 것으로, 3 바이트의 데이터를 잘 읽어내고 있다.
배선을 바꿔가며 전체 5 개 SPI가 모두 다 잘 작동하는 것을 확인하였다.
[전체 시스템 구성]
시리얼과 SPI 테스트가 완료 되었으므로, 이것을 하나의 시스템으로 묶는 작업을 진행 하였다.
전단은 시리얼 인터페이스에서 한 글짜씩 읽어와 버퍼를 채우는 부분이고, 후단은 버퍼의 내용을 검색하여 명령 패킷을 확인하게 되면 이 명령을 SPI를 통해 서브 보드로 전달하는 형태가 된다.
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
int main() {
int num;
char buf[256];
if (open_serial_port("/dev/ttyAMA0", B115200) < 0) {
return -1;
}
spim_open();
while (TRUE)
{
num = read_serial_port(buf, 1);
if(num > 0){
serialHandler(buf[0]);
}
}
close_serial();
return 0;
}
메인루프는 간단한 루틴으로 되어있는데, 버퍼를 채우고 명령을 파싱하고 SPI를 가동하는 부분은 serialHandler()라는 함수에서 처리하게 된다. 이 함수의 코드는 명령 패킷의 구조와 같은 현 시스템에 특수한 부분과 대외비적인 내용이 포함되어 있으므로 올릴 수 없어 아쉽다.
이 부분이 정상적으로 동작하는 것을 확인하였으므로, 다음에는 시리얼 부분을 네트워크로 대치하는 방법을 알아볼 예정이다.
https://www.youtube.com/watch?v=L0phvgBeSxU&t=1707s
코딩할 때 듣는 BGM
'미니 프로젝트 > 라즈베리파이 REST API for SPI' 카테고리의 다른 글
라즈베리파이 4 UART 연결 테스트 (0) | 2023.07.21 |
---|---|
Flask 셋업과 액세스 테스트 - 바이너리 데이터 전송 (ft. chatGPT) (0) | 2023.05.15 |
C와 python 연결하기 - ctypes (0) | 2023.05.09 |
라즈베리파이 3 SPI 포트 5 개로 늘리기 (0) | 2023.05.04 |
라즈베리파이 3 UART 연결하기 (0) | 2023.05.04 |