1. I2C 통신에 대해
기본적으로 쓰이던 직렬 통신 USART는 1:1로만 쓰인다. 그러므로 여러 장치와 연결하려면 그에 대응하는 여러 개의 송수신기가 필요하므로 하드웨어에서 제약이 있다. 이를 개선하도록 송신과 수신을 묶고 이것과 클럭 두 회선에서 분기하여 또 다른 장치를 연결하는 통신이 1980년대에 필립스(Philips)사에 의해 개발되었는데 이를 I2C([아이-스퀘어-씨] 또는 IIC, Inter-Integrated Circuit : 상호 통합형 회로)라고 부른다. 이 I2C 통신에 대해 알아본다.
2. I2C 통신 결선도
그림과 같이 I2C의
결선도는 SCL(Serial Clock)끼리, SDA(Serial
Data)끼리 연결하고 두 회선에 풀업 저항기를 추가한다. 그리고 클럭을 한 장치가 관리하고
이것을 클럭과 함께 송신하는 장치가 제어장치(Controller), 클럭을 받아 데이터를 응답하는 장치가
대상장치(Target)가 된다. 더불어 한 회선에서 송신과
수신을 하는 동기식 반이중 통신이다.
SCL과 SDA 모두 출력이 오픈 콜렉터(Open
Collector) 또는 오픈 드레인(Open Drain)방식이기에 외부에 풀업 저항기가
반드시 필요하다. 그렇지만 이 저항치의 계산을 하기보다 일반적인 2.2
kΩ, 3.3 kΩ, 4.7 kΩ 등의 값을
적당히 결정한다. 속도는 몇 가지로 구분된 모드가 있으므로 대상장치가 지원하는 모드에 맞추어 사용한다.
그림과 같이 통신을 1:1에서 1:N으로 변경되도록 대상장치를 추가한다. 대상장치가 2대로 될 때도 두 회선을 동일하게 분기해 연결하되 저항은
별도의 추가가 없다. 대상장치의 개수를 3대 이상으로 증가시켜
최대 127개(7-bit 주소 방식) 또는 1023개(10-bit 주소
방식)까지 가능하다. 단,
분기된 회선이 많아지면 회선상의 커패시턴스 문제로 저항기의 값을 조정해야 할 수도 있다.
참고로 I2C 통신은 N:N 방식으로 제어장치가 2대 이상인 경우도 존재하는데 클럭과 데이터의
상태를 판단하여 제어의 우선권을 가져가서 제어하는 방식이다. 제어장치1과
제어장치2로 구분한다 할 때, 제어장치1이 데이터를 전송하는 중에 제어장치2는 대기하고 있다가 데이터의 전송의
종료가 확인되면 제어권을 가져가는 것이다.
3. I2C 통신의 동작 모드
지원하는 속도에 따라 5 가지의 이름으로 구분하여 사용한다. 대상장치가 어떤 모드를 지원한다면 그 이하의 속도로 동작한다는 의미이지만 I2C 통신의 데이터 프레임이 상당히 길기 때문에 가능한 최대속도를 쓰는 것이 대부분이다.
최대속도 |
최대커패시턴스 |
최대상승/하강시간 |
|
저속모드(Ls) |
10 kbps |
- |
- |
표준모드(Sm) |
100 kbps |
400 pF |
1000 ns / 300 ns |
쾌속모드(Fm) |
400 kbps |
400 pF |
300 ns / 300 ns |
쾌속모드+(Fm+) |
1 Mbps |
550 pF |
120 ns / 120 ns |
고속모드(Hs) |
1.7 Mbps |
400 pF |
80 ns / 80 ns |
고속모드(Hs) |
3.4 Mbps |
100 pF |
40 ns / 40 ns |
우선 저속모드는 다른 통신과 호환되는 기준으로 알려진 것일 뿐 I2C 통신에서 정식으로 쓰이는 동작 모드가 아니다. 그리고 고속모드가 두 가지로 구분되는 것은 회선상의 커패시턴스에 의한 것으로 최대 400 pF일 때 1.7 Mbps, 최대 100 pF일 때 3.4 Mbps까지 동작한다고 생각하면 된다. 이것들 외에도 5 Mbps인 초고속 모드(Ultra-fast mode)라는 통신이 있으나 푸시 풀(Push-pull)방식의 단방향 통신(쓰기 전용)이므로 여기서는 별개로 취급한다.
4. I2C 통신 데이터 프레임
그림과 같이 데이터 프레임 프레임 이전인 비활성(Inactive)상태일 때는 풀업 저항기에 따라 두 회선 모두 고 레벨을 유지한다. 그러다가 시작부분에서 제어장치가 SDA회선을 저 레벨로 변화시켜 대상장치에게 프레임의 시작을 알린다. 이것을 시작조건(Start Condition)이라고 한다. 반대로 끝 부분에서 SCL이 고 레벨일 때 SDA가 고 레벨로 바뀌는 것을 정지조건(Stop Condition)이라고 한다. 이 시작조건과 정지조건으로 데이터 프레임의 시작과 끝을 알리며, 다중 제어장치의 경우 제어할 권한을 주고받는 기준이 된다.
다음으로 구조를 볼 때 시작조건이후 제어장치가
대상장치의 주소 7-bit와 함께 읽기(‘1’) 또는 쓰기(‘0’)를 합해 8-bit를 송신한다. 직후 주소에 해당하는 대상장치가 제어장치에게 준비가 되었음을 저 레벨로 변화시켜 알리는데 승인(ACK, Acknowledgement : 애크)이라고 한다. 만약 대상장치가 응답할 수 없다면 풀업에 의해 고 레벨로 유지되는데 미승인(NACK,
Not-acknowledgement : 내크)이라고 한다.
제어장치는 승인이 확인되면 뒤를 이어서 데이터를 송신하고 미승인이 확인되면 응답할 대상장치가 없다는 것으로 판단하여 통신을 끝낸다.
주소만을 보면 상위 4자리(A6~A3)와
하위 3자리(A2~A0)+R/W’로 구분된다. 이중
상위 4자리의 0000과 1111일
때의 특별한 명령을 제외한 대부분은 제조사에서 지정하게 되어 있다. 그리고 하위 3자리는 하드웨어 설계상으로 약간씩 변경할 수 있도록 제공된다. 이에
따라 동일한 회선내에 같은 종류의 대상장치가 복수로 연결될 수 있다. R/W’ 비트는 이후 명령이 제어장치가
수신(읽기)을 하려는 경우에 R/W’=1, 송신(쓰기)을 하려는 경우에 R/W’=0이 된다.
그림은 R/W’=1이 되어 쓰기를 시행하는 데이터 프레임이다. 대상장치 주소를 보내서 응답이 승인(ACK)일 때, 제어장치가 쓰기를 시행할 내부 주소를 다시 전송한다. 이 때, 8-bit 전송때마다 승인을 받아야 하고 이후 쓰려고 하는 데이터를 보낸다. 마지막 데이터까지 승인을 확인하고 제어장치의 판단으로 프레임을 종료한다. 이러한 순서를 그림으로 나타내면 아래와 같다.
읽기의 경우 R/W’=1을 전송하면 승인을 확인 후 데이터를 바로 수신하게 되므로 읽으려는 내부 주소를 판단할 수 없다. 따라서 사전에 R/W’=0으로 쓰기 상태가 되어 내부 주소를 지정하되 데이터를 전송하지 않는 과정을 거친다. 이후 R/W’=1을 전송하고 대상장치의 데이터를 읽어 들이고 역시 8-bit마다 제어장치가 승인으로 답한다. 제어장치가 마지막까지 읽은 후의 응답을 미승인(NACK)으로 하여 데이터 프레임이 종료된다.
이러한 과정들은 각 대상장치마다 다르니 확인하여 맞추어 변경하도록 한다.
10-bit형 주소의 사용법은 그림과 같이 두 바이트에 나누어 제어장치에서 전송하게 된다. 처음의 A14~A10에 대해 ‘11110’으로 10-bit형 주소방식이라는 것을 회선상의 장치에게 알리고 남은 주소 A9~A8과 R/W’를 전송하여 해당되는 대상장치의 응답을 받는다. 이어 A7~A0까지 전송하여 대상장치를 특정한다. 그 이후 대상장치의 내부 주소를 지정하는 부분부터 동일하다.
5. SMBus 통신, PMBus 통신
1990년대에 노트북 내 마더보드의 충전식 배터리 시스템과 같은 전력 관련 소자와의 통신을 위해 인텔(Intel)사와 듀라셀(Duracell)사에 의해 정의된 I2C의 파생형을 SMBus(System Management Bus : 시스템 관리 버스)라고 부른다. SMBus는 스마트 배터리 시스템(SBS)의 제어용 통신으로 계속 쓰였으며 2000년대에 전력용 시스템 관리를 위해 여러 회사에 의해 다시 SMBus기반으로 개량하는데 이를 PMBus(Power Management Bus : 전원 관리 버스)라고 부른다.
SMBus 및 PMBus 모두 I2C의 변형으로 결선방식은 클럭과 데이터라는 두 회선을 갖는 반이중 통신인 점은 같지만 세부적으로 몇 가지가 달라 결선 환경에 따라 호환이 안 될 수도 있다. 제한 시간 때문에 최저 동작속도가 정해져 있고, 구동 전류의 범위가 다르므로 풀 업 저항기의 수정이 필요할 수 있다. 그 외에도 통신 프레임 자체에 PEC(Packet Error Checking : 패킷 오류 검사)가 포함되어 있어 있으니 참고한다.
6. 결론
PROM계열의 메모리나 입출력 확장기, 온/습도계와 같이 느리지만 여러 개를 다중 접속하는 직렬통신이 필요할 때 I2C를 검토하도록 한다.
댓글 없음:
댓글 쓰기