시간 제한
메모리 제한
시간 제한
1초
메모리 제한
128 MB
I2C(Inter-Integrated Circuit)는 메인보드, 임베디드 시스템, 휴대전화 같은 장치에 저속 주변 장치(약 100 kbit/sec)를 연결할 때 쓰는 직렬 통신 프로토콜이다. 하나의 I2C 데이터 버스에는 여러 장치가 붙을 수 있으며, 각 장치는 서로 다른 7비트 주소를 가진다. I2C의 장점 중 하나는 SCL(클록)과 SDA(데이터) 두 신호선만 필요하다는 점이다. SCL 클록 하나마다 SDA 선에 데이터 1비트가 놓인다. 보통 버스의 한 장치는 마스터가 되고, 나머지 장치는 슬레이브가 된다. 마스터는 트랜잭션 안에 주소를 실어 특정 슬레이브와의 통신을 시작한다.
I2C 버스에 아무 활동이 없으면 SCL과 SDA는 모두 높은 상태(1)이다. 마스터는 SCL이 높은 상태(1)일 때 SDA를 낮은 상태(0)로 끌어내려 트랜잭션을 시작한다. 이것을 START 비트라고 한다. 이때 버스의 모든 슬레이브는 이후 신호가 자신을 향한 것인지 확인해야 한다. 그다음 마스터는 원하는 슬레이브 주소 7비트를 최상위 비트부터 한 비트씩 보낸다. 각 비트는 SCL을 낮추고(0), SDA에 다음 비트 값을 놓은 뒤, SCL을 놓아 다시 높게(1) 만드는 방식으로 전송된다. 슬레이브는 SCL이 높아지는 순간 SDA 값을 읽는다. 주소 7비트를 보낸 뒤에는 같은 방식으로 비트 하나를 더 보낸다. 이 비트는 마스터가 해당 슬레이브에서 읽을지(1), 쓸지(0)를 나타낸다. 슬레이브가 버스에 나타난 주소가 자기 주소임을 인식하면, 준비되었음을 알리기 위해 SDA를 낮게 끌어내려 ACK를 보낸다. 마스터는 다음에 클록을 높일 때 이 ACK를 확인한다. ACK가 없으면 지정한 주소의 슬레이브가 존재하지 않는다는 뜻이다. 어떤 장치도 신호를 낮게 끌어내리지 않으면 신호는 기본적으로 높은 상태가 된다. 장치가 신호를 놓으면 그 신호는 높아진다.
데이터는 항상 8비트 바이트 단위로, 최상위 비트부터 한 비트씩 전송된다. 각 바이트 뒤에는 슬레이브가 SDA를 낮게 끌어내려 ACK를 보내야 한다. 슬레이브가 다음 데이터 바이트를 송신하거나 수신할 준비가 되어 있지 않다면 SCL을 낮게 끌어내릴 수 있다. 그러면 마스터는 슬레이브가 준비될 때까지 기다린다. 슬레이브는 SDA를 낮게 만들고 SCL을 놓아 높아지게 하여 준비되었음을 나타낸다. 이후 다음 바이트를 전송할 수 있다. 이 과정은 마스터가 모든 데이터 전송이 끝났다고 판단할 때까지 반복된다. 끝나면 마스터는 SCL이 높은 상태에서 SDA를 높게 만들어 STOP 비트를 보낸다.
주어진 I2C 버스 신호 표본을 분석하여 각 트랜잭션의 내용을 출력하는 프로그램을 작성하라.
첫 줄에는 데이터 세트의 수 P가 주어진다. 1 ≤ P ≤ 1000이다.
각 데이터 세트는 하나의 I2C 트랜잭션을 나타내는 여러 줄로 이루어진다. 데이터 세트의 첫 줄에는 해당 트랜잭션의 신호 표본 수 S가 주어진다. 1 ≤ S ≤ 1161이다.
그 뒤에는 신호 표본들이 주어진다. 각 표본은 순서대로 SCL과 SDA를 나타내는 두 개의 이진 문자로 이루어진다. 표본을 담은 각 줄에는 40개의 표본이 들어가며, 마지막 줄에는 그보다 적은 표본이 들어갈 수 있다.
각 데이터 세트마다 트랜잭션 설명 한 줄을 출력한다. 가능한 설명은 정상 2가지와 오류 4가지뿐이다.
정상인 경우:
WRITE OF n BYTES TO SLAVE xxREAD OF n BYTES FROM SLAVE xx오류인 경우:
ERROR NO START BITERROR NO STOP BITERROR NO ACK FROM SLAVE xxERROR NO ACK FOR DATAn은 데이터 바이트 수를 나타내는 십진 정수이며, 범위는 1부터 128까지이다.
xx는 슬레이브 주소를 나타내는 두 자리 16진수 값이며, 범위는 00부터 7F까지이다.
ERROR NO ACK FROM SLAVE xx는 주소를 보낸 뒤 ACK가 없을 때 출력한다.
ERROR NO ACK FOR DATA는 데이터 바이트 뒤에 ACK가 없을 때 출력한다.
오류가 여러 개라면 가장 먼저 감지한 오류만 출력한다.