เขียนบ่อยไปยังหน่วยความจำไม่ลบเลือน


10

ฉันกำลังออกแบบอุปกรณ์ที่ปรับตำแหน่งทางกายภาพโดยอัตโนมัติเมื่ออุณหภูมิเปลี่ยนแปลง หากอุปกรณ์นั้นถูกปิดหรือมีการตัดการเชื่อมต่ออุปกรณ์จำเป็นต้องจำไว้ว่ามันเป็นอุณหภูมิและตำแหน่งสุดท้าย ฉันมีความสามารถในการเก็บค่าเหล่านี้ใน EEPROM แต่ปัญหาคือตำแหน่งและอุณหภูมิสามารถเปลี่ยนแปลงได้อย่างรวดเร็ว ถ้าฉันจะเขียน temp และ pos เป็น EEPROM ทุกครั้งที่มีการเปลี่ยนแปลงพวกเขาจะ (1) ทำให้เฟิร์มแวร์ช้าลงเล็กน้อยและ (2) น่าจะฆ่า EEPROM หลังจากหนึ่งหรือสองปี ดังนั้นฉันเห็นตัวเลือกของฉันมีดังนี้ ...

1) ใช้ตัวเก็บประจุ / แบตเตอรี่เพื่อให้อุปกรณ์ขับเคลื่อนในเวลาสั้น ๆ หลังจากไฟฟ้าดับเพื่อให้ฉันสามารถเขียนค่าไปยัง EEPROM ในเวลานั้นเท่านั้น ฉันไม่ชอบสิ่งนี้เพราะบอร์ดค่อนข้างหิวและต้องใช้ฝาครอบขนาดใหญ่ และฉันไม่มีพื้นที่ว่างเหลือเฟือ และฉันไม่ต้องการค่าใช้จ่ายเพิ่มเติมของแบตเตอรี่และที่ใส่แบตเตอรี่ / หรือฝาปิดขนาดใหญ่

2) ใช้ F-RAM แทน EEPROM เพื่อให้ฉันสามารถเขียนถึงล้านล้านครั้งโดยไม่ทำให้มันหมดไป ฉันไม่ชอบตัวเลือกนี้เนื่องจาก FRAM นั้นค่อนข้างแพงกว่า EEPROM ค่อนข้างมากและนี่เป็นผลิตภัณฑ์ที่ใช้ผลิต (ไม่ใช่แค่ตัวเดียว)

3) เขียนตำแหน่งและอุณหภูมิทุก ๆ 5 นาที ด้วยวิธีนี้ฉันมักจะบันทึกตำแหน่ง / อุณหภูมิที่ค่อนข้างล่าสุด แต่ฉันไม่ได้เขียนทุกวินาทีดังนั้นโปรแกรมของฉันจะไม่ชะลอตัวลงและ EEPROM จะไม่ตายเร็ว ดูเหมือนว่าตัวเลือกที่ดีที่สุดของฉัน

ใครบ้างที่มีข้อเสนอแนะที่ฉันไม่ได้คิด


5
แค่คำถาม. หากอุปกรณ์ปรับตำแหน่งโดยอัตโนมัติคุณต้องจำอุณหภูมิล่าสุดทำไม เมื่อคุณเปิดอุปกรณ์อีกครั้งจะไม่อัปเดตอุณหภูมิและปรับตำแหน่งของมัน
Daniel Grillo

1
ฉันเห็นด้วยกับแดเนียล จะเป็นอย่างไรถ้าคุณปิดเครื่องและอุณหภูมิโดยรอบเปลี่ยนไปอย่างมาก เมื่อเปิดเครื่องหากคุณใช้อุณหภูมิ / ตำแหน่งที่บันทึกไว้ล่าสุดคุณจะอยู่ในตำแหน่งที่ไม่ถูกต้องอยู่แล้วและอุปกรณ์จะสิ้นสุดลงโดยไม่คำนึงถึง มีข้อกำหนดอื่นที่ไม่ได้ระบุไว้ในคำถามของคุณหรือไม่
เดฟ

ข้อมูลจำเพาะ EEPROM คืออะไร - มีกี่รอบการเขียน
Jason S

คำตอบ:


10

สิ่งที่คุณต้องเป็นเทคนิคที่เรียกว่าleveling สวม มันไม่ได้เขียนข้อมูลของคุณทุกครั้งที่สถานที่เดียวกันใน EEPROM แต่ใช้อัลกอริทึมบางอย่างเพื่อใช้สถานที่ที่แตกต่างกัน ฉันได้อ่านเกี่ยวกับอัลกอริธึมการปรับระดับการสึกหรอที่ซับซ้อนแล้ว แต่ฉันไม่รู้ว่าทำไมวิธีการง่าย ๆ ต่อไปนี้ใช้ไม่ได้

เพิ่มตัวนับ 24 บิตในข้อมูลของคุณเพื่อให้บล็อคข้อมูลของคุณมีความยาว 8 ไบต์ หน้าใน24AA64มีความยาว 32 ไบต์ดังนั้น 64Kb EEPROM จึงมีขนาด 256 หน้า จากแผ่นข้อมูล:

"เมื่อทำการเขียนน้อยกว่า 32 ไบต์ข้อมูลในส่วนที่เหลือของหน้าจะถูกรีเฟรชพร้อมกับไบต์ข้อมูลที่กำลังเขียนซึ่งจะบังคับให้ทั้งหน้าต้องทนกับวงจรการเขียนด้วยเหตุนี้จึงมีการระบุความอดทนต่อหน้า"

ดังนั้นจึงไม่มีเหตุผลที่จะใช้บล็อคข้อมูลที่เล็กกว่าหน้า 32 ไบต์

ดูที่เคาน์เตอร์ของหน้าแรก หากเป็นศูนย์คุณใช้จำนวนรอบการเขียนสูงสุดสำหรับหน้านั้นดังนั้นคุณจะไปยังหน้าถัดไปและตรวจสอบตัวนับนั้น ทำซ้ำจนกว่าคุณจะพบเคาน์เตอร์> ศูนย์ นั่นคือหน้าเว็บที่คุณกำลังใช้งาน EEPROM ของ Microchip มีความอดทน 1 ล้านรอบซึ่งคุณสามารถเพิ่มได้ถึง 256 ล้านด้วยตัวอย่างที่กำหนดสูงสุด 32 ไบต์ต่อบล็อกใน EEPROM 64kb นั่นน่าจะเพียงพอที่จะอยู่ได้นานกว่าผลิตภัณฑ์ของคุณ: 40 ปีถ้าคุณเขียนทุกๆ 5 วินาที (!)

คุณจะต้องเริ่มต้น EEPROM ของคุณในการใช้งานครั้งแรก คุณจะรู้ได้อย่างไรว่าเมื่อไหร่ ใช้หน้าสุดท้ายเพื่อเขียนลายเซ็นที่ไม่ซ้ำกันเมื่อเริ่มต้น ตรวจสอบพลังงานแต่ละครั้งหากมีลายเซ็น หากไม่ใช่อุปกรณ์จะต้องเริ่มต้นใหม่ คุณสามารถตั้งค่าตัวนับล่วงหน้าในแต่ละหน้าด้วย 0xF4240 (ต่อ 1 ล้าน) หรือล้างทุกอย่างเป็น 0xFF และเขียน 0xF4240 เมื่อคุณใช้หน้านี้เป็นครั้งแรก
การเริ่มต้น EEPROM เป็นสิ่งจำเป็นเนื่องจากบางครั้งรูปแบบบางอย่างถูกเขียนลงในกระบวนการผลิต / ทดสอบ

แก้ไข
การปรับระดับการสึกหรอควรแก้ปัญหาของคุณ แต่ฉันยังต้องการแสดงความคิดเห็นเกี่ยวกับโซลูชันตัวเก็บประจุ คุณบอกว่าบอร์ดค่อนข้างหิวพลังงาน แต่บางทีคุณสามารถแยกอำนาจของไมโครคอนโทรลเลอร์ / EEPROM ออกจากส่วนที่เหลือของบอร์ดด้วยไดโอด ดังนั้นคุณอาจต้องการเพียงไม่กี่ mA เมื่อพลังงานหลักหายไป 24AA64 เขียนหน้าเว็บในเวลาน้อยกว่า 5 มิลลิวินาทีจากนั้นที่ 10mA และแรงดันตกที่อนุญาตที่ 100mV ที่คุณต้องการ

=ผมเสื้อΔV=10ม.A5ม.s100ม.V=500μF

ง่ายด้วย supercap ขนาดเล็ก

อ่าน
เอกสารข้อมูลเพิ่มเติม24AA64
EEPROM Endurance Tutorial


ความอดทนของ EEPROM นั้นมอบให้ต่อหน้า (อย่างน้อย 24AA64 และ EEPROM อื่น ๆ ที่ฉันเคยใช้) 24AA64 ระบุหน้า 32- ไบต์ดังนั้นจำนวนควรเป็นต่อหน้าไม่ใช่ต่อบล็อก
Saad

@Saad - ถูกต้อง แก้ไขในคำตอบของฉัน
stevenvh

4

1) เมื่อคุณเริ่มต้นกระบวนการเขียนคุณจะต้องจ่ายไฟให้กับ MCU / EEPROM และตรวจสอบให้แน่ใจว่าสายควบคุมไม่ผิดพลาด - I2C น่าจะเหมาะกับ SPI สำหรับเรื่องนี้ ต้องการ mA เพียงไม่กี่มิลลิวินาทีสองสามวินาทีดังนั้นจึงไม่ควรเป็นหมวกขนาดใหญ่และคุณสามารถทำให้ MCU เข้าสู่โหมดสลีปเมื่อการเขียนเริ่มต้นขึ้น 3) คุณอาจใช้สติปัญญาบางอย่างเช่นโฮลด์ออฟ - เมื่อเขียนมันจะถือเป็นช่วงเวลาที่เหมาะสมเสมอการเขียนอื่นอาจเกิดขึ้นได้ หรือรอจนกว่าค่าจะเสถียรสักครู่ก่อนเขียน
นอกจากนี้คุณยังสามารถเพิ่มความอดทนโดยการกระจายข้อมูลไปตามสถานที่ต่างๆ Microchip มีเครื่องมือ & หมายเหตุประกอบในการคำนวณความทนทานของ eeproms ซึ่งอาจเป็นประโยชน์


4
บันทึกย่อของแอป Microchip เกี่ยวกับความอดทน: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf จาก Appnote คุณสามารถเพิ่มความทนทานได้ประมาณ 2x โดยลดแรงดันไฟฟ้าจาก 5v เป็น 3.5v
vandee

1
หากคุณใช้วิธีแรกของคุณตรวจสอบให้แน่ใจว่าการเขียนไปยังหน่วยความจำที่ไม่ลบเลือนนั้นมีความสำคัญสูงสุดในระบบของคุณเมื่อเริ่มต้นเช่น การขัดจังหวะไม่สามารถทำให้ค่าของคุณเปลี่ยนการเขียนกลางหรือไมโครเริ่มการประมวลผลอื่น ๆ ซึ่งทำให้คุณหมดเวลา เป็นสิ่งสำคัญที่สุดที่คุณไม่ต้องเขียนค่าที่เสียหายในขณะที่คุณปิดเครื่อง นอกจากนี้ CRC ในค่าจะช่วยให้คุณยืนยันว่าการทุจริตไม่ได้เกิดขึ้น แต่คุณต้องตัดสินใจว่าจะทำอย่างไรถ้าเกิดขึ้นเช่นใช้ค่าเริ่มต้น
Martin

3

ฉันขอแนะนำให้ใช้อุปกรณ์แฟลชเชิงบล็อกและใช้หนึ่งไบต์จากแต่ละบล็อกเป็นค่าสถานะโหมด คงไว้ซึ่งค่าคงที่ที่แฟล็กโหมดเกือบทั้งหมดจะถูกโปรแกรม จะมีเพียงหนึ่งบล็อกที่ไม่มีการตั้งค่าสถานะโหมด แต่บล็อกก่อนหน้า (การห่อถ้าจำเป็น) คือ บล็อกนั้นจะเป็นบล็อกที่มีข้อมูลล่าสุด เมื่อบล็อกนั้นเต็มลบบล็อกต่อไปนี้ (โปรดทราบว่าบล็อกที่ถูกลบสามารถเก็บข้อมูลใด ๆ ในระหว่างรอบการลบและค่าคงที่จะยังคงอยู่) จากนั้นเมื่อการลบเสร็จสิ้นโปรแกรมจะตั้งค่าโหมดโหมดตามที่ใช้ เป็นบล็อกสุดท้าย

จำเป็นที่จะต้องป้องกันแหล่งจ่ายไฟแฟลชให้เพียงพอเพื่อให้แน่ใจว่าความพยายามใด ๆ ในการเขียนโปรแกรมไบต์จะประสบความสำเร็จหรือล้มเหลวทั้งหมด แต่จะไม่สำคัญว่าวงจรการลบถูกขัดจังหวะโดยปล่อยให้บล็อกเต็มไปด้วยข้อมูลโดยพลการ เนื่องจากความพยายามครั้งต่อไปในการเขียนรายการข้อมูลจะลบบล็อกนั้นอีกครั้ง

หากข้อมูลของคุณเป็น 16 บิตชิป 64Kx8 จะเก็บข้อมูลได้มากกว่า 32,000 รายการ การเขียนหนึ่งรายการต่อวินาทีจะเติมชิปประมาณ 2.7 ครั้ง แม้แต่ชิปที่มีความอดทนในการลบเพียง 10K รอบเท่านั้นที่ใช้งานได้นานกว่า 10 ปี การใช้ชิปที่มีขนาดใหญ่ขึ้นหรือชิปที่มีความอดทน 100K จะช่วยยืดอายุการใช้งานได้ตามสัดส่วน


2

1) ตัวเลือกที่ง่ายที่สุดอาจเป็นไปได้ว่าอาจต้องเปลี่ยนฮาร์ดแวร์ ฉันเคยทำสิ่งนี้มาก่อนโดยไม่มีการแก้ไข PBC เพียงแค่เพิ่มแคป decoupling และขัดจังหวะบนจุดสีน้ำตาล

2) ตามที่คุณได้ชี้ให้เห็นปัญหาของ FRAM คือราคา!

3) ขึ้นอยู่กับความผันผวนของอุณหภูมิและข้อมูลตำแหน่งของคุณคุณจะเพิ่มความอดทนโดยการเขียนเฉพาะเมื่อค่ามีการเปลี่ยนแปลง คุณอาจจะทำการสุ่มตัวอย่างอุณหภูมิทุก ๆ วินาที แต่ถ้ามันเปลี่ยนเพียงทุก 5 นาทีปัญหาจะได้รับการแก้ไข


1

นี่คือวิธีที่ฉันแก้ไขปัญหานี้ในโครงการของฉัน:

สำรองแฟลช 1 ส่วนเพื่อเก็บสล็อตที่ไม่ได้ใช้และจำนวนสล็อตสำหรับค่า

bitmask ที่ฉันใช้มีความยาว 16 ไบต์ดังนั้นฉันจึงมี 128 ช่องเพื่อใส่ค่า

bitmask เริ่มต้นได้กับทุกคนซึ่งในแง่แฟลชเป็นสถานะที่ถูกลบ

เมื่อคุณต้องการเขียนค่าใหม่อ่านใน bitmask และหาบิตแรกที่เป็นหนึ่ง นี่คือหมายเลขสล็อตที่คุณจะเขียนค่า เปลี่ยนบิตนั้นเป็นศูนย์เพื่อทำเครื่องหมายว่าใช้แล้วเขียน bitmask กลับไปเป็นแฟลชโดยไม่ต้องลบมันก่อน ถัดไปเขียนค่าลงในสล็อตหลังจากบิตมาสก์โดยไม่ลบแฟลช

ด้วยวิธีนี้คุณสามารถขยายรอบการเขียนแฟลชได้ถึง 128 เท่าโดยการเขียน bitmask ใหม่โดยเปลี่ยนจากค่าหนึ่งเป็นศูนย์

ถ้า bitmask ทั้งหมดเป็น 0 ให้ลบเซกเตอร์แฟลชแล้วเริ่มใหม่


3
ฉันอาจทำให้คุณผิดหวัง แต่เมื่อคุณแฟลชสักครู่ภาคทั้งหมดจะถูกเขียนทับ ทางออกของคุณจะทำให้ภาค 'bitmask' ตายลงในไม่ช้า
Andrejs Cainikovs

1
หากคุณไม่ลบแฟลชคุณจะไม่ใช้หนึ่งใน 10K รอบการลบสำหรับเซกเตอร์ หากคุณมีค่า 0x7F และคุณเขียนค่า 0x3F ผลลัพธ์จะเป็น 0x3F สิ่งนี้ทำให้ bitmask ทันสมัยอยู่เสมอ แต่ไม่ได้ลบแฟลช การลบจะเกิดขึ้นเมื่อ bitmask ทั้งหมดเป็น 0
Robert

ถ้าฉันผิดลองพูดคุยกัน ฉันไม่ต้องการคำตอบที่ไม่ดีที่นี่และฉันไม่ต้องการการออกแบบที่ไม่ดีในโครงการของฉัน
Robert

ฉันคิดว่าโรเบิร์ตพูดถูก บนไมโครคอนโทรลเลอร์ของฉันคุณสามารถเขียนได้ครั้งละ 4 ไบต์เท่านั้น แต่บิตที่ต้องการถูกตั้งค่าเป็นศูนย์ วิธีเดียวที่จะทำให้พวกเขากลับมาเป็น 1 คือการล้างบล็อค 1k มันเป็นเพียงวัฏจักรลบที่สวมแฟลช ...
ทิม

อาจแตกต่างกันสำหรับหน่วยความจำแต่ละประเภทและอาจเป็นผู้จำหน่ายหน่วยความจำ ฉันเคยเห็น EEPROMs ต้องลบหน้าแล้วเขียนใหม่ทุกครั้งที่เขียน ฉันเห็นหน่วยความจำแฟลชคุณสามารถเขียนบิตที่ยังคงเป็น 1 โดยไม่ต้องลบหน้า
mjh2007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.