I2C는 간단한 구조로 인하여 많은 디바이스(장치)에서 외부 인터페이스로 선택을 했습니다. 간단한 온도 센서에서부터 복잡한 카메라 이미지 센서까지 다양한 디바이스가 있습니다. 많은 I2C를 지원하는 디바이스들은 EEPROM과 유사한 방식으로 통신을 합니다. EEPROM은 메모리로써 주소와 그 주소에 데이터를 저장합니다. 대부분의 I2C는 EEPROM과 같이 내부에 주소와 레지스터(메모리와 같음)를 갖고 있으며, 레지스터는 EEPROM과는 다르게 데이터를 저장하는 용이 아닌 디바이스를 제어하는 용도로 사용을 합니다.
만약 카메라 센서 디바이스 드라이버를 작성한다고 하면 데이터시트에 수 많은 레지스터 설명에 기가 죽을 수도 있지만, 가장 먼저 MCU(AP)와 카레라 센서 간 I2C 통신을 연결하지 않는 한 무용지물 입니다. 많은 디바이스 드라이버를 작성하면서 디바이스의 레지스터에는 그림15와 같이 3가지 형태를 띠고 있다는 것을 알게 됩니다.
1. 8비트 주소, 8비트 레지스터
간단한 디바이스인 경우 입니다. 아래 그림16과 같이 I2C를 통해 디바이스에 데이터를 쓰게 되면 디바이스는 첫 번째 바이트를 레지스터 주소로 인식을 합니다. 디바이스는 레지스터 주소로 현재 위치를 설정 합니다. 두 번째 바이트는 첫 번째 받은 레지스터 주소의 레지스터에 데이터를 쓰게 됩니다. 그림-17의 두번째 그림과 같이 여러 바이트를 쓰게 되었을 때, 디바이스는 첫 번째 데이터는 레지스터 주소로 그 다음 데이터는 레지스터 데이터로 인식을 합니다. 3번째 바이트는 (레지스터 주소 + 1)과 같이 디바이스는 자동으로 주소를 1씩 증가 시키고 현재 위치를 설정 합니다.
디바이스의 레지스터 값을 읽기 위해서는 먼저 디바이스에 읽기 위한 레지스터 주소를 먼저 쓰기를 해야 합니다. 그림-17과 같이 레지스터 주소를 쓰면 디바이스는 레지스터 주소를 현재 위치로 설정을 합니다. 그리고 디바이스에서 읽기를 하면 첫 번째에서 설정하였던 레지스터 주소의 값을 전송 합니다.
그림-17의 두 번째와 같이 여러 바이트 읽기를 하면 디바이스는 알아서 주소를 하나씩 증가를 하여 데이터를 보냅니다.
만약, 레지스터 주소를 쓰지 않고 데이터를 읽게 되면 데이터는 읽을 수 있지만 보통 디바이스는 현재 레지스터 주소의 위치를 알려주는 기능이 없기 때문에 어떤 레지스터의 값인지 알 수 없습니다.
2. 16비트 주소, 8비트 레지스터
그림-18과 그림-19는 16비트 주소에 8비트 레지스터 값을 갖는 디바이스의 레지스터에 쓰기와 읽기 입니다. 4.1과의 차이점은 레지스터 주소가 2바이트란 차이점만 있습니다.
3. 16비트 주소, 16비트 레지스터
4.2에서 레지스터 데이터가 1바이트에서 2바이트로 달라지는 것 빼고는 다른 점은 없습니다.
'로봇 이야기 > interface' 카테고리의 다른 글
PWM (Pulse Width Modulation) (0) | 2022.12.07 |
---|---|
I2C-BUS (1) | 2022.12.05 |
댓글