비 휘발성 메모리에 자주 쓰기


10

온도 변화에 따라 물리적 위치를 자동으로 조정하는 장치를 설계하고 있습니다. 장치가 꺼 지거나 전원이 차단 된 경우 장치는 마지막 온도와 위치를 기억해야합니다. 이 값을 EEPROM에 저장하는 기능이 있지만 문제는 위치와 온도가 매우 빠르게 변할 수 있다는 것입니다. 매번 변경 한 후에 온도와 위치를 EEPROM에 쓰면 (1) 펌웨어 속도가 약간 느려지고 (2) 1 ~ 2 년 후에 EEPROM이 종료 될 수 있습니다. 내가 볼 때 내 옵션은 다음과 같습니다 ...

1) 커패시터 / 배터리를 사용하여 전원이 꺼진 후 잠시 동안 장치의 전원을 켜서 해당 시간에만 EEPROM에 값을 쓸 수 있도록합니다. 보드가 약간 배가 고프고 큰 캡이 필요하기 때문에 나는 이것을 좋아하지 않습니다. 그리고 나는 많은 여유 공간이 없습니다. 그리고 나는 배터리와 배터리 홀더 또는 큰 캡의 추가 비용을 원하지 않습니다.

2) EEPROM 대신 F-RAM을 사용하여 수십억 번 쓰지 않고 쓸 수 있습니다. FRAM은 EEPROM보다 약간 비싸기 때문에이 옵션이 마음에 들지 않으며 이는 하나의 제품이 아닌 프로덕션 제품을위한 것입니다.

3) 위치와 온도는 5 분마다 작성하십시오. 그렇게하면 항상 최근 위치 / 온도가 기록되지만 매 초마다 글을 쓰지 않으므로 프로그램 속도가 느려지지 않고 EEPROM이 빨리 죽지 않습니다. 이것은 내 최선의 선택 인 것 같습니다.

다른 사람이 내가 생각하지 않는 제안이 있습니까?


5
그냥 질문입니다. 장치가 자동으로 물리적 위치를 조정하면 왜 마지막 온도를 기억해야합니까? 장치의 전원을 다시 켜도 온도가 업데이트되지 않고 위치가 조정되지 않습니까?
Daniel Grillo

1
다니엘에 동의합니다. 전원을 끄고 주변 온도가 급격히 변하면 어떻게합니까? 전원을 켤 때 마지막으로 저장된 온도 / 위치를 사용한 경우 어쨌든 잘못된 위치에있을 수 있습니다. 귀하의 질문에 나열되지 않은 또 다른 요구 사항이 있습니까?
Dave

EEPROM 사양은 무엇입니까? 몇 번의 쓰기주기입니까?
Jason S

답변:


10

필요한 것은 마모 레벨링 이라는 기술 입니다. EEPROM의 동일한 위치에서 매번 데이터를 쓰지는 않지만 알고리즘을 사용하여 다른 위치를 사용합니다. 복잡한 마모 레벨링 알고리즘에 대해 읽었지만 다음과 같은 간단한 방법이 작동하지 않는 이유를 모르겠습니다.

데이터에 예를 들어 8 바이트 길이가되도록 데이터에 24 비트 카운터를 추가하십시오. 24AA64의 페이지 길이는 32 바이트이므로 64kb EEPROM은 256 페이지를 보유합니다. 데이터 시트에서 :

"32 바이트 미만의 쓰기를 수행하는 경우 나머지 페이지의 데이터가 기록되는 데이터 바이트와 함께 새로 고쳐집니다. 이로 인해 전체 페이지가 쓰기주기를 강제해야합니다. 이러한 이유로 내구성은 페이지 당 지정됩니다."

따라서 32 바이트 페이지보다 작은 데이터 블록을 사용하는 것은 의미가 없습니다.

첫 페이지의 카운터를보십시오. 0이면 해당 페이지에 대해 최대 쓰기주기 수를 사용 했으므로 다음 페이지로 이동하여 해당 카운터를 확인하십시오. 카운터> 0을 찾을 때까지 반복하십시오. 현재 사용중인 페이지입니다. Microchip의 EEPROM은 1 백만 사이클 내구성을 가지며 64kb EEPROM에서 블록 당 최대 32 바이트의 주어진 예를 통해 256 백만으로 늘릴 수 있습니다. 5 초에 한 번 쓰면 40 년 (!)입니다.

처음 사용할 때 EEPROM을 초기화하고 싶을 것입니다. 언제인지 어떻게 알 수 있습니까? 초기화시 고유 한 서명을 작성하려면 마지막 페이지를 사용하십시오. 서명이 있으면 전원을 켤 때마다 확인하십시오. 그렇지 않은 경우 장치를 초기화해야합니다. 각 페이지의 카운터를 0xF4240 (1 백만)으로 사전 설정하거나 0xFF로 모든 항목을 지우고 페이지를 처음 사용할 때 0xF4240을 쓸 수 있습니다.
때때로 생산 / 테스트 프로세스에서 특정 패턴이 기록되기 때문에 EEPROM을 초기화해야합니다.

편집
마모 레벨링으로 문제를 해결할 수 있지만 여전히 커패시터 솔루션에 대해 언급하고 싶습니다. 보드는 다소 전력이 부족하지만 마이크로 컨트롤러 / EEPROM의 전원을 나머지 보드에서 다이오드로 분리 할 수 ​​있습니다. 따라서 주 전원이 끊겼을 때 몇 mA 만 필요할 것입니다. 24AA64는 5ms 미만으로 페이지를 쓴 다음 10mA에서 100mV의 허용 전압 강하가 필요합니다.

C=ItΔV=10mA5ms100mV=500μF

작은 슈퍼 캡으로 쉽게 사용할 수 있습니다.

더 읽어보기
데이터 시트 24AA64
EEPROM Endurance Tutorial


EEPROM의 내구성은 페이지 당 제공됩니다 (최소한 24AA64 및 기타 EEPROM에 사용). 24AA64는 32 바이트 페이지를 지정하므로 개수는 블록이 아닌 페이지 당이어야합니다.
Saad

@ 사드-맞습니다. 내 대답에 수정되었습니다.
stevenvh

4

1) 쓰기 프로세스를 시작한 후에는 MCU / EEPROM에 전원을 공급하고 제어 라인이 고장 나지 않도록해야합니다. I2C는 아마도 SPI보다 우선합니다. 몇 밀리 초 동안 몇 mA 만 필요하므로 큰 용량이 아니므로 쓰기가 시작되면 MCU를 절전 모드로 전환 할 수 있습니다. 3) 아마도 일부 정보를 적용 할 수 있습니다. 또는 쓰기 전에 값이 안정 될 때까지 기다리십시오.
여러 위치에 데이터를 분산시켜 내구성을 향상시킬 수도 있습니다. Microchip에는 eeprom의 내구성을 계산하기위한 몇 가지 도구 및 앱 노트가 있으며, 이는 유용 할 수 있습니다.


4
내구성에 관한 Microchip 앱 노트 : ww1.microchip.com/downloads/en/AppNotes/01019A.pdf 또한 Appnote 에서 작동 전압을 5v에서 3.5v로 낮추어 내구성을 약 2 배 높일 수 있습니다.
vandee

1
첫 번째 방법을 사용하는 경우 비 휘발성 메모리에 쓰기가 시작되면 시스템에서 우선 순위가 가장 높은지 확인하십시오. 인터럽트로 인해 쓰기 도중에 값이 변경되거나 마이크로가 다른 처리를 시작하여 시간이 부족해질 수 있습니다. 전원을 끌 때 손상된 값을 쓰지 않는 것이 가장 중요합니다. 또한 값에 대한 CRC는 손상이 발생하지 않았 음을 확인하는 데 도움이되지만 기본값을 사용하는 등의 경우 수행 할 조치를 결정해야합니다.
Martin

3

블록 지향 플래시 장치를 사용하고 각 블록에서 1 바이트를 모드 플래그로 사용하는 것이 좋습니다. 거의 모든 모드 플래그가 프로그래밍 될 고정 변수로 유지하십시오. 모드 플래그가 프로그래밍되지 않았지만 이전 블록 (필요한 경우 래핑)이있는 블록은 하나뿐입니다. 이 블록은 최신 데이터가있는 블록입니다. 해당 블록이 채워지면 다음 블록을 지우십시오 (지우는 블록은 지우기 사이클 중에 데이터 조합을 보유 할 수 있으며 불변은 여전히 ​​유지됩니다). 일단 지우기가 완료되면 모드 플래그를 마지막 블록이 되십시오.

바이트를 프로그램하려는 모든 시도가 성공하거나 실패 할 수 있도록 플래시에 대한 공급을 충분히 보호해야하지만, 소거주기가 중단되어 블록에 임의의 데이터가 가득 차도록해도 문제가되지 않습니다. 다음 번에 데이터 입력을 시도하면 해당 블록이 다시 지워집니다.

데이터가 16 비트 인 경우 64Kx8 칩은 32,000 개 이상의 항목을 보유합니다. 초당 하나의 항목을 쓰면 칩을 약 2.7 배 채 웁니다. "만"10K 소거주기의 내구성을 가진 칩조차도 10 년 이상 지속될 것입니다. 더 큰 칩 또는 100K 내구성을 가진 칩을 사용하면 수명이 비례하여 증가합니다.


2

1) 하드웨어 변경이 필요할 수 있지만 가장 간단한 옵션 일 수 있습니다. 디커플링 캡을 늘리고 브라운 아웃을 중단하여 PBC를 수정하지 않고서도이를 달성했습니다.

2) 당신이 지적했듯이, FRAM의 문제는 가격입니다!

3) 온도 및 위치 데이터의 변동성에 따라 값이 변경된 경우에만 기록하여 내구성을 향상시킵니다. 매 초마다 한 번 온도를 샘플링 할 수 있지만 5 분마다 만 온도가 변경되면 문제가 해결됩니다.


1

프로젝트에서이 문제를 해결 한 방법은 다음과 같습니다.

사용하지 않는 슬롯의 비트 마스크와 그 값에 대한 여러 슬롯을 유지하기 위해 1 섹터의 플래시를 예약하십시오.

내가 사용한 비트 마스크의 길이는 16 바이트이므로 128 개의 슬롯이있어 값을 넣습니다.

비트 마스크는 모든 것으로 초기화되며, 플래시 용어로 지워진 상태입니다.

새 값을 쓰려면 비트 마스크를 읽고 첫 번째 비트를 찾으십시오. 이것은 값을 쓸 슬롯 번호입니다. 해당 비트를 0으로 변경하여 사용 된 것으로 표시하고 비트 마스크를 지우지 않고 플래시에 다시 씁니다. 다음으로 플래시를 지우지 않고 비트 마스크 뒤의 슬롯에 값을 씁니다.

이 방법으로 1에서 0으로 만 변경하여 새 비트 마스크를 작성하여 플래시 쓰기주기를 128 배 연장합니다.

전체 비트 마스크가 0이면 플래시 섹터를 지우고 새로 시작하십시오.


3
실망 할지도 모르지만 조금 깜박이면 전체 섹터를 덮어 씁니다. 귀하의 솔루션은 '비트 마스크'섹터를 곧 죽게 만들 것입니다.
Andrejs Cainikovs

1
플래시를 지우지 않으면 섹터에 10K 지우기주기 중 하나를 사용하지 않습니다. 0x7F 값이 있고 0x3F 값을 쓰면 결과는 0x3F가됩니다. 비트 마스크를 최신 상태로 유지하지만 플래시를 지우지는 않습니다. 소거는 전체 비트 마스크가 0 일 때만 발생합니다.
Robert

내가 틀렸다면 토론하자. 나는 여기에 나쁜 대답을 원하지 않으며 프로젝트에서 나쁜 디자인을 원하지 않습니다.
Robert

로버트가 옳다고 생각합니다. 마이크로 컨트롤러에서는 한 번에 4 바이트 만 쓸 수 있지만 필요한 비트는 0으로 설정됩니다. 그것들을 1로 되 돌리는 유일한 방법은 1k 블록을 비우는 것입니다. 플래시를 착용하는 것은 소거주기뿐입니다.
Tim

메모리 유형마다, 심지어 메모리 공급 업체마다 다를 수 있습니다. EEPROM이 페이지를 지우고 매번 쓸 때마다 다시 써야한다는 것을 알았습니다. 플래시 메모리를 사용하면 페이지를 지우지 않고도 여전히 1 비트를 쓸 수 있습니다.
mjh2007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.