Загружаем каталог…
Загружаем каталог…
I2C 통신 정리 - 두 개의 선으로 여러 장치와 통신하는 방법 1. I2C란? I2C(Inter-Integrated Circuit) 는 MCU와 센서, EEPROM 등의 주변 장치가 통신하기 위해 사용하는 동기식 직렬 통신 프로토콜 이다. SPI와 마찬가지로 Clock을 이용해 송수신 시점을 맞추지만, I2C는 통신에 필요한 선이 단 두 개라는 특징이 있다. SCL(Serial Clock Line) : Clock 신호 SDA(Serial Data Line) : 데이터 송수신 ┌── 온도 센서 MCU ── SDA ──┼── EEPROM ── SCL ──┼── 가속도 센서 └── 기타 주변 장치 하나의 SDA와 SCL을 여러 장치가 공유하는 Bus 구조 를 사용한다. 2. SPI와 무엇이 다른가? SPI에서는 일반적으로 다음과 같은 신호선을 사용한다. SCLK : Clock MOSI : Master → Slave MISO : Slave → Master CS : Slave 선택 특히 여러 Slave를 연결하면 각각의 장치를 선택하기 위한 CS가 필요하다. ┌── Slave A SCLK ─────────┼── Slave B MOSI ─────────┼── Slave C MISO ─────────┼── │ CS_A ─────────┘ A 선택 CS_B ─────────── B 선택 CS_C ─────────── C 선택 반면 I2C는 별도의 CS가 없다. ┌── Device A SDA ─────────┼── Device B SCL ─────────┼── Device C └── Device D 대신 각각의 장치가 고유한 주소(Address) 를 가지고 있다. 예를 들어, 온도 센서 : 0x48 EEPROM : 0x50 가속도 센서 : 0x68 라고 한다면 Controller가 0x48 이라는 주소를 보내면 해당 주소를 가진 장치가 응답한다. Controller │ │ "0x48!" ▼ ══════════ I2C BUS ══════════ │ │ │ 0x48 0x50 0x68 ↑ "내 주소다!" 즉, 간단하게 비교하면 다음과 같다. SPI는 CS 선으로 통신할 장치를 선택하고, I2C는 주소로 통신할 장치를 선택한다. 3. I2C는 어떻게 데이터를 주고받을까? I2C의 기본적인 통신 흐름은 다음과 같다. START ↓ Address + R/W ↓ ACK ↓ Data ↓ ACK / NACK ↓ STOP 여기서 중요한 개념은 다음과 같다. START Controller가 통신 시작을 알리는 신호이다. Address 어떤 장치와 통신할 것인지를 나타낸다. 일반적으로 많이 사용되는 7-bit Address 방식에서는 주소 뒤에 R/W bit 가 추가된다. [ 7-bit Address ][ R/W ] │ ├─ 0 : Write └─ 1 : Read 따라서 Address와 R/W bit를 통해 누구와 통신할 것인지 + 읽을 것인지 쓸 것인지 를 결정한다. ACK / NACK 데이터나 주소를 받은 장치는 ACK를 통해 정상적으로 수신했음을 알릴 수 있다. ACK : 정상적으로 수신 NACK : 더 이상 데이터를 받지 않거나 응답할 수 없음 등의 의미 STOP 현재 통신이 끝났음을 나타낸다. 4. 왜 SDA 하나로 송신과 수신이 모두 가능한가? SPI는 송신과 수신 선이 분리되어 있다. MOSI : Controller → Peripheral MISO : Controller ← Peripheral 하지만 I2C에서는 SDA 하나를 양방향으로 사용한다. Controller ───── SDA ───── Device → 데이터 ← 데이터 문제는 여러 장치가 하나의 SDA를 공유한다는 것이다. 만약 일반적인 GPIO 출력처럼 각 장치가 HIGH와 LOW를 직접 출력한다면 문제가 발생할 수 있다. 예를 들어, Device A : HIGH 출력 Device B : LOW 출력 이라면 한쪽에서는 선을 VCC에 연결하고 다른 쪽에서는 GND에 연결하려는 상황이 발생할 수 있다. 이를 해결하기 위해 I2C에서는 Open-Drain 구조와 Pull-up 저항 을 사용한다. 5. Open-Drain이란? Open-Drain의 핵심은 간단하다. 장치가 HIGH를 직접 출력하지 않는다. 장치가 할 수 있는 동작은 다음 두 가지이다. 0 출력 → SDA를 GND로 당긴다. 1 출력 → SDA에서 손을 뗀다(Release). 즉, SDA │ ┌──────┴──────┐ │ │ Device A Device B │ │ Switch Switch │ │ GND GND 각 장치 내부에 GND로 연결할 수 있는 스위치가 있다고 생각하면 이해하기 쉽다. 0 을 출력하려면 스위치를 켠다. SDA │ Switch ON │ GND → LOW 반대로 1 을 출력하려면 스위치를 끈다. SDA │ Switch OFF → Release 하지만 이렇게 하면 아무도 SDA를 GND로 당기지 않을 때 SDA의 전압을 HIGH로 만들어 줄 장치가 없다. 이를 해결하는 것이 Pull-up 저항 이다. 6. Pull-up 저항이란? SDA와 SCL을 저항을 통해 VCC에 연결한다. VCC │ Pull-up 저항 │ ├──── SDA │ Devices 아무 장치도 SDA를 GND로 당기지 않으면 Pull-up에 의해 SDA가 HIGH가 된다. VCC │ 저항 │ SDA → HIGH 반대로 하나의 장치라도 SDA를 GND로 당기면, VCC │ 저항 │ SDA ─── Device ─── GND → LOW 가 된다. 따라서 I2C에서는 다음과 같이 생각할 수 있다. 보내려는 값 장치의 동작 실제 SDA 0 GND로 당김 LOW 1 Release HIGH(Pull-up) 즉, 0은 장치가 직접 만들고, 1은 Pull-up 저항이 만들어준다. 이 구조 덕분에 여러 장치가 하나의 선을 안전하게 공유할 수 있다. 7. 여러 장치가 동시에 다른 값을 보내면? 예를 들어 두 장치가 동시에 다음 값을 출력하려 한다고 하자. Device A : 1 Device B : 0 Open-Drain에서는 Device A : Release Device B : GND로 당김 이므로 실제 Bus는 LOW가 된다. A B 실제 SDA 1 1 HIGH 1 0 LOW 0 1 LOW 0 0 LOW 즉, 하나의 장치라도 0을 출력하면 Bus는 0이 된다. 이러한 특성은 여러 Controller가 존재하는 환경에서 Arbitration을 구현하는 데도 사용된다. 8. I2C의 Arbitration 일반적인 I2C 시스템에서는 하나의 Controller가 여러 Peripheral을 제어하는 경우가 많기 때문에 Arbitration이 항상 발생하는 것은 아니다. 하지만 여러 Controller가 같은 Bus를 사용하는 환경에서는 동시에 통신을 시작할 가능성이 있다. Controller A ─┐ ├──── SDA/SCL ─── Devices Controller B ─┘ 두 Controller가 동시에 데이터를 보내고 있다고 가정하자. Controller A : 1 Controller B : 0 Open-Drain 특성 때문에 실제 SDA는 LOW가 된다. 따라서 Controller A는 내가 보낸 값 : 1 실제 SDA : 0 이라는 차이를 확인할 수 있다. 즉, 1을 보내려고 Release ↓ 실제 SDA 확인 ↓ LOW? ↓ "다른 Controller가 0을 보내고 있구나." ↓ Arbitration에서 패배 와 같은 방식으로 Bus의 우선권을 결정할 수 있다. 9. CAN Arbitration과 비슷한 점 CAN을 공부했다면 이 구조가 익숙하게 느껴질 수 있다. CAN에서는 일반적으로 Dominant = 0 Recessive = 1 의 관계를 이용한다. Node A : 1 Node B : 0 Bus : 0 즉 0이 우세하다. I2C 역시 Open-Drain 구조 때문에 1 = Release 0 = LOW로 당김 이므로 여러 장치가 동시에 다른 값을 출력하면 LOW가 우세하게 나타난다. 따라서 I2C와 CAN 모두 공유 Bus에서 실제 Bus 상태를 확인하면서 충돌을 해결할 수 있다는 공통점 이 있다. 다만 두 프로토콜의 Arbitration 목적과 세부 방식은 동일하지 않다. 10. I2C Address와 CAN ID는 같은 개념일까? 둘 다 공유 Bus를 사용하기 때문에 비슷해 보이지만 중요한 차이가 있다. I2C I2C Address는 기본적으로 통신할 장치를 지정하기 위한 주소 이다. 0x48 → "0x48 장치와 통신하겠다." CAN CAN ID는 일반적으로 특정 장치의 주소가 아니라 메시지의 의미와 우선순위 를 나타낸다. 예를 들어 시스템을 다음과 같이 설계할 수 있다. 0x100 → 차량 속도 0x200 → 조향각 0x300 → 브레이크 상태 CAN Bus에 메시지가 전송되면 각 노드는 자신에게 필요한 ID의 메시지를 수신한다. 따라서 다음과 같이 구분할 수 있다. I2C Address → 누구와 통신할 것인가? CAN ID → 어떤 메시지인가? CAN ID를 단순히 "송신자의 주소"라고 이해하면 안 된다. 11. I2C의 장점 1) 필요한 선이 적다 SDA와 SCL 두 개의 신호선만으로 여러 장치를 연결할 수 있다. 2) 여러 장치를 연결하기 쉽다 SPI처럼 Peripheral마다 별도의 CS 선을 추가할 필요가 없다. 3) 주소 기반 통신 각 장치를 Address로 구분할 수 있어 여러 Peripheral을 하나의 Bus에 연결하기 편리하다. 4) ACK/NACK 지원 상대 장치의 응답 여부를 프로토콜 수준에서 확인할 수 있다. 12. I2C의 단점 1) SPI보다 일반적으로 속도가 느리다 주소, ACK/NACK 등의 제어 과정이 존재하고 SDA 하나를 양방향으로 사용하기 때문에 고속 데이터 전송이 중요한 상황에서는 SPI가 더 적합한 경우가 많다. 2) Pull-up 저항이 필요하다 Open-Drain 방식이므로 SDA와 SCL에 적절한 Pull-up 저항이 필요하다. 3) Bus의 전기적 특성을 고려해야 한다 연결된 장치와 배선이 늘어나면 Bus capacitance가 증가하고 신호의 상승 시간이 길어질 수 있다. 따라서 무조건 많은 장치를 연결할 수 있는 것은 아니다. 4) 주소 충돌 가능성이 있다 동일한 I2C Address를 사용하는 장치 여러 개를 같은 Bus에 연결하면 문제가 발생할 수 있다. 일부 센서는 핀 설정 등을 통해 주소를 변경할 수 있지만, 그렇지 않은 경우 I2C Multiplexer 등의 추가적인 방법이 필요할 수 있다. 13. 어떤 상황에서 I2C를 사용할까? I2C는 특히 MCU에 여러 개의 저속 주변 장치를 연결해야 하는 상황 에서 유용하다. 대표적으로 다음과 같은 장치에 많이 사용된다. 온도/습도 센서 IMU RTC EEPROM 각종 환경 센서 설정용 IC 소형 디스플레이 컨트롤러 예를 들어 MCU에 온도 센서, 가속도 센서, EEPROM을 연결한다고 하자. SPI라면 각각의 장치를 선택하기 위한 CS가 필요할 수 있지만 I2C에서는 SDA/SCL Bus를 공유하면서 주소로 장치를 선택할 수 있다. 따라서 GPIO를 아끼면서 여러 저속 Peripheral을 연결해야 할 때 I2C가 좋은 선택지가 될 수 있다. 14. SPI / I2C / CAN 비교 특징 SPI I2C CAN 주요 용도 칩 간 고속 통신 칩 간 주변장치 통신 여러 제어기 간 통신 기본 구조 Controller-Peripheral 공유 Bus 공유 Bus Clock 있음 있음 별도 Clock 선 없음 장치 구분 CS Address Message ID 기반 데이터선 MOSI/MISO SDA CAN-H/CAN-L 여러 장치 연결 CS 증가 Address 사용 Bus 공유 Arbitration 일반적인 SPI에는 없음 Multi-Controller에서 존재 존재 ACK 기본 SPI에는 없음 ACK/NACK ACK 메커니즘 존재 결국 세 통신의 차이를 아주 간단하게 기억하면 다음과 같다. SPI: CS로 "너 나와." I2C: Address로 "0x48 너 나와." CAN: ID로 "차량 속도 메시지 보낸다. 필요한 노드는 받아." 15. 문제 상황과 해결 방법 문제 1. 같은 주소를 가진 장치가 여러 개 존재한다 원인 같은 I2C Address를 가진 Peripheral을 하나의 Bus에 연결하면 Controller가 원하는 장치를 구분하기 어렵다. 해결 장치의 Address 설정 핀 사용 소프트웨어로 주소 변경이 가능한 장치라면 주소 변경 I2C Multiplexer 사용 Bus 분리 문제 2. 통신 속도를 높였더니 신호가 정상적으로 올라오지 않는다 원인 I2C의 HIGH는 장치가 직접 출력하는 것이 아니라 Pull-up 저항을 통해 형성된다. 따라서 Bus capacitance와 Pull-up 저항값에 따라 상승 시간이 영향을 받는다. LOW ────────╮ ╰──── HIGH ↑ 상승 시간 발생 해결 적절한 Pull-up 저항값 선정 배선 길이 감소 연결된 장치 수 및 Bus capacitance 확인 필요하다면 통신 속도 감소 문제 3. Peripheral이 응답하지 않는다 확인할 사항 Slave/Target Address가 올바른가? SDA/SCL 연결이 올바른가? Pull-up 저항이 존재하는가? ACK가 정상적으로 발생하는가? 통신 속도를 해당 장치가 지원하는가? 전원 및 GND 연결이 정상적인가? 16. 면접에서 나올 수 있는 질문 Q. I2C란 무엇인가요? I2C는 SDA와 SCL 두 개의 신호선을 사용하는 동기식 직렬 통신 프로토콜입니다. 여러 장치가 동일한 Bus를 공유하고 Address를 이용해 통신할 장치를 선택할 수 있다는 특징이 있습니다. Q. SPI와 I2C의 가장 큰 차이는 무엇인가요? SPI는 일반적으로 CS를 이용해 Peripheral을 선택하고 MOSI/MISO를 이용해 송수신합니다. 반면 I2C는 SDA와 SCL 두 선을 여러 장치가 공유하며 Address를 통해 통신할 장치를 선택합니다. Q. I2C에서 Pull-up 저항이 필요한 이유는 무엇인가요? I2C의 SDA와 SCL이 Open-Drain 방식이기 때문입니다. 장치는 LOW는 직접 만들 수 있지만 HIGH를 직접 출력하지 않기 때문에, 아무 장치도 LOW로 당기지 않을 때 신호를 HIGH 상태로 만들기 위해 Pull-up 저항이 필요합니다. Q. Open-Drain의 장점은 무엇인가요? 여러 장치가 하나의 Bus를 공유하면서 서로 다른 값을 출력하더라도 HIGH와 LOW를 직접 밀어내는 방식의 충돌을 피할 수 있습니다. 또한 실제 Bus 상태를 확인할 수 있기 때문에 Multi-Controller 환경의 Arbitration 같은 동작도 가능해집니다. Q. I2C와 CAN의 Arbitration은 같은가요? 둘 다 공유 Bus의 상태를 확인하면서 충돌을 해결한다는 공통점이 있지만 목적과 프로토콜은 다릅니다. CAN에서는 메시지 ID를 이용한 Arbitration이 핵심적으로 사용되고, I2C에서는 여러 Controller가 동시에 Bus를 사용하려 할 때 Arbitration이 필요합니다. Q. I2C Address와 CAN ID의 차이는 무엇인가요? I2C Address는 통신할 대상 장치를 선택하는 주소입니다. 반면 CAN ID는 일반적으로 송수신 장치의 주소가 아니라 메시지의 의미와 우선순위를 나타냅니다. 정리 I2C의 핵심 흐름은 다음과 같이 연결해서 이해할 수 있다. 여러 장치를 하나의 Bus에 연결하고 싶다. ↓ SDA / SCL을 여러 장치가 공유한다. ↓ CS 대신 Address로 장치를 구분한다. ↓ 그런데 여러 장치가 같은 선을 사용한다. ↓ HIGH/LOW를 각자 직접 출력하면 충돌할 수 있다. ↓ Open-Drain을 사용한다. ↓ 장치는 LOW만 직접 만들고 HIGH에서는 선을 Release한다. ↓ 그렇다면 HIGH를 만들어 줄 것이 필요하다. ↓ Pull-up 저항을 사용한다. ↓ 한 장치라도 LOW로 당기면 Bus는 LOW가 된다. ↓ 이 특성을 이용하면 공유 Bus에서 Arbitration도 가능하다. 결국 I2C의 핵심은 두 개의 선을 여러 장치가 공유하면서, Address와 Open-Drain 구조를 이용해 안전하게 통신하는 것 이라고 정리할 수 있다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[임베디드] I2C 통신. I2C 통신 정리 - 두 개의 선으로 여러 장치와 통신하는 방법 1. I2C란? I2C(Inter-Integrated Circuit) 는 MCU와 센서, EEPROM 등의 주변 장치가 통신하기 위해 사용하는 동기식 직렬 통신 프로토콜 이다. SPI와 마찬가지로 Clock을 이용해 송수신 시점을 맞추지만, I2C는 통신에 필요한 선이 단 두 개라는 특징이 있다. SCL(Serial Clock Line) : Clock 신호 SDA(Serial Data Line) : 데이터 송수신 ┌── 온도 센서 MCU ── SDA ──┼── EEPROM ── SCL ──┼── 가속도 센서 └── 기타 주변 장치 하나의 SDA와 SCL을 여러 장치가 공유하는 Bus 구조 를 사용한다. 2. SPI와…
Открыть источник