바이트가 왔다는 사실과 센서/설정이 유효하다는 판단은 다르다
센서 버스가 응답하고 EEPROM에 숫자가 남아 있어도 최신 관측/맞는 단위·현재 펌웨어에서 유효한 설정인지는 별도다. M04.03의 raw/변환/시각 구분을 버스 프레임·저장 기록으로 확장한다. 주소/모드·전송량·실패/버전이 먼저 맞아야 한다.
이 단위의 센서는 실제 제품이 아닌 가상 대상이다. 읽기 opcode/레지스터·바이트 의미와 기록의 CRC/commit 상태는 제공 입력이다. 실제 칩에 이 바이트를 전송하는 절차가 아니다. 공통 버스 원리와 ATmega328P의 해당 모드/내부 EEPROM을 참고하며 다른 장치/라이브러리에 숫자를 그대로 복사하지 않는다.
SPI는 clock/선택·샘플 edge와 대상의 프레임을 맞춘다
SPI의 이 예제에서는 전송을 주도하는 controller가 SCK/MOSI를 내보내고 대상이 MISO로 데이터를 돌려준다. CS는 이번 가상 대상의 active-low 선택 신호다. 두 장치의 역할/모드·bit 순서/clock·선택 구간을 함께 확인한다. 용어/핀 이름은 실제 문서와 대조한다.
그림 M04.04-1. 각 칸은 서로 다른 역할/근거다. 나란히 비교할 항목이며 위아래가 시간 순서를 뜻하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
mode0(CPOL0/CPHA0)은 clock이 idle-low이고 첫 상승 edge에서 샘플하는 규약이다. 다른 모드의 상대와 연결해도 우연히 바이트가 보일 수 있으나 그 결과를 정상으로 보장할 수는 없다. Microchip 데이터시트의 §18 SPI 모드를 참고한다.
가상 계약은 mode0·MSB-first·SCK1MHz, CS를 내린 뒤 읽기 명령0xA0·레지스터0x10·dummy0x00두개를 보내고 CS를 올린다. 처음 두 수신 바이트는 이 계약에서 사용하지 않고, 다음0x01/0x02가 unsigned16 big-endian 값의 payload라고 주었다.
| 순서 | 보내는 바이트 | 가상 수신/의미 |
|---|---|---|
| 1 | 0xA0 | 이계약의명령구간·수신값미사용 |
| 2 | 0x10 | 레지스터선택·수신값미사용 |
| 3 | 0x00 | payload첫바이트0x01 |
| 4 | 0x00 | payload둘째바이트0x02 |
4B×8=32clock, 이상 선로 시간은32/1000000=32µs다. CS setup/hold·장치 응답/처리·간격/호스트 지연은 제외했다. 이 opcode/프레임은 가상 대상의 명세이며 SPI 자체의 공통 읽기 명령이 아니다.
MSB-first는 각 바이트 안의 bit 순서다. 여러 바이트의 수치 순서와는 다르다. 주어진 big-endian 값은0x0102=258이고, 같은 두 바이트를 little-endian으로 해석하면0x0201=513이다. 같은 샘플의 두 바이트가 고정돼 나오는지, 중간에 측정값이 바뀔 수 있는지는 대상의 burst/latch·증분 주소 규약을 추가로 확인해야 한다. 빠르게 읽었다는 사실만으로 같은 시점의 관측이 되는 것은 아니다.
I2C의 7bit 주소·선로 방향 비트·내부 레지스터 주소를 나눈다
I2C는 SDA/SCL을 쓰는 버스다. 이 단위는 Standard-mode/7bit 주소의 예이며 TWI는 이 장치에서 관련 인터페이스를 부르는 이름이다. open-drain/pull-up·선로 부하/논리 조건과 양쪽 지원 모드를 확인한다. NXP UM10204 Rev.7.0의 §3.1을 참고한다. 다른 속도/10bit 주소·특수 모드까지 그대로 확장하지 않는다.
가상 대상의 7bit 주소는0x68이다. 선로의 주소 바이트는 주소7bit 뒤에 방향 bit를 붙여 write0xD0·read0xD1이 된다. 가상 driver API는7bit를 받으므로 인수는0x68이다. 어떤 API가7bit/8bit 표기를 요구하는지 실제 계약을 확인한다. 센서 내부 레지스터0x10은 또 다른 주소이며0x68이나0xD0의 별칭이 아니다.
가상 대상에서 레지스터0x10부터 두 바이트를 읽는 순서는 START → 주소W0xD0/ACK → 레지스터0x10/ACK → repeated START → 주소R0xD1/ACK → 데이터0x01/ACK → 데이터0x02/NACK → STOP이다. 주소/포인터·연속 읽기 의미는 이 대상의 계약이다. repeated START를 썼다고 내부 측정/레지스터 쌍의 동시성이 자동 보장되지는 않는다.
주소W·레지스터·주소R·두 데이터로5B, 각각8bit와ACK/NACK clock1개가 있어45SCL펄스다.100kHz의 이상 clock 구간은450µs다. START/STOP/설정·hold·clock 늘어남·큐/처리 시간은 추가다. payload16bit만 세어160µs라고 하면 주소/레지스터·응답 구간을 누락한다.
마지막 읽기 바이트 뒤 controller의 NACK는 이 전송을 끝내겠다는 정상 신호다. 주소에 대한 NACK·timeout과 같은 오류로 취급하지 않는다. 반대로 ACK가 있었다는 사실도 새 측정/맞는 단위/정상 센서의 보증이 아니다. 어느 단계/대상이 응답했는지와 받은 길이·상태/원본 시각을 기록한다.
계산한 버스 clock과 실제 완료 시간은 다르다
ATmega328P의 이 TWI 모드에서 실제 CPU clock16MHz·TWBR72·prescaler1이면 SCL 계산값은16000000/(16+2×72×1)=100kHz다(§21). clock/분주·pull-up/부하와 실제 선로 조건을 확인한다. clock stretching을 사용하는 대상이나 여러 controller의 중재·소프트웨어 처리로 전체 시간이 더 늘 수 있다.
앞의 SPI32µs/I2C450µs는 서로 다른 clock과 프레임의 제공 예제 구간 계산이다. 모든 센서에서 어느 버스가 더 정확/빠르다는 실험 결과가 아니다. 실제 timeout/오류·부분 전송, 중간 업데이트·호스트의 대기/미확인을 따로 남긴다. 재시도/상태기계는 M04.05로 연결한다.
내부 EEPROM은 센서 버스도 무한한 로그 RAM도 아니다
여기서 EEPROM은 ATmega328P 내부의 별도1KiB 비휘발 공간이다(§7.4). 앞선 가상 I2C 센서나 외부 I2C EEPROM을 뜻하지 않는다. 외부 저장 부품은 주소/페이지·쓰기/대기/완료 규약이 따로 있으므로 내부 용량/시간을 복사하지 않는다.
설정/보정·버전을 남길 수 있지만 쓰기 시간/내구·전원 조건을 확인해야 한다. 데이터시트의 erase+write3.4ms는 해당 동작의 typical 예이며 모든 기록의 최대 완료 시간이나 SRAM 쓰기 속도가 아니다. 레코드가 여러 바이트면 순서/완료와 전원 변화도 확인한다.
계획용 가정을 '한 셀에100000회·업데이트마다 같은 셀을1번·100updates/s'로 두면100000/100=1000s,16분40초다. 이때까지 보장되거나 정확히 그때 고장난다는 수명 예측이 아니다. 실제 조건/셀별 쓰기·메타데이터 반복/분산과 driver 동작이 남아 있다. raw 센서를 고속 반복 저장하는 RAM처럼 사용하지 말고 기록 목적/쓰기 빈도·변경만 저장하는 정책과 검증 범위를 정한다.
기록의 검사/commit과 설정 복구·출력 재개를 나눈다
다음은 실제 EEPROM을 쓰지 않고 주어진 기록 상태를 판단하는 모형이다. 유효 규칙은 schemaS1, sample_period_ms1~1000, CRC검사통과, commit1이다. seq는 예제 구간에서 wrap없이 증가한다고 가정한다. 유효한 기록 중 최신 seq를 고르며, 같은 seq의 서로 다른 내용/알 수 없는 규칙은 임의로 정상 처리하지 않는다.
기존 slotA는 seq10/period20ms/S1·CRC통과/commit1이다. 새 slotB도 schemaS1이라고 주었다. B의 다른 상태를 바꿔 보자.
| 새 B의 상태 | 선택 | 이유 |
|---|---|---|
| seq11/period10·CRC실패/commit1 | A | 손상/불일치기록을새설정으로쓰지않음 |
| seq11/period10·CRC통과/commit0 | A | 미완료후보기록 |
| seq11/period10·CRC통과/commit1 | B | 이모형의모든검사충족 |
| seq11/period0·CRC통과/commit1 | A | 범위위반·CRC만으로의미가유효하지않음 |
두 slot 모두 무효면 설정을 미확인/복구 실패로 두고, 확인되지 않은0이나 예전값으로 정상 출력을 만들어 쓰지 않는다.
CRC 결과는 제공 입력이며 이 단원에서 CRC/쓰기/복구 코드를 구현한 것이 아니다. CRC는 인증이나 물리적 타당성도 보장하지 않는다. 설정10ms가 형식 범위를 만족해도 실제 센서의 대역/처리/안전에 충분한지는 추가 확인이다.
새 slot에 내용/검사를 남긴 뒤 commit하고 기존 유효본을 보존하는 개념은 부분 쓰기를 구별하는 설계에 도움이 된다. 하지만 byte의 원자성·쓰기 순서/완료·저전압/정전 중 손상·복구 규칙을 실제 장치에서 검증하지 않고 정전 안전을 보장했다고 말하지 않는다. 여기서는 주어진 표의 선택/거부가 범위다.
설정을 읽어 복구한 일과 모터 출력을 재개하는 일도 다르다. 현재 관측/권한·장치 상태/감독 전제를 확인하기 전 과거 저장값으로 자동 동작했다고 보고하지 않는다. 다음 단위에서 요청/만료·상태 전이를 다룬다.
센서 원본에서 호스트까지 계약을 이어 적는다
SPI/I2C의 대상/장치·모드/clock/주소·CS/프레임·비트/바이트 순서, 수신 길이/응답·오류/timeout·원본/수신 시각을 나눈다. EEPROM은 공간/기록 schema·버전/단위/범위·검사/commit과 복구 선택·실제 미확인을 남긴다. 버스 ACK나 저장 완료를 전체 로봇/센서 성과로 바꾸지 않는다.
기존 4.4 센서 시간 정합과 M04.03의 출처/획득 시각·alias/driver를 연결한다. 기본 완료는 제공 프레임/기록의 계산과 의미·한계를 설명한 상태이며 실제 통신/쓰기/정전/장비 실증과 별개다.