Cộng đồng Hỏi & Đáp của Inflearn
I2C 통신 방식
Đã giải quyết
Viết
·
54
0
안녕하세요 삼코치님! 강의를 듣던 중 궁금한 점이 생겨 질문 드립니다.
I2C는 기본적으로 풀업 저항 때문에 Idle 상태가 HIGH로 유지된다고 이해하고 있습니다. 그렇다면 START 조건은 SCL이 HIGH일 때 SDA가 HIGH->LOW로 변하는 것으로 생각했습니다. 하지만 강의자료 77페이지 시작 신호 SDA가 LOW일 때 SCL LOW->HIGH 시점 설명 부분이 이해가 가지 않아 질문 드립니다.
Câu trả lời 2
0
안녕하세요, 답변 남겨드립니다.
말씀하신 이해가 맞습니다. I2C는 SDA/SCL이 오픈드레인이라서 누구도 LOW로 끌어내리지 않으면 풀업 저항 때문에 유휴(Idle) 상태가 HIGH로 유지되고, START 조건은 “SCL이 HIGH인 상태에서 SDA가 HIGH -> LOW로 전이”하는 순간으로 정의됩니다. 반대로 STOP 조건은 “SCL이 HIGH인 상태에서 SDA가 LOW -> HIGH로 전이”입니다. 이 두 가지는 I2C에서 유일하게 “SCL이 HIGH일 때 SDA가 변해도 되는” 예외적인 이벤트이고, 그 외 데이터 비트 전송 구간에서는 원칙적으로 “SCL이 LOW일 때만 SDA가 바뀌고, SCL이 HIGH일 때는 SDA가 안정(Valid)해야” 합니다.
강의자료 77페이지에서 “시작 신호” 설명이 “SDA가 LOW일 때 SCL LOW->HIGH 시점”처럼 보이는 부분이 헷갈리신 이유는, 많은 타이밍 다이어그램이 START 자체의 ‘전이 순간’을 강조하기보다, START 이후 첫 클럭의 샘플링 시점을 같이 보여주기 때문입니다. 실제 파형을 시간 순서로 쓰면 다음처럼 됩니다. 먼저 Idle은 (SCL=H, SDA=H)이고, START는 SCL이 H인 채로 SDA가 H->L로 떨어지는 순간입니다. 그 다음 마스터는 SCL을 L로 내려 첫 비트 준비를 하고, 이후 SCL을 L->H로 올리면서 첫 비트를 샘플링합니다. 이때는 이미 SDA가 LOW로 유지되고 있는 상태에서 SCL이 상승하는 장면이 보이게 되는데, 이것은 START가 “SCL 상승 시점에 발생”한 게 아니라 “그 직전에 이미 발생했고, 그 결과로 SDA가 LOW인 상태가 유지된 채 첫 번째 SCL 상승 에지에서 샘플링된다”로 이해하시면 정확합니다.
ASCII로 간단히 그려보면 이런 느낌입니다. (시간은 왼쪽에서 오른쪽으로 흐릅니다.)
SCL: H H H L L H L H ...
SDA: H L L L D7 D7 D6 D6 ...
여기서 SDA가 H->L로 떨어지는 그 짧은 순간이 START이고, 그 다음에 보이는 “SDA가 LOW인 상태에서 SCL이 L->H로 올라가는 구간”은 START가 아니라 첫 데이터 비트(D7, 주소의 MSB 또는 데이터)의 유효/샘플링 구간입니다. I2C 수신기는 보통 SCL이 HIGH인 동안 SDA를 ‘읽고’, SCL이 LOW일 때 송신기가 다음 비트로 SDA를 바꾸는 구조라서, 다이어그램 설명이 “SCL이 올라갈 때 SDA가 LOW로 잡혀 있다”로 적혀 있으면 그것은 START의 정의를 말하는 문장이라기보다 “샘플링 시점에서 SDA는 이미 LOW여야 한다” 또는 “START 이후 버스가 data phase로 들어간다”는 설명일 가능성이 큽니다.
이 부분을 더 단단히 잡아드리려고, I2C가 왜 이런 규칙을 쓰는지도 실무 관점에서 수치로 연결해보겠습니다. 풀업 저항 때문에 SCL/SDA의 상승 에지는 RC에 의해 천천히 올라갑니다. 예를 들어 3.3V 버스에서 4.7k 풀업을 쓰고, 배선/디바이스 포함 버스 커패시턴스가 100 pF라면 시간상수는 RC = 4.7k * 100pF = 470 ns 정도입니다. 이때 HIGH 판정 임계(대략 0.7VDD 근처)를 통과하는 데 1 us 안팎이 걸릴 수 있고, 그래서 I2C 표준에서도 상승시간(tr) 제한이 따로 있습니다. Standard-mode(100 kHz)에서는 tr 최대가 대략 1000 ns 수준, Fast-mode(400 kHz)에서는 300 ns 수준으로 더 타이트해집니다. 결국 “SCL이 HIGH일 때 SDA가 변하면 안 된다”는 규칙이 없으면, 느린 상승 에지에서 임계 근처의 찰나에 SDA가 흔들릴 때 수신기가 엉뚱한 비트를 읽을 위험이 커집니다. START/STOP만 예외로 둔 이유는, 프레임 경계를 명확히 만들기 위해서이고, 그마저도 타이밍 파라미터로 최소 유지시간을 강제합니다. 예를 들어 Standard-mode에서는 START 조건의 setup time(tSU;STA) 최소가 4.7 us, hold time(tHD;STA) 최소가 4.0 us 같은 식으로 “SDA를 언제까지 안정적으로 잡고 있어야 한다”가 정해져 있어서, 단순히 논리 규칙이 아니라 실제 물리 파형을 안전하게 만들도록 되어 있습니다.
STM32 실무 예시로 보면, 100 kHz로 I2C를 돌릴 때 한 비트 시간은 10 us이고, 수신기는 통상 SCL이 HIGH인 중간 구간에서 SDA를 읽습니다. 주소 전송의 첫 비트(MSB)가 0이라면 START 직후 SDA는 LOW로 유지된 채로 첫 SCL 상승 에지가 오고, 그때 “SDA LOW에서 SCL이 올라간다”는 장면이 딱 보입니다. 이걸 START로 착각하기 쉬운데, 실제로 START는 그 바로 직전에 이미 발생했고, 그 이후는 주소/데이터 비트 구간입니다. 반대로 주소의 첫 비트가 1이면 START 직후 SDA는 HIGH로 유지되고 첫 SCL 상승 에지가 오므로, 어떤 슬라이드는 START 직후의 첫 비트가 0인 예를 그림으로 사용했을 가능성이 높습니다. 그래서 “SDA가 LOW일 때 SCL이 L->H 되는 시점”이 슬라이드에 등장해도, 그것은 START 정의와 충돌하는 게 아니라 “첫 비트가 0인 예시에서, 샘플링 에지에서 SDA가 LOW로 이미 안정돼 있다”는 상황을 보여주는 것이라고 보시면 됩니다.
마지막으로 현장에서 자주 보는 추가 혼동 포인트가 반복 START(Repeated START)입니다. 버스를 놓지 않고(SDA를 HIGH로 올려 STOP을 만들지 않고) 다시 START를 만드는 상황인데, 이것도 정의는 동일하게 “SCL HIGH 동안 SDA가 HIGH->LOW”입니다. 다만 이전 전송의 ACK/NACK나 데이터 비트 이후에 SCL이 HIGH가 되는 구간이 반복되기 때문에, 파형이 익숙하지 않으면 “SDA가 LOW로 보이는데 왜 START라고 하지?” 같은 느낌이 들 수 있습니다. 이 경우도 핵심은 “START는 SDA가 떨어지는 전이 자체”이고, SCL 상승은 그 다음 비트 샘플링 에지라는 점입니다.
정리하면, 사용하신 정의는 정확하고, 강의자료에서 보신 “SDA가 LOW일 때 SCL이 L->H”는 START가 그 순간에 발생한다는 뜻이 아니라, START 이후 첫 클럭(혹은 특정 비트)의 샘플링 구간을 함께 설명하면서 생긴 표현일 가능성이 큽니다. 만약 가능하시다면 77페이지의 해당 파형(캡처)에서 “SDA가 HIGH->LOW로 떨어지는 순간이 SCL HIGH 구간에 존재하는지”만 눈으로 찍어보시면 바로 해소되실 텐데, 그 전이점이 보이면 그게 START이고, 그 다음에 보이는 SCL 상승들은 전부 데이터/주소 비트의 샘플링이라고 보시면 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. 박수빈님.
I2C 통신에서 Start 조건은 SCL이 HIGH 상태일 때 SDA가 HIGH에서 LOW로 전이할 때 발생합니다. 이로 인해 마스터는 데이터 전송을 시작하게 됩니다. 반대로 Stop 조건은 SCL이 HIGH일 때 SDA가 LOW에서 HIGH로 전이할 때 발생합니다.
그러나 질문 내용에 따라, 강의 자료 77페이지에 대해 자세히 설명드리자면, 때때로 설계나 자료와 관련하여 오해가 발생할 수 있습니다. SCL이 LOW에서 HIGH로 전이하는 동안 SDA가 이미 LOW인 경우는 데이터 전송 중의 한 비트가 전송되는 과정일 수도 있습니다. 이는 Start 조건과 다르며, 주어진 타이밍 다이어그램 문맥이나 추가적인 설명이 필요할 수 있습니다.
이와 관련하여 보다 구체적인 정보를 원하신다면, 이전 답변을 참고하시면 I2C의 신호 타이밍과 풀업 저항의 역할 등에 대한 설명이 포함되어 있습니다.
또한 추가적인 링크로는 I2C SCL_Synched, SDA_Synched 질문 게시물이 있습니다. 여기서는 I2C 신호의 동기화에 관한 내용을 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




