Linux I2C · i2c-tools

i2cdetect의 UU와 빈칸을 해석합니다

주소 응답과 커널의 장치 등록, 실제 기능 동작을 구분합니다.

먼저 버스 목록과 기능을 확인합니다

i2cdetect -l
ls /sys/bus/i2c/devices
cat /sys/bus/i2c/devices/i2c-1/name
i2cdetect -F 1

1은 예시 버스 번호입니다. 실제 목록에서 대상 어댑터를 먼저 고릅니다. -l은 버스 목록, -F는 어댑터가 보고하는 지원 기능입니다. 둘 다 주소 범위를 훑어 장치에 질의하는 일반 스캔과 구분합니다. /dev/i2c-N 접근에는 i2c-dev와 파일 권한 등 환경 조건이 필요합니다.

스캔 결과는 다음처럼 읽습니다

표시판단할 수 있는 내용
UU그 주소를 커널이 사용 중이어서 probing을 생략한 표시입니다.
16진수 주소사용한 probing 방식에 응답했습니다. 모델이나 모든 기능을 인증한 결과는 아닙니다.
--이번 probing에 응답하지 않았습니다. 장치가 물리적으로 없다고 단정하지 않습니다.

I2C에는 모든 장치에 안전한 표준 탐색 명령이 없습니다. i2cdetect는 SMBus 동작 등을 이용하며 장치 상태를 바꾸거나 문제를 일으킬 수 있습니다. 데이터시트와 해당 버스의 장치 구성을 확인한 후 필요한 방식만 선택합니다. UU를 없애려고 강제 접근 옵션부터 쓰지 않습니다.

장치 확인의 서로 다른 수준
  1. 등록 여부커널이 주소를 점유하거나 드라이버에 연결했는지 확인합니다.
  2. 버스 응답특정 전송에 장치가 응답했는지 확인합니다.
  3. 기능 검증식별 레지스터와 정상 동작을 해당 장치 규격으로 확인합니다.

상자는 증거의 종류입니다. 앞 단계의 성공만으로 뒤 단계까지 성공했다고 보지 않습니다.

7비트 주소와 전송 바이트를 구분합니다

어떤 데이터시트는 7비트 주소와 R/W 비트를 합친 8비트 값을 표기합니다. Linux API에 필요한 값이 7비트인지 10비트인지와 문서의 표기법을 먼저 확인합니다. 모든 주소를 무조건 한 비트 오른쪽으로 옮기면 이미 7비트인 주소를 틀리게 만듭니다.

커널에서 장치를 만들 때 i2c_new_client_device 등의 실패는 ERR_PTR 규약을 확인해야 합니다. NULL 검사만으로 모든 실패를 잡지 못합니다. 전송 API도 메시지 수를 반환하는지 바이트 수를 반환하는지 구분합니다. i2c_master_send의 성공 길이가 요청보다 짧다면 완전한 전송으로 처리하지 않습니다.

확인한 문서

Linux I2C · i2c-tools