가상 센서 명세 읽기
70분 안팎
학습 목표
제공할 자체 센서 명세에서 전압·7비트 주소·레지스터·단위·시간 제한을 찾아 표로 제출합니다.
개념
가상 센서 명세 읽기
데이터시트를 읽는 목적은 코드에 넣을 숫자를 찾는 데서 끝나지 않습니다. 전압인지 주소인지 시간을 뜻하는 값인지 구별하고, 잘못된 연결이나 오래된 값을 정상 측정으로 기록하는 일을 예방합니다. 이번 프로젝트는 자체 가상 SENSOR-48 명세를 사용합니다. 실제 판매 센서의 특성을 대신하지 않습니다. 장치 이름이 비슷하다는 이유로 다른 데이터시트의 변환식을 가져오지 않습니다.
실습 환경은 Python 3 브라우저 실행과 C11 로컬 빌드입니다. 로컬 압축을 독립 폴더에 풀고 Makefile 위치에서 make test를 실행합니다. C 컴파일러·make·Python 표준 라이브러리만 사용하며 외부 패키지와 실물 장치는 필요하지 않습니다. gcc --version으로 실제 컴파일러를 기록합니다. 맥에서는 gcc라는 이름으로 Apple Clang이 실행될 수 있습니다. starter 기능 실패와 환경 오류를 구별합니다.
가상 명세는 전원 3.3V, 입력 허용 0~3.3V, 공통 GND를 정의합니다. 이 수치는 실습 장치가 받아들인다고 가정한 범위이며 특정 보드의 절대 최대 정격이 아닙니다. 실물에서는 전원 핀과 신호 핀의 정격을 각각 확인합니다. 5V로 전원을 주고 소프트웨어에서 값을 3.3V로 보정하는 방법은 전기적 조건을 만족시키지 않습니다. PC에서는 그 위험을 재현하지 않고 연결 표로 검토합니다.
I2C 연결 표에는 SDA·SCL·GND와 풀업 전압을 적습니다. SDA와 SCL을 3.3V로 풀업한다고 가정하지만 저항값이나 버스 속도는 모델이 검증하지 않습니다. 실물에서는 배선 길이·버스 용량·장치의 전류 조건을 검토해 풀업을 정합니다. 저항을 아무 값으로 넣어도 된다고 결론 내리지 않습니다. 미정인 항목을 빈칸으로 숨기지 말고 실물 확인 필요라고 적습니다.
주소는 장치를 선택하는 값이고 레지스터는 선택된 장치 안의 데이터를 선택합니다. SENSOR-48의 7비트 주소는 0x48, 온도 레지스터는 0x00입니다. 이번 hal_i2c_read는 7비트 주소를 그대로 받습니다. 버스 주소 바이트는 방향 비트를 붙여 쓰기 0x90, 읽기 0x91이 되지만 API에 그 값을 넣으면 BUS_ADDR로 거부합니다. 어느 표현을 요구하는지 문서와 선언을 먼저 확인합니다.
온도는 정확히 두 바이트로 반환됩니다. 첫 바이트가 상위 바이트인 big-endian이고 전체 16비트가 2의 보수 부호 있는 값입니다. 1LSB는 1/256°C이므로 밀리도 단위로 기록할 때 원시값에 1000을 곱하고 256으로 나눕니다. 음수와 버림 정책은 다음 레슨에서 구현합니다. 첫 바이트만 쓰면 비트 폭을 잃습니다. 바이트 수와 단위를 한 행에 함께 적습니다.
응답 제한은 20ms이며 정확히 20ms는 성공, 21ms부터 시간 초과입니다. 수집 주기 100ms와 응답 제한은 다른 계약입니다. 주기는 언제 작업을 시작할지, 제한은 한 요청을 얼마나 기다릴지 정합니다. PC fixture의 delay_ms는 주입된 경과 시간이며 실제로 잠들거나 시계를 측정하지 않습니다. 테스트가 빨리 끝나도 센서가 실제로 20ms 안에 응답했다는 증거가 되지 않습니다.
보조 ADC 입력은 12비트, 유효 원시값은 0~4095, 기준전압은 3300mV입니다. 온도 센서 바이트와 ADC 숫자는 별개의 입력입니다. ADC 4095가 3300mV를 의미한다고 온도 원시값도 같은 범위로 제한하면 음수가 사라집니다. 신호별로 폭·부호·단위·변환식을 구분합니다. ADC 변환은 이번 프로젝트의 끝점 보정 모델이며 모든 실제 ADC의 전달 함수를 일반화하지 않습니다.
UART는 115200 baud·8N1을 가정합니다. 데이터 비트 8개, 패리티 없음, 정지 비트 1개라는 설정과 응용 프레임의 길이는 다른 층입니다. 프레임은 A5 시작 바이트, 0A 길이, 10바이트 payload, XOR로 구성합니다. PC는 배열만 만들고 파형이나 baud 오차를 재현하지 않습니다. 실물에는 TX와 상대 RX의 연결, 공통 GND, 전압 호환성과 수신 설정을 추가 확인합니다.
SPI 저장기는 mode0과 활성 낮음 CS를 사용합니다. 선택 함수는 CS를 낮춘 상태를 표시하고 해제 함수는 높인 상태를 표시합니다. mode0은 CPOL0·CPHA0으로 클럭 대기가 낮고 첫 상승 에지에서 샘플링합니다. 가상 저장기는 모드를 검사하고 RAM에 바이트를 덧붙일 뿐 클럭 에지를 생성하지 않습니다. 명세 요구와 코드 검사값이 일치하는지 읽습니다.
오류 표에는 BUS_ADDR, BUS_REG, BUS_DETACHED, BUS_NACK, BUS_TIMEOUT을 별도 행으로 둡니다. 분리 여부는 fixture가 제공하는 사실입니다. 실물에서는 분리된 장치도 NACK로 보일 수 있으므로 반환 코드만으로 케이블 분리를 확정하지 않습니다. 전압·배선·주소·응답 순으로 가설을 좁히고 입력을 남깁니다. NACK를 값 0으로 바꾸면 정상 0도와 실패를 구별할 수 없습니다.
여러 잘못된 조건이 동시에 있으면 먼저 검사한 오류가 반환됩니다. 가상 계약은 인자, 주소, 레지스터, 연결, NACK, 시간 초과 순입니다. 분리되어 있고 주소도 틀리면 BUS_ADDR이 먼저입니다. 이는 모든 장치의 표준 오류 우선순위가 아니라 테스트를 결정적으로 만드는 규칙입니다. 보고서에는 반환값뿐 아니라 주입 조건을 적어야 다른 사람이 결과를 재현할 수 있습니다.
실패한 읽기는 호출자가 제공한 출력 두 바이트를 바꾸지 않습니다. 보존은 실패 결과를 읽어도 된다는 뜻이 아닙니다. BUS_OK일 때만 새 값을 해석합니다. 기존 값이 메모리에 남은 것을 새 측정으로 기록하면 신선도가 깨집니다. 문서에 성공 시 출력과 실패 시 출력의 유효성을 나누어 적습니다. 다음 복구 모듈은 이 계약 위에 재시도와 상태 전이를 추가합니다.
제출 표는 조건·설정·근거·확인 방법 네 열로 작성합니다. 전압에는 실물 후속 점검, 주소에는 API 인자 검사, 형식에는 FF80 해석, 제한에는 20/21ms 경계를 넣습니다. 근거를 단순히 데이터시트라고 쓰지 말고 가상 명세의 해당 문장을 적습니다. 측정 로그와 가정을 섞지 않습니다. 설정만 정한 항목을 측정 완료로 적으면 보드 이식 판단을 잘못할 수 있습니다.
리뷰에서는 다른 사람이 표만 보고 같은 바이트를 만들 수 있는지 확인합니다. 단위를 도라고만 적으면 섭씨와 밀리도가 섞입니다. 주소에 48만 적으면 십진수인지 16진수인지 알기 어렵습니다. 0x48·7비트·API 무시프트를 함께 표시합니다. 미정 사항은 장치가 정해질 때 확인할 목록으로 남기고 지금 검증 가능한 계약은 테스트로 연결합니다.
표에서 timeout의 포함 경계가 빠졌다면 두 작성자가 다른 비교식을 만들 수 있습니다. SPI 저장량이 없으면 full 처리가 리뷰에서 빠집니다. 모호한 말을 구체적인 정수와 반환 코드로 바꾸고 가상 명세의 버전을 적습니다. 실습 다운로드의 BUS-SPEC.md가 같은 조건을 담고 있습니다. 표와 그 문서를 대조하고 차이가 있으면 어떤 요구가 바뀌었는지 확인합니다. 가상 검사와 실물 검사를 구분하는 것이 이번 제출의 핵심입니다.
원리 확인: NXP I2C 명세의 주소·ACK와 Microchip SPI 안내의 mode0을 참조합니다. SENSOR-48 숫자는 자체 계약입니다.
따라하기
주소 표현 대조
API 주소와 버스 바이트를 구분하여 연결 표에 적습니다.
address = 0x48
print("API", hex(address))
print("WRITE", hex(address * 2))
print("READ", hex(address * 2 + 1))실행 결과
API 0x48 WRITE 0x90 READ 0x91
시간 경계 계산
가상 명세의 포함 경계를 계산합니다. 실제 응답 측정은 아닙니다.
for delay in (19, 20, 21):
print(delay, "OK" if delay <= 20 else "TIMEOUT")실행 결과
19 OK 20 OK 21 TIMEOUT
명세 표 제출
전압·주소·레지스터·폭·부호·단위·제한·ADC·UART·SPI를 조건/설정/근거/확인 방법 표로 적습니다. 실물 확인 항목과 PC 검사를 구분하고 주소 0x90 API 호출을 거부하는 이유를 설명합니다.
확인 문제
실습
자체 가상 SENSOR-48 명세 표를 제출합니다. 전압·7비트 주소·레지스터·두 바이트 순서·부호·LSB·20ms 포함 경계·ADC·UART·SPI를 근거와 함께 적습니다. 가상 검사와 실물 확인 필요를 구별하고 0x90 주소 인자 거부 이유를 설명합니다.
더 읽기
면접 질문
- 센서가 응답하지 않을 때 점검할 순서를 설명해 주시면 됩니다.