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는 "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모드는 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"); |
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는 "get"명령을 이용하여 각종 상태정보를 확인 합니다.
SPI에서는 송신 또는 수신버퍼의 바이트 수를 다음과 같이 확인할 수 있습니다.
구분 | 문법 |
---|---|
송신버퍼 바이트 수 | pid_ioctl($pid, "get txlen"); |
수신버퍼 바이트 수 | pid_ioctl($pid, "get rxlen"); |
SPI 송신버퍼의 여유공간은 다음과 같이 확인할 수 있습니다. 반환 값의 단위는 바이트 입니다.
구분 | 문법 |
---|---|
송신버퍼 여유 공간 | pid_ioctl($pid, "get txfree"); |
SPI 데이터를 전송하도록 요청하는 명령어 입니다. 이 명령을 수행하기 전에 반드시 pid_write함수를 이용하여 버퍼에 송신할 데이터를 넣어줘야 합니다. 또한 데이터 전송이 완료 된 후, 전송한 데이터 크기만큼 pid_read함수를 이용하여 읽어야 합니다. 사용법은 다음과 같습니다.
구분 | 문법 |
---|---|
데이터 전송 요청 | pid_ioctl($pid, "req start"); |
SPI 통신이 원활하지 않을 때 이 명령으로 SPI 버스를 초기화 시킬 수 있습니다.
구분 | 문법 |
---|---|
버스 초기화 요청 | pid_ioctl($pid, "req reset"); |