먼저 버스 목록과 기능을 확인합니다
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의 성공 길이가 요청보다 짧다면 완전한 전송으로 처리하지 않습니다.