หน่วยความจำแฟลช: จำเป็นต้องลบทั้งหน้าก่อนเขียนเพียงไม่กี่ไบต์หรือไม่


16

คำถามง่าย ๆ ฉันหวังว่า! ฉันไม่พบคำตอบที่ชัดเจนใด ๆ ...

ฉันกำลังเขียนไดรเวอร์สำหรับ ชิปหน่วยความจำแฟลชSST25VF064C มันสื่อสารผ่าน SPI

เช่นเดียวกับหน่วยความจำแฟลชทั้งหมด (ที่ฉันรู้) มันจำเป็นต้องลบ (บิตทั้งหมด = 1) ก่อนที่จะสามารถเขียนได้ (บิต = 0) สำหรับชิปนี้พื้นที่ที่เล็กที่สุดที่สามารถลบได้คือ 4kB

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

กฎทั่วไปคือเพื่อให้แน่ใจว่าหน้าจะถูกลบก่อนที่จะเขียนลงไป แต่ฉันสามารถเขียนลงในหน้าที่เขียนก่อนหน้านี้ได้หรือไม่หากฉันหลีกเลี่ยงพื้นที่ที่เขียนแล้ว? ตัวอย่างเช่นบอกว่าฉันเก็บข้อมูลลงในไบต์ 0-127 ในภายหลังฉันสามารถเขียนอีก 128 ไบต์ลงในหน้าเดียวกันได้ไหมถ้าฉันเริ่มที่ 128 ไบต์?

คำตอบ:


13

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

คุณยังสามารถเขียนตำแหน่งที่เขียนก่อนหน้านี้อีกครั้งตราบใดที่คุณล้างบิตเพิ่มเติม สิ่งนี้มีประโยชน์สำหรับการบำรุงรักษาสิ่งต่าง ๆ เช่นบิตแมปการจัดสรร


ยอดเยี่ยมขอบคุณ! นี่เป็นสิ่งที่ฉันกำลังมองหา
bitsmack

โปรดทราบว่าชิปบางตัวไม่ชอบให้คุณเขียนไบต์ก่อนหน้าหลังจากที่ดูภายหลังในแผ่นข้อมูลต่าง ๆ อย่างไรก็ตามสิ่งนี้ดูเหมือนจะแตกต่างกันไปตามอุปกรณ์
Vality

1
@Vality: คุณสามารถให้ตัวอย่างนี้
Dave Tweed

3
@DaveTweed NXP LPC21xx และ LPC23xx MCU มีการตรวจสอบไบต์สำหรับหน่วยความจำ 16 ไบต์ทุกครั้ง คุณต้องเขียนทั้ง 16 ไบต์ในครั้งเดียวเนื่องจากการตรวจสอบถูกเขียนในการดำเนินการนั้น หากคุณมาในภายหลังและพยายามเขียนค่าศูนย์ใน "บรรทัด" เดียวกันค่าศูนย์จะถูกเขียน แต่ค่าเช็คซัมใหม่จะถูกเขียนทับค่าก่อนหน้าเช่นกัน โอกาสที่จะมี 1 ของที่ก่อนหน้านี้มี 0 ของดังนั้นการตรวจสอบจะไม่ถูกต้อง ฉันจำไม่ได้ว่า MCU อนุญาตให้คุณอ่านบรรทัดที่มีเช็คซัมไม่ดีหรือไม่ อย่างไรก็ตามนั่นอาจเป็นตัวอย่างของ "ความแตกต่างระหว่างอุปกรณ์"
Guillermo Prandi

1
"จำนวนการดำเนินการใด ๆ ที่แยกต่างหากเพื่อเขียน ... การดำเนินการลบครั้งถัดไป" โปรดทราบว่าบางส่วนโดยเฉพาะอย่างยิ่งหน่วยความจำแฟลชที่ฝังอยู่ใน MCU จะระบุจำนวนสูงสุดของการเขียนก่อนที่จะทำการลบ การสันนิษฐานว่าเป็นการละเมิดขีด ​​จำกัด นี้อาจทำให้เกิดความเสียหายกับส่วนอื่น ๆ ของหน่วยความจำดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องระวังขีด จำกัด ดังกล่าว
ajb

5

ฉันสามารถเขียนลงในหน้าที่เขียนก่อนหน้านี้ได้หรือไม่หากฉันหลีกเลี่ยงพื้นที่ที่เขียนแล้ว?

ถ้าฉันเข้าใจพี 16 ของแผ่นข้อมูลอย่างถูกต้องมีการพูดถึง: ด้วยชิปนี้คุณจะต้องไม่เขียนลงในหน้าที่เขียนก่อนหน้าแม้ว่าคุณจะหลีกเลี่ยงพื้นที่ที่เขียนแล้ว

รายละเอียด

SST25VF064C แฟลชแผ่นข้อมูลชิปหน่วยความจำพี 16 กล่าวว่า "โปรแกรมการเรียนการสอนหน้าโปรแกรมสูงถึง 256 ไบต์ของข้อมูลในหน่วยความจำที่อยู่หน้าที่เลือกจะต้องอยู่ในสถานะลบ (FFH) ก่อนที่จะเริ่มการทำงานของโปรแกรมหน้า"

ฉันคิดว่าดังนั้น "หน้าทั้งหมดที่เลือกจะต้องอยู่ในสถานะลบ (ทุกไบต์บนหน้า FFh) ก่อนที่จะเริ่มการดำเนินการโปรแกรมหน้า" SST หรือ Microchip ได้เปิดเผยเอกสารใด ๆ ที่ทำให้เข้าใจผิดประโยคที่น่าสงสัยอย่างนี้หรือไม่?

จากประสบการณ์ของฉันผู้ผลิตชิปแฟลช MLC ทั้งหมดและชิปแฟลช SLC รุ่นใหม่บางรุ่นได้รับคำสั่งว่าเมื่อมีการเขียนหน้าเว็บหน้านั้นจะต้องถูกลบก่อนที่จะเขียนหน้านั้นอีกครั้งแม้ว่าคุณต้องการเปลี่ยนเพียง 1 บิตเป็น 0 บิต (สิ่งนี้เรียกว่า"กฎการเขียนครั้งเดียว"ในบทความ YAFFS )

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

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

"รูปแบบการใช้หน่วยความจำมีผลต่ออัตราข้อผิดพลาดบิตการเขียนโปรแกรมบางส่วนหน้าการเขียนโปรแกรมหน้าไม่ต่อเนื่องภายในบล็อกอ่านมากเกินไปต่อบล็อกโดยไม่ต้องลบรวมทั้งจำนวนการดำเนินการอ่านที่ไม่เท่ากันภายในบล็อกเดียว รบกวนข้อผิดพลาด " - Michal Jedrak "หน่วยความจำแฟลช NAND ในระบบฝังตัว".

"โปรแกรมรบกวนเกิดขึ้นเมื่อบิตถูกตั้งโปรแกรมโดยไม่ตั้งใจจาก“ 1” ถึง“ 0” ระหว่างเหตุการณ์การเขียนโปรแกรมหน้าข้อผิดพลาดบิตนี้อาจเกิดขึ้นได้ทั้งที่หน้าโปรแกรมหรือหน้าอื่นในบล็อกเงื่อนไขแรงดันไบอัสใน บล็อกในระหว่างการเขียนโปรแกรมหน้าสามารถทำให้เกิดกระแสไฟฟ้าจำนวนเล็กน้อยเพื่อส่งสัญญาณไปยังเซลล์หน่วยความจำใกล้เคียงความพยายามในการตั้งโปรแกรมหน้าบางส่วนซ้ำ ๆ จะยังคงทำให้เงื่อนไขแย่ลงอีก " - Douglas Sheldon และ Michael Freie "การทดสอบรบกวนใน Flash ความทรงจำ" พี 8, 9

"โปรแกรมรบกวนเกิดขึ้นเมื่อบิตถูกตั้งโปรแกรมโดยไม่ตั้งใจ (1 ถึง 0) ในระหว่างการดำเนินการเขียนโปรแกรม ... เงื่อนไขนี้ทำให้แย่ลงโดยการตั้งโปรแกรมแบบสุ่มในบล็อกและโดยใช้การเขียนบางส่วนไปยังหน้าต่างๆ" "การลดความล้มเหลวของ Yaffs NAND flash"


0

มีความเป็นไปได้สูงมากที่ซอฟต์แวร์การเขียนโปรแกรมที่คุณใช้อยู่นั้นกำลังเขียนข้อมูล "ที่จำเป็น" 256 ไบต์อยู่แล้ว มัน "ปรากฏขึ้น" เหมือนกับว่ามันให้ความสามารถในการเขียนจากหนึ่งถึง 256 ไบต์ แต่ฉันสงสัยว่าสิ่งที่กำลังทำอยู่คือ OR-ing ไบต์ที่คุณต้องการด้วย "mask" ของ 256 "FF" หากถูกต้องคุณสามารถ "ปลอดภัย" เขียนไบต์ใดก็ได้หนึ่งครั้งโดยไม่ต้องลบทั้ง 4K ไบต์ หากมีการเขียน checksum นอกการควบคุมของคุณส่วนใหญ่แล้ว checksum ที่ไม่ถูกต้องจะถูกสร้างขึ้นเมื่อคุณเขียนไบต์อื่นลงในเซ็กเมนต์ที่เขียนก่อนหน้านี้ ความหมายของสิ่งนี้ขึ้นอยู่กับชิป

หากซอฟต์แวร์โปรแกรมของคุณไม่ทำ "OR-ing" คุณสามารถทำได้ด้วยตนเอง ล้างเซ็กเมนต์ 256 ไบต์เขียนไบต์ลงในตำแหน่งที่ถูกต้องหรือด้วย 256 ไบต์รูปแบบของ FF และเขียนเซ็กเมนต์ไปยังหน้าที่ต้องการ

ไม่ว่าวิธีใดวิธีหนึ่งจะทำงานร่วมกับชิปใด ๆ ก็ตามคุณสามารถกำหนดได้อย่างง่ายดาย เขียนถึง 128 ไบต์แรกเขียนไปยัง 128 ไบต์ที่สองตรวจสอบว่า 128 ไบต์แรกไม่ได้ "messed up"!

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