Bộ nhớ flash: Có phải xóa toàn bộ trang trước khi chỉ viết một vài byte không?


16

Một câu hỏi dễ, tôi hy vọng! Tôi không tìm thấy bất kỳ câu trả lời dứt khoát nào ...

Tôi đang viết trình điều khiển cho chip nhớ flash SST25VF064C . Nó giao tiếp qua SPI.

Giống như tất cả bộ nhớ flash (mà tôi biết), nó cần phải bị xóa (tất cả các bit = 1) trước khi có thể được ghi (bits = 0). Đối với con chip này, diện tích nhỏ nhất có thể bị xóa là 4kB.

Bộ nhớ của nó được chia thành các trang 256 byte. Với một hướng dẫn, tôi có thể viết bất cứ nơi nào từ một byte đến 256 byte vào một trang được chỉ định. Tôi không phải bắt đầu trên một ranh giới trang: vị trí đầu tiên được lập trình có thể ở bất cứ đâu trong một trang.

Nguyên tắc chung là đảm bảo rằng trang bị xóa trước khi viết vào đó. Nhưng, tôi có thể viết vào một trang được viết trước đó không, nếu tôi tránh các khu vực đã được viết? Ví dụ, giả sử rằng tôi lưu trữ dữ liệu vào các byte 0-127. Sau này tôi có thể viết thêm 128 byte vào cùng một trang không, nếu tôi bắt đầu ở byte 128?

Câu trả lời:


13

Có, sau bất kỳ thao tác xóa nào, bạn có thể sử dụng bất kỳ số lượng thao tác riêng biệt nào để ghi dữ liệu (thay đổi bit từ 1 thành 0) trước thao tác xóa tiếp theo.

Bạn thậm chí có thể viết lại một vị trí được viết trước đó, miễn là bạn chỉ xóa nhiều bit hơn. Điều này có thể thuận tiện cho việc duy trì những thứ như bitmap phân bổ.


Cảm ơn vô cùng! Đây chỉ là những gì tôi đang tìm kiếm.
bitsmack

Lưu ý rằng một số chip không thích bạn viết một byte trước đó sau khi nhìn vào các bảng dữ liệu khác nhau, tuy nhiên điều này dường như khác nhau giữa các thiết bị.
Vality

1
@Vality: Bạn có thể cung cấp một ví dụ về điều này?
Dave Tweed

3
Các MCU @DaveTweed NXP LPC21xx và LPC23xx có một byte tổng kiểm tra cho mỗi 16 byte bộ nhớ; bạn phải viết tất cả 16 byte cùng một lúc vì tổng kiểm tra được ghi trong thao tác đó. Nếu bạn đến sau và cố gắng viết các số không trong cùng một "dòng", các số không được viết, nhưng một tổng kiểm tra mới cũng được viết trên trước đó; rất có thể nó có một số 1 trong đó trước đó có 0, vì vậy tổng kiểm tra trở nên không hợp lệ. Tôi không nhớ nếu MCU cho phép bạn đọc một dòng với tổng kiểm tra xấu. Dù sao, đó sẽ là một ví dụ về "khác nhau giữa các thiết bị".
Guillermo Prandi

1
"bất kỳ số lượng các hoạt động riêng biệt để viết ... hoạt động xóa tiếp theo." Lưu ý rằng một số phần, đặc biệt là các bộ nhớ flash được nhúng trong MCU, sẽ nêu rõ số lần ghi tối đa trước khi xóa. Có lẽ vi phạm giới hạn này sẽ có nguy cơ làm hỏng các khu vực khác của bộ nhớ, vì vậy điều quan trọng là phải coi chừng các giới hạn đó.
ajb

5

Tôi có thể viết vào một trang được viết trước đó không, nếu tôi tránh các khu vực đã được viết?

Nếu tôi hiểu p. 16 của biểu dữ liệu chính xác, có nghĩa là: Với con chip cụ thể này, bạn không được viết vào một trang được viết trước đó, ngay cả khi bạn tránh các khu vực đã được viết.

chi tiết

Bảng dữ liệu chip nhớ flash SST25VF064C trên p. 16 cho biết "Trang - Chương trình hướng dẫn chương trình lên tới 256 byte dữ liệu trong bộ nhớ. Địa chỉ trang đã chọn phải ở trạng thái bị xóa (FFH) trước khi bắt đầu hoạt động Chương trình trang."

Do đó, tôi giả sử rằng "Toàn bộ trang được chọn phải ở trạng thái bị xóa (mỗi byte trên trang FFh) trước khi bắt đầu hoạt động Chương trình trang." SST hoặc Microchip đã phát hành bất kỳ tài liệu nào làm rõ câu mơ hồ điên rồ này chưa?

Theo kinh nghiệm của tôi, nhà sản xuất tất cả các chip flash MLC và một số chip flash SLC mới hơn bắt buộc rằng một khi một trang đã được viết, trang phải được xóa trước khi trang đó được viết lại, ngay cả khi bạn chỉ muốn thay đổi 1 bit thành một 0 bit. (Điều này được gọi là "quy tắc viết một lần" trong bài viết YAFFS .)

Theo kinh nghiệm của tôi, tất cả các chip flash cũ hơn cho phép bạn thay đổi bất kỳ 1 bit nào thành 0 bit mà không cần chu kỳ xóa, ngay cả khi bit đó nằm trong một trang hoặc thậm chí một byte đã có các bit khác được lập trình thành 0 - a trang flash có thể được lập trình nhiều lần giữa các lần xóa. (Điều này được gọi là "nhiều lần viết" trong bài viết YAFFS).

Bảng dữ liệu của nhà sản xuất là một lời hứa có điều kiện mà nhà sản xuất đưa ra cho bạn. Miễn là bạn tuân theo tất cả các khuyến nghị về bảng dữ liệu, nhà sản xuất hứa rằng chip sẽ hoạt động như được chỉ định. Tôi nghi ngờ rằng nếu bạn lập trình một trang được viết trước đó, tránh các khu vực đã được viết, sẽ có cơ hội tốt hơn việc đọc lại ngay lập tức có thể cung cấp dữ liệu bạn mong đợi - các byte mới được viết là các giá trị bạn vừa viết, và các byte khác có khả năng không thay đổi. Tuy nhiên, vì điều này không tuân theo các khuyến nghị của biểu dữ liệu, bạn không còn có thể dựa vào tất cả các lời hứa trong biểu dữ liệu. Tôi nghe tin đồn rằng hoạt động không bị xử phạt như vậy khiến thời gian lưu giữ dữ liệu và sức chịu đựng bị ảnh hưởng, vì chương trình bị xáo trộn, lập trình quá mức, bẫy phí, các hiệu ứng tương tự như búa hàng DRAM , v.v.

"Lược đồ sử dụng bộ nhớ ảnh hưởng đến tốc độ lỗi bit. Lập trình một phần trang, lập trình các trang không tuần tự trong khối, đọc quá mức trên mỗi khối mà không xóa cũng như số lượng thao tác đọc không bằng nhau trong một khối tăng số lần đọc làm phiền các lỗi. " - Michal Jedrak. "Bộ nhớ NAND Flash trong các hệ thống nhúng".

"Xáo trộn chương trình xảy ra khi một bit vô tình được lập trình từ một LẦN 1 đến một 0 0 trong một sự kiện lập trình trang. Lỗi bit này có thể xảy ra hoặc trên trang được lập trình hoặc trên một trang khác trong khối. Điều kiện điện áp thiên vị trong khối trong quá trình lập trình trang có thể khiến một lượng nhỏ dòng chảy vào các ô nhớ gần đó. Các lần lập trình trang một phần lặp đi lặp lại sẽ tiếp tục làm nặng thêm tình trạng này. " - Douglas Sheldon và Michael Freie. "Kiểm tra nhiễu loạn trong Flash Memories" . tr. 8, 9.

"Sự xáo trộn chương trình xảy ra khi một bit vô tình được lập trình (1 đến 0) trong một hoạt động lập trình. ... Điều kiện này trở nên tồi tệ hơn bởi lập trình ngẫu nhiên trong khối và bằng cách áp dụng nhiều lần ghi vào các trang." "Giảm thiểu thất bại flash Yaffs NAND"


0

Rất có khả năng phần mềm lập trình mà bạn đang sử dụng đã ghi 256 byte "bắt buộc". Nó "xuất hiện" giống như nó đang cung cấp cho bạn khả năng ghi từ một đến 256 byte, nhưng tôi nghi ngờ rằng những gì nó đang làm là HOẶC lấy (các) byte bạn muốn với "mặt nạ" 256 "FF". Nếu điều này là chính xác, thì bạn có thể "viết" một cách an toàn bất kỳ byte nào một lần mà không phải xóa toàn bộ byte 4K. Nếu một tổng kiểm tra được viết ngoài tầm kiểm soát của bạn, thì rất có thể, một tổng kiểm tra không hợp lệ sẽ được tạo khi bạn viết một byte khác vào một phân đoạn được viết trước đó. Ý nghĩa của việc này, là phụ thuộc chip.

Nếu phần mềm lập trình của bạn, không thực hiện "OR-ing", bạn có thể tự làm điều đó. Xóa phân đoạn 256 byte, ghi (các) byte vào đúng vị trí, HOẶC với mặt nạ 256 byte FF và viết phân đoạn vào trang mong muốn.

Cho dù một trong hai phương pháp hoạt động với bất kỳ chip cụ thể nào, bạn đều có thể dễ dàng xác định. Ghi vào 128 byte đầu tiên, ghi vào 128 byte thứ hai, xác minh rằng 128 byte đầu tiên KHÔNG "bị rối"!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.