먼저 버스 목록과 기능을 확인합니다
i2cdetect -l
ls /sys/bus/i2c/devices
cat /sys/bus/i2c/devices/i2c-1/name
i2cdetect -F 11은 예시 버스 번호입니다. 실제 목록에서 대상 어댑터를 먼저 고릅니다. -l은 버스 목록, -F는 어댑터가 보고하는 지원 기능입니다. 둘 다 주소 범위를 훑어 장치에 질의하는 일반 스캔과 구분합니다. /dev/i2c-N 접근에는 i2c-dev와 파일 권한 등 환경 조건이 필요합니다.
스캔 결과는 다음처럼 읽습니다
| 표시 | 판단할 수 있는 내용 |
|---|---|
| UU | 그 주소를 커널이 사용 중이어서 probing을 생략한 표시입니다. |
| 16진수 주소 | 사용한 probing 방식에 응답했습니다. 모델이나 모든 기능을 인증한 결과는 아닙니다. |
| -- | 이번 probing에 응답하지 않았습니다. 장치가 물리적으로 없다고 단정하지 않습니다. |
I2C에는 모든 장치에 안전한 표준 탐색 명령이 없습니다. i2cdetect는 SMBus 동작 등을 이용하며 장치 상태를 바꾸거나 문제를 일으킬 수 있습니다. 데이터시트와 해당 버스의 장치 구성을 확인한 후 필요한 방식만 선택합니다. UU를 없애려고 강제 접근 옵션부터 쓰지 않습니다.
- 등록 여부커널이 주소를 점유하거나 드라이버에 연결했는지 확인합니다.
- 버스 응답특정 전송에 장치가 응답했는지 확인합니다.
- 기능 검증식별 레지스터와 정상 동작을 해당 장치 규격으로 확인합니다.
상자는 증거의 종류입니다. 앞 단계의 성공만으로 뒤 단계까지 성공했다고 보지 않습니다.
7비트 주소와 전송 바이트를 구분합니다
어떤 데이터시트는 7비트 주소와 R/W 비트를 합친 8비트 값을 표기합니다. Linux API에 필요한 값이 7비트인지 10비트인지와 문서의 표기법을 먼저 확인합니다. 모든 주소를 무조건 한 비트 오른쪽으로 옮기면 이미 7비트인 주소를 틀리게 만듭니다.
커널에서 장치를 만들 때 i2c_new_client_device 등의 실패는 ERR_PTR 규약을 확인해야 합니다. NULL 검사만으로 모든 실패를 잡지 못합니다. 전송 API도 메시지 수를 반환하는지 바이트 수를 반환하는지 구분합니다. i2c_master_send의 성공 길이가 요청보다 짧다면 완전한 전송으로 처리하지 않습니다.
확인한 문서
주소 스캔 전: 유휴 전압과 풀업 경로
전원이 켜진 보드에서 GND를 기준으로 SDA와 SCL의 유휴 전압을 각각 확인합니다. 정상 HIGH인 SDA와 VCC 사이를 재면 약 0 V일 수 있으므로 측정 기준을 혼동하지 않습니다. LOW가 지속되면 풀업 누락, 단락, 핀 설정, 장치의 버스 점유, 레벨 변환기와 전원 조건을 나누어 봅니다. 풀업 없는 선이 언제나 0 V로 측정된다고 가정하지 않습니다.
4.7 kΩ은 공통 처방이 아닙니다. 여러 풀업은 병렬로 합쳐집니다. NXP UM10204 Rev. 7.0 §7.1의 Standard/Fast/Fast-mode Plus 저항 풀업에서는 버스 정전용량과 허용 상승시간이 상한을, 공급전압과 허용 LOW 전압·sink 능력이 하한을 제한합니다. 유휴 DMM 전압만으로 상승시간을 알 수 없으므로 실제 파형도 확인합니다. 3.3 V 핀의 5 V 풀업 허용 여부는 각 부품의 데이터시트로 판단합니다. 이 조건을 정리해도 주소 스캔의 장치별 부작용 주의는 그대로 적용됩니다.
저장된 Harshith Kolur의 사례를 계기로 추가한 진단 순서이며 특정 보드 측정이나 범용 저항 추천이 아닙니다.
English summary. Measure each idle bus line against board ground. Select pull-ups from capacitance, rise time and sink limits, including parallel resistors. A single idle voltage does not establish signal quality or make every address probe safe.