I2C를 설정하거나 사용하기 위해서는 pid_ioctl함수를 사용해야 합니다. I2C가 지원하는 pid_ioctl함수의 명령어 목록은 다음과 같습니다.
명령어 | 하위 명령어 | 설명 | |
---|---|---|---|
set | mode | sm | 모드 설정: 표준 모드 - 100 Kbps |
fm | 모드 설정: 고속 모드 - 400 Kbps | ||
daddr | [A] | 주소 설정: 로컬 슬레이브 디바이스 주소 | |
saddr | [A] | 주소 설정: 상대 슬레이브 디바이스 주소 | |
get | rxlen | 수신버퍼 바이트 수 확인 | |
txlen | 송신버퍼 바이트 수 확인 | ||
txfree | 송신버퍼 여유 공간 확인 | ||
error | nack | 마지막 트랜잭션의 NACK 횟수 확인 | |
bus | 마지막 트랜잭션의 BUS 오류 횟수 확인 | ||
state | 0 - 유휴상태, 그 외 - I2C 내부 동작 중 | ||
req | read | [N] | 읽기 요청 |
write | - | 쓰기 요청 | |
wait | 쓰기 요청 및 종료 대기 (후에 "req stop" 필요) | ||
stop | 쓰기 종료 (전에 "req wait" 필요) | ||
reset | 통신 상태 리셋 |
I2C는 "set"명령을 이용하여 통신모드와 슬레이브 디바이스 주소를 설정합니다.
PHPoC의 I2C는 표준모드와 고속모드를 지원하며 기본 값은 표준모드 입니다.
구분 | 문법 |
---|---|
표준모드 | pid_ioctl($pid, "set mode sm"); |
고속모드 | pid_ioctl($pid, "set mode fm"); |
I2C는 데이터를 전송할 슬레이브를 선택할 때 슬레이브 디바이스의 주소를 이용합니다. 슬레이브 디바이스 주소는 다음과 같이 설정할 수 있습니다.
구분 | 문법 |
---|---|
슬레이브 디바이스 주소 | pid_ioctl($pid, "set saddr [A]"); |
로컬 디바이스 주소 | pid_ioctl($pid, "set daddr [A]"); |
디바이스 주소 [A]는 16진수 2자리 형태로 입력해야 합니다. PHPoC의 I2C는 7비트 주소 지정방식을 사용하므로 LSB는 항상 0입니다. 참고로 몇몇 예약 된 주소들은 사용할 수 없습니다. 만일 이 주소들을 사용하면 PHPoC 에러가 발생합니다.
사용 불가능한 주소(2진수) | 예(16진수) | 비고 | |||||||
---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
X | X | X | X | X | X | X | 1 | E1, A3, 1B | LSB가 1 |
0 | 0 | 0 | 0 | X | X | X | X | 00 ~ 0F | 상위 4비트가 모두 0 |
1 | 1 | 1 | 1 | X | X | X | X | F0 ~ FF | 상위 4비트가 모두 1 |
I2C는 "get"명령을 이용하여 각종 상태정보를 확인 합니다.
I2C에서는 송신 또는 수신버퍼의 바이트 수를 다음과 같이 확인할 수 있습니다.
구분 | 문법 |
---|---|
송신버퍼 바이트 수 | pid_ioctl($pid, "get txlen"); |
수신버퍼 바이트 수 | pid_ioctl($pid, "get rxlen"); |
I2C 송신버퍼의 여유공간은 다음과 같이 확인할 수 있습니다. 반환 값의 단위는 바이트 입니다.
구분 | 문법 |
---|---|
송신버퍼 여유 공간 | pid_ioctl($pid, "get txfree"); |
I2C에서는 마지막 트랜잭션의 NACK 또는 버스 에러 횟수를 확인할 수 있습니다.
구분 | 문법 |
---|---|
NACK | pid_ioctl($pid, "get error nack"); |
버스 에러 | pid_ioctl($pid, "get error bus"); |
I2C의 상태는 다음과 같이 확인할 수 있습니다. I2C는 유휴 상태일 때 0을 반환하고, 유휴상태가 아닌 경우에는 0이 아닌 값을 반환합니다.
구분 | 문법 |
---|---|
상태 확인 | pid_ioctl($pid, "get state"); |
I2C 마스터가 슬레이브로 읽기 데이터를 전송하도록 요청하는 명령어 입니다. 이 명령을 수행한 후 슬레이브의 응답 데이터가 정상적으로 버퍼에 수신되면 pid_read함수를 이용하여 그 내용을 읽을 수 있습니다.
구분 | 문법 |
---|---|
읽기 요청 | pid_ioctl($pid, "req read [N]"); |
위 문법에서 [N]은 읽고자 하는 데이터의 바이트 수를 의미합니다.
I2C 마스터가 슬레이브로 쓰기 데이터를 전송하도록 요청하는 명령어 입니다. 쓰기 요청에는 다음과 같이 두 가지 방법이 있습니다.
구분 | 문법 |
---|---|
쓰기 요청 | pid_ioctl($pid, "req write"); |
쓰기 요청 및 종료 대기 | pid_ioctl($pid, "req write wait"); |
쓰기 종료 요청 | pid_ioctl($pid, "req stop"); |
"req write"명령은 수행되면 바로 데이터를 송신합니다. 따라서 명령 수행 전에 반드시 버퍼에 송신할 데이터를 넣어줘야 합니다. 반면 "req write wait"명령은 버스 상태를 전송 시작 조건으로 만들고 "req stop"명령이 수행 될 때까지 종료 조건으로 만들지 않습니다. 따라서 데이터 "req stop"명령이 수행되기 전까지 pid_write함수를 이용해 계속해서 데이터를 전송할 수 있습니다.
버스 에러 등에 의해 통신이 원활하지 않을 때 이 명령으로 I2C 통신을 초기화 시킬 수 있습니다.
구분 | 문법 |
---|---|
초기화 요청 | pid_ioctl($pid, "req reset"); |