I2C 설정 및 사용


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 설정

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 상태 읽기

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 사용

읽기 요청

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");