I²C 주소 변환기
7비트와 8비트 I²C 주소를 양방향으로 변환하고, 예약 구간인지 확인하며, 스캔 결과가 무엇을 뜻하는지 보여 줍니다.
What most APIs and Linux expect.
회선에 나가는 첫 바이트
The seven address bits shift up one place and the direction bit fills the gap. That single shift is the whole difference between the two numbers a datasheet might print.
0x900x910x48 (72 decimal)0x900x911001000 + R/WParts commonly found at 0x48
A first guess for a scan result, not a catalogue — several families share each address block.
INA219 / INA226Current and power monitor0x40–0x4FADS1115 / ADS1015Analogue to digital converter0x48–0x4BLM75 / TMP102Temperature sensor0x48–0x4F
주소 맵
Laid out like i2cdetect. Select a cell to inspect it.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | ||||||||||||||||
| 10 | ||||||||||||||||
| 20 | ||||||||||||||||
| 30 | ||||||||||||||||
| 40 | ||||||||||||||||
| 50 | ||||||||||||||||
| 60 | ||||||||||||||||
| 70 |
10-bit addressing
A 10-bit transfer sends two bytes. The first starts with the fixed pattern 11110, carries the top two address bits, and ends with the direction bit; the second holds the low eight bits.
0xF2 0x230xF3 0x2311110 01 R/W주소가 7비트인 이유
I²C는 주소에 7비트를 씁니다. 회선에 나가는 것은 한 바이트인데, 그 바이트의 상위 7비트가 주소이고 마지막 한 비트가 읽기(1)냐 쓰기(0)냐를 나타냅니다.
그래서 같은 장치를 가리키는 숫자가 세 개가 됩니다. 7비트 주소 0x50, 쓰기 바이트 0xA0, 읽기 바이트 0xA1. 셋 다 맞는 표현이고, 문서마다 어느 것을 적을지가 다릅니다.
두 배 차이의 정체
가장 흔한 혼란입니다. 스캔 도구는 대개 7비트로 표시하고 데이터시트는 8비트 쓰기 주소로 적는 경우가 많습니다. 스캔에서 0x50이 나왔는데 문서에 0xA0이라고 적혀 있으면 같은 장치입니다.
어느 쪽을 코드에 넣을지는 라이브러리가 정합니다. Arduino의 Wire와 Linux의 i2c-dev는 7비트를 받아 읽기/쓰기 비트를 알아서 붙입니다. 일부 벤더 HAL은 8비트를 그대로 받습니다. 헷갈리면 알려진 장치로 시험해 보는 편이 문서를 다시 읽는 것보다 빠릅니다.
예약된 구간
전체 7비트 공간 128개 중 열여섯 개는 표준이 가져갑니다.
0x00~0x07— 일반 호출, 시작 바이트, CBUS 등0x78~0x7F— 10비트 주소 지정과 장치 ID
실제로 쓸 수 있는 주소는 112개입니다. 그 구간에서 장치가 응답했다면 표기가 잘못됐거나 규격을 지키지 않는 장치입니다.
스캔 결과를 읽는 법
스캔은 모든 주소에 쓰기를 시도하고 ACK가 오는지 보는 것입니다. 그래서 응답이 있다는 것은 그 주소에 무언가 있다는 뜻일 뿐, 그것이 무엇인지는 알려 주지 않습니다.
아무것도 안 잡힐 때 확인 순서는 정해져 있습니다. 풀업 저항이 있는지 — 오픈 드레인이라 없으면 신호가 올라오지 못합니다 — 전원과 접지를 공유하는지, 주소 설정 핀이 의도대로 결선됐는지입니다. 풀업 값을 정해야 한다면 I²C 풀업 저항 계산기가 상한과 하한을 계산해 줍니다.
주소가 겹칠 때
같은 모델을 여러 개 달면 주소가 겹칩니다. 대부분의 장치는 주소 핀 한두 개를 두어 하위 비트를 바꿀 수 있게 해 두었고, 그래도 부족하면 I²C 멀티플렉서를 씁니다.
주소가 겹친 상태로 둘 다 연결하면 둘 다 응답해 버스에서 충돌합니다. 스캔에서 그 주소가 아예 안 보이거나 읽은 값이 뒤섞이는 형태로 나타납니다.
10비트 주소
7비트로 부족한 경우를 위해 10비트 주소 지정이 있습니다. 첫 바이트는 11110으로 시작하는
예약 패턴에 상위 두 비트를 담고, 둘째 바이트가 나머지 여덟 비트입니다.
7비트 장치와 같은 버스에 섞어 쓸 수 있도록 설계됐지만, 실제로 10비트를 쓰는 장치는 흔치 않습니다. 쓰기 전에 마스터 쪽 드라이버가 지원하는지 확인하세요.
자주 묻는 질문
데이터시트 주소와 스캔 결과가 두 배 차이 납니다.
한쪽이 7비트, 다른 쪽이 8비트 표기이기 때문입니다. I²C는 주소 7비트 뒤에 읽기/쓰기 비트 하나를 붙여 한 바이트로 보냅니다. 7비트 주소 0x50은 쓰기일 때 0xA0, 읽기일 때 0xA1로 나갑니다. 스캔 도구는 대개 7비트로 표시하고 데이터시트는 8비트로 적는 경우가 많아 정확히 두 배로 보입니다.
어느 쪽 표기를 코드에 넣어야 하나요?
라이브러리가 요구하는 쪽입니다. Arduino의 Wire와 Linux의 i2c-dev는 7비트를 받아 읽기/쓰기 비트를 알아서 붙입니다. 일부 벤더 HAL은 8비트를 그대로 받습니다. 어느 쪽인지 모르겠다면 알려진 장치의 주소를 넣어 보고 응답이 오는 쪽이 맞습니다.
스캔했더니 주소가 하나도 안 잡힙니다.
풀업 저항부터 확인하세요. I²C는 오픈 드레인이라 풀업이 없으면 신호가 올라오지 못합니다. 그다음은 전원과 접지 공유, 그리고 주소 핀 설정입니다. 여러 장치가 같은 주소로 설정돼 충돌하면 둘 다 안 보이기도 합니다.
예약 주소는 무엇인가요?
0x00부터 0x07까지와 0x78부터 0x7F까지는 표준이 특수 용도로 예약해 두었습니다. 일반 호출, 10비트 주소 지정, 버스 제어 같은 기능에 쓰입니다. 그 구간에 있는 장치를 발견했다면 표기가 잘못됐거나 규격을 벗어난 장치입니다.
10비트 주소는 어떻게 다른가요?
두 바이트로 보냅니다. 첫 바이트는 11110으로 시작하는 예약 패턴에 상위 두 비트를 담고, 둘째 바이트가 나머지 여덟 비트입니다. 7비트 장치와 같은 버스에 섞어 쓸 수 있도록 설계됐지만 실제로 쓰는 장치는 많지 않습니다.