---
title: "SPI MRAM의 빠른 쓰기에서 실제 commit 경계는 어디일까"
author: "브레이브브라우저쓰자"
published_at: "2026-10-15T05:49:02.065Z"
updated_at: "2026-10-06T00:38:00.140Z"
tags: ["spi mram write boundary"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/spi-mram%EC%9D%98-%EB%B9%A0%EB%A5%B8-%EC%93%B0%EA%B8%B0%EC%97%90%EC%84%9C-%EC%8B%A4%EC%A0%9C-commit-%EA%B2%BD%EA%B3%84%EB%8A%94-%EC%96%B4%EB%94%94%EC%9D%BC%EA%B9%8C"
ai_assisted: true
---

# SPI MRAM의 빠른 쓰기에서 실제 commit 경계는 어디일까

이 글은 AI가 활용됐습니다.

[원문](https://ariser.io/@writer_a9817d5a8de0/spi-mram%EC%9D%98-%EB%B9%A0%EB%A5%B8-%EC%93%B0%EA%B8%B0%EC%97%90%EC%84%9C-%EC%8B%A4%EC%A0%9C-commit-%EA%B2%BD%EA%B3%84%EB%8A%94-%EC%96%B4%EB%94%94%EC%9D%BC%EA%B9%8C)

SPI MRAM은 긴 erase나 program 대기 없이 데이터를 연속해서 쓸 수 있다. 그렇다면 chip select를 한 번 내리고 여러 byte를 보내는 동안 갱신 전체가 한 덩어리로 보장될까? SPI MRAM Write Boundary에서 보아야 할 경계는 전송 명령의 끝과 데이터 구조의 확정 지점이다.

빠르게 쓴다는 특성과 한꺼번에 바뀐다는 특성은 별개다. 여러 byte를 순서대로 받아 쓰는 장치라면, 앞부분이 바뀌고 뒷부분은 아직 도착하지 않은 구간이 존재한다. 그 구간에서 작업이 끝나면 정상적인 byte들의 조합도 불완전한 record가 될 수 있다.

## CS는 전송을 묶지만 record를 원자화하지 않는다

Everspin MR20H40/MR25H40의 Rev.12.6 문서는 WRITE 02h와 3byte 주소 뒤 데이터를 연속해서 쓸 수 있고 CS를 high로 올려 명령을 끝낸다고 설명한다. 정격 clock에서 별도의 write delay나 data polling을 요구하지 않는다는 점도 명시한다. [원문 p.7 및 p.12](https://www.everspin.com/sites/default/files/EST00459_MR2xH40_Datasheet_Rev12.6_08092020.pdf)

이는 CS를 올릴 때까지 모든 byte를 내부에 보류했다가 한꺼번에 바꾼다는 설명이 아니다. 문서는 byte들이 순차적으로 기록된다고 한다. SPI 명령의 한 구간에 있었다는 이유만으로 host의 구조체나 log record 전체가 atomic하게 갱신된다고 가정할 수 없다.

가상의 4byte record가 00 00 00 00이고 새 값은 12 34 56 78이라고 하자. 정상 전압·명령 조건에서 앞의 세 data byte까지만 보내고 올바른 byte 경계에서 CS를 올렸다면 새 기록은 12 34 56 00이다. 세 byte를 쓴 명령은 정상적으로 끝날 수 있지만, host가 의도한 4byte 갱신은 끝나지 않았다.

## 마지막 byte를 다 보내지 않은 경우

datasheet는 접근을 byte의 끝, CS가 내려간 이후 8clock의 정수배 경계에서 끝내라고 요구한다. Everspin의 MR25Hxxx FAQ는 byte 중간에 CS를 high로 올렸을 때 잘린 마지막 byte는 기록되지 않는다고 설명한다. 이것은 해당 SPI 제품군의 명시된 동작이며 일반적인 정상 종료 방식으로 사용할 규칙은 아니다. [공식 FAQ, MR25Hxxx Byte Write Cycle](https://legacy.everspin.com/frequently-asked-questions)

위 record의 두 data byte를 모두 보내고 세 번째를 4bit만 보냈다고 하자. 명령 8bit와 주소 24bit, 앞의 data 16bit와 미완성 4bit를 합하면 52clock이다. 이때 CS를 올린 경우 FAQ의 마지막 byte 규칙을 적용하면 세 번째 미완성 byte를 새 데이터로 인정하지 않는다. 앞의 완전한 두 byte가 있었다는 사실까지 전체 갱신의 취소로 바뀌는 것은 아니다.

실제 power cut은 이 정상 전압에서의 CS 종료와 같지 않다. 전압이 동작 범위를 벗어나는 중에 들어온 bit나 쓰던 byte의 결과를 위 규칙만으로 보장할 수 없다. 전원 복귀 뒤 저장 결과를 확인하는 절차가 필요하다. bus protocol의 잘린 byte 규칙을 전원 차단 원자성으로 확대하면 안 된다.

## 소요 시간을 줄여도 중간 상태는 존재한다

clock을 가상으로 10MHz로 두면 command 1byte, address 3byte, data 4byte는 총 64clock, 6.4μs다. WREN 명령과 CS 간격 등은 제외한 시간이다. data 세 byte까지는 56clock, 5.6μs다. 짧은 쓰기라고 해도 5.6μs에서 끝난 전송과 6.4μs까지 끝난 전송은 같은 내용을 남기지 않는다.

이 제품의 status register에는 긴 program을 기다리는 write-in-progress bit가 필요하지 않다. 하지만 busy polling이 없다는 사실이 record checksum 검사나 write 보호 조건을 대체하지는 않는다. WEL과 보호 상태는 접근이 허용되는지를 나타내며 여러 byte의 내용이 서로 일관된지를 증명하지 않는다. [원문 p.8 및 p.10](https://www.everspin.com/sites/default/files/EST00459_MR2xH40_Datasheet_Rev12.6_08092020.pdf)

## 확정 지점은 저장 형식이 만들어야 한다

새 record를 빈 slot에 쓰고, payload와 길이·순번·검사 정보를 먼저 완성한 뒤 마지막에 valid marker를 쓰는 방식을 생각할 수 있다. 처음 invalid로 준비된 새 slot에서 payload가 중간에 멈추면 marker가 아직 없으므로 완성 record로 채택하지 않는다. 기존 유효 record는 새 record의 완료를 확인하기 전까지 유지한다.

여기서 marker 하나가 모든 전원 고장을 해결한다고 볼 수는 없다. slot을 재사용하면서 옛 valid marker를 남겨 두면 새 payload의 일부와 옛 marker가 함께 보일 수 있다. marker의 초기화, 순번의 처리와 읽기 검증 조건도 저장 형식의 일부다.

검사 정보도 확률적인 검출 한계를 가지므로 실제 오류 모델에 맞게 선택해야 한다. 전원 하강 중 marker byte의 유효성이 불확실할 수 있다는 점과 host의 write 순서가 실제 SPI 전송 순서로 보장되는지도 확인한다. 원자적인 record 보장은 단순히 “marker를 마지막에 보내라”는 한 줄보다 구체적인 계약이다.

SPI MRAM Write Boundary를 판단할 때는 정상 완료한 byte, 올바르게 종료한 명령과 유효한 record를 따로 확인한다. MRAM의 빠른 연속 쓰기는 좋은 재료다. 그 재료를 전원 복귀 후에도 읽을 수 있는 일관된 데이터로 만드는 확정 경계는 시스템의 기록 순서와 검증 규칙에서 정해진다.

