SPI NOR 플래시에 페이지 프로그램 명령을 보낸 직후 다음 쓰기 명령을 보내면 내부 프로그램 동작이 아직 끝나지 않았을 수 있습니다. Microchip의 Read Status Register 1 설명은 05h 명령으로 상태 레지스터 1을 읽고, 쓰기 중에는 BUSY 비트를 폴링하라고 안내합니다. 이 글은 MCU 드라이버에 이 절차를 넣을 때의 종료 조건과 실패 처리를 다룹니다.
BUSY와 WEL은 다른 신호
상태 레지스터 정의에 따르면 비트 0의 BUSY가 1이면 내부 프로그램·소거가 진행 중이고, 0이면 바쁘지 않습니다. 비트 1의 WEL은 쓰기 허용 래치입니다. 따라서 WEL=1만 보고 프로그램 완료를 판단하면 안 됩니다. 쓰기 전에는 06h Write Enable 뒤 WEL을 확인하고, 페이지 프로그램 02h 뒤에는 BUSY가 0으로 돌아오는지 확인합니다. Page Program 공식 설명도 상태 비트 폴링을 완료 확인 방법으로 제시합니다.
| 단계 | MCU가 확인할 것 | 실패 시 처리 |
|---|---|---|
| 프로그램 전 | 장치 식별, 보호 상태, WEL | 쓰기 중단 |
02h 명령 전송 |
CS 경계, 주소·페이지 범위 | 버스 오류 기록 |
| 프로그램 대기 | 05h로 읽은 BUSY 비트 0 |
제한 시간 초과 또는 읽기 오류로 중단 |
| 완료 후 | 읽기 검증과 데이터 비교 | 저장 실패로 처리 |
32비트 시계 오버플로를 견디는 대기 루프
다음 C11 예제는 SPI 하드웨어 대신 상태 바이트를 돌려주는 가짜 드라이버를 사용합니다. 실제 보드의 read_sr1 함수는 CS를 내리고 05h를 보낸 뒤 상태 바이트 하나를 클록하고 CS를 올리는 한 트랜잭션이어야 합니다. millis는 단조 증가하는 32비트 밀리초 시계, pause는 작업 양보 또는 짧은 지연으로 바꾸세요. 제한 시간은 대상 부품의 데이터시트에서 해당 프로그램·소거 동작에 맞춰 정하고 2^31밀리초보다 작게 유지합니다.
gcc -std=c11 -Wall -Wextra -Werror spi_nor_wait.c -o spi_nor_wait로 빌드·실행했습니다. 정상 완료, BUSY 지속에 따른 시간 초과, 틱 오버플로, SPI 읽기 실패를 각각 assert로 검사합니다.
실제 펌웨어에 적용할 때
폴링 성공은 내부 동작 종료만 뜻합니다. 페이지 주소가 경계를 넘거나 보호 비트가 설정돼도 기대한 데이터가 기록되지 않을 수 있으므로, 완료 후 다시 읽어 비교하세요. MCU의 SPI DMA·인터럽트 콜백에서 바로 긴 폴링을 반복하지 말고, 작업 문맥에서 시간 제한과 스케줄링 정책을 적용하세요. 전원 중단 가능성이 있는 데이터에는 별도의 저널·이중 슬롯 설계가 필요합니다. 이 예제는 PC의 가짜 상태 값으로 제어 흐름을 검증했으며 실제 NOR 칩의 전기적 타이밍은 시험하지 않았습니다.
댓글
첫 댓글을 남겨 보세요.