SPI 설정 및 사용


SPI를 설정하거나 사용하기 위해서는 pid_ioctl함수를 사용해야 합니다. SPI가 지원하는 pid_ioctl함수의 명령어 목록은 다음과 같습니다.

명령어 하위 명령어 설명
set lsb 0 데이터 전송 순서 설정: MSB 먼저 전송
1 데이터 전송 순서 설정: LSB 먼저 전송
data 8 데이터 전송 단위 설정: 8비트 단위 전송
16 데이터 전송 단위 설정: 16비트 단위 전송
div [N] 분주비 설정, 2/4/8/16/32/64/128/256
mode [M] 모드 설정: 0/1/2/3
nss id [N] 슬레이브 선택, 0 ~ 7
dev uio0 #pin 슬레이브 선택 핀(SS) 설정
get rxlen 수신버퍼 바이트 수 확인
txlen 송신버퍼 바이트 수 확인
txfree 송신버퍼 여유 공간 확인
req start 데이터 전송 요청
reset 통신 상태 리셋

SPI 설정

SPI는 "set"명령을 이용하여 통신모드, 데이터 전송 순서, 데이터 전송 단위 및 통신 속도를 설정합니다.

데이터 전송 순서 설정

PHPoC의 SPI 데이터 전송 순서는 0또는 1 중 하나를 선택할 수 있으며 데이터 전송 순서를 설정하지 않았을 때 사용하는 기본 값은 0입니다. 0은 MSB부터 먼저 전송하는 것을 의미합니다. 설정 방법은 다음과 같습니다.

구분 문법
MSB > LSB pid_ioctl($pid, "set lsb 0");
LSB > MSB pid_ioctl($pid, "set lsb 1");

데이터 전송 단위 설정

PHPoC의 SPI 데이터 전송 단위는 8비트 또는 16비트 중 하나를 선택할 수 있으며 기본 값은 8입니다. 설정 방법은 다음과 같습니다.

구분 문법
8비트 pid_ioctl($pid, "set data 8");
16비트 pid_ioctl($pid, "set data 16");

데이터 통신 속도 설정

데이터 통신 속도 설정 값은 PHPoC의 기본 클록의 분주비가 되며 2 / 4 / 8 / 16 / 32 / 64 / 128 / 256 중 하나를 선택할 수 있습니다. 기본 값은 256이며 설정 방법은 다음과 같습니다.

구분 문법
N분의 1 pid_ioctl($pid, "set div N");

※ P4S-341/P4S-342는 기본 클록이 42MHz이므로 분주비가 256일 때 통신속도는 약 164Kbps 입니다.

SPI 모드

SPI모드는 0부터 3까지 중 하나를 선택하여 설정합니다. 기본 값은 3이며 설정 방법은 다음과 같습니다.

구분 문법
모드 0 pid_ioctl($pid, "set mode 0");
모드 1 pid_ioctl($pid, "set mode 1");
모드 2 pid_ioctl($pid, "set mode 2");
모드 3 pid_ioctl($pid, "set mode 3");

슬레이브 선택 및 SS 핀 설정

PHPoC가 둘 이상의 슬레이브와 통신할 때 "set nss id"명령을 이용해 슬레이브를 선택할 수 있습니다. PHPoC는 최대 8개의 SPI슬레이브와 통신할 수 있습니다. 따라서 아이디는 0 ~ 7사이에서 선택 가능하며 기본값은 0입니다.

구분 문법
N번째 슬레이브 아이디 선택 pid_ioctl($pid, "set nss N");

슬레이브 아이디 1 ~ 7을 위한 슬레이브 선택 핀(SS)은 "set nss dev"명령을 이용해 설정할 수 있습니다. 명령어 뒤에는 사용할 uio디바이스 이름과 핀번호가 지정되어야 합니다.

pid_ioctl($pid, "set nss id 1");
pid_ioctl($pid, "set nss dev uio0 4");
pid_ioctl($pid, "set nss id 2");
pid_ioctl($pid, "set nss dev uio0 5");
...

※참고: 슬레이브 아이디 0의 슬레이브 선택 핀(SS)은 uio0의 0번핀이 사용되며 다른 핀으로 변경할 수 없습니다.

SPI 상태 읽기

SPI는 "get"명령을 이용하여 각종 상태정보를 확인 합니다.

송/수신 버퍼 바이트 수 읽기

SPI에서는 송신 또는 수신버퍼의 바이트 수를 다음과 같이 확인할 수 있습니다.

구분 문법
송신버퍼 바이트 수 pid_ioctl($pid, "get txlen");
수신버퍼 바이트 수 pid_ioctl($pid, "get rxlen");

송신버퍼 여유공간 확인

SPI 송신버퍼의 여유공간은 다음과 같이 확인할 수 있습니다. 반환 값의 단위는 바이트 입니다.

구분 문법
송신버퍼 여유 공간 pid_ioctl($pid, "get txfree");

SPI 사용

데이터 전송 요청

SPI 데이터를 전송하도록 요청하는 명령어 입니다. 이 명령을 수행하기 전에 반드시 pid_write함수를 이용하여 버퍼에 송신할 데이터를 넣어줘야 합니다. 또한 데이터 전송이 완료 된 후, 전송한 데이터 크기만큼 pid_read함수를 이용하여 읽어야 합니다. 사용법은 다음과 같습니다.

구분 문법
데이터 전송 요청 pid_ioctl($pid, "req start");

버스 초기화 요청

SPI 통신이 원활하지 않을 때 이 명령으로 SPI 버스를 초기화 시킬 수 있습니다.

구분 문법
버스 초기화 요청 pid_ioctl($pid, "req reset");