Ghi thường xuyên vào bộ nhớ không bay hơi


10

Tôi đang thiết kế một thiết bị tự động điều chỉnh vị trí vật lý của nó khi nhiệt độ thay đổi. Nếu thiết bị tắt hoặc ngắt nguồn, thiết bị cần nhớ nhiệt độ và vị trí cuối cùng của thiết bị. Tôi có khả năng lưu trữ các giá trị này trong EEPROM nhưng vấn đề là vị trí và nhiệt độ có thể thay đổi rất nhanh. Nếu tôi viết temp và pos cho EEPROM sau mỗi lần họ thay đổi thì (1) sẽ làm chậm firmware một chút và (2) có thể sẽ giết EEPROM sau một hoặc hai năm. Vì vậy, như tôi thấy, các tùy chọn của tôi như sau ...

1) sử dụng tụ điện / pin để giữ cho thiết bị hoạt động trong một thời gian ngắn sau khi mất nguồn để tôi chỉ có thể ghi các giá trị vào EEPROM. Tôi không thích điều này bởi vì hội đồng quản trị rất đói và điều này đòi hỏi phải có một cái mũ lớn. Và tôi không có nhiều không gian trống. Và tôi không muốn chi phí tăng thêm của pin và giá đỡ pin / hoặc nắp lớn.

2) sử dụng F-RAM thay vì EEPROM để tôi có thể ghi cho nó hàng nghìn tỷ lần mà không bị hao mòn. Tôi không thích tùy chọn này vì FRAM đắt hơn một chút so với EEPROM và đây là một sản phẩm sản xuất (không chỉ một).

3) Chỉ viết vị trí và nhiệt độ cứ sau 5 phút. Bằng cách đó, tôi luôn có một vị trí / temp khá gần đây được ghi lại nhưng tôi không viết mỗi giây để chương trình của tôi không bị chậm lại và EEPROM sẽ không chết nhanh như vậy. Đây dường như là lựa chọn tốt nhất của tôi.

Có ai khác có bất kỳ đề nghị mà tôi không nghĩ đến?


5
Chỉ là một câu hỏi. Nếu thiết bị tự động điều chỉnh vị trí vật lý của nó, tại sao bạn cần nhớ nhiệt độ cuối cùng? Khi bạn bật lại thiết bị, nó sẽ không cập nhật nhiệt độ và điều chỉnh vị trí của thiết bị?
Daniel Grillo

1
Tôi đồng ý với Daniel. Điều gì nếu bạn tắt nguồn và nhiệt độ môi trường thay đổi mạnh mẽ? Khi bật nguồn, nếu bạn đã sử dụng temp / vị trí được lưu cuối cùng, dù sao bạn cũng sẽ ở sai vị trí và thiết bị sẽ kết thúc di chuyển bất kể. Có một yêu cầu khác không được liệt kê trong câu hỏi của bạn?
Dave

Thông số EEPROM là gì - có bao nhiêu chu kỳ viết?
Jason S

Câu trả lời:


10

Những gì bạn cần là một kỹ thuật gọi là cân bằng mặc . Nó không ghi dữ liệu của bạn mỗi lần tại cùng một vị trí trong EEPROM, nhưng sử dụng một số thuật toán để sử dụng các vị trí khác nhau. Tôi đã đọc về các thuật toán cân bằng hao mòn phức tạp, nhưng tôi không biết tại sao phương pháp đơn giản sau đây sẽ không hiệu quả.

Thêm vào dữ liệu của bạn một bộ đếm 24 bit, để khối dữ liệu của bạn dài 8 byte. Các trang trên 24AA64 dài 32 byte, do đó, EEPROM 64kb chứa 256 trang. Từ biểu dữ liệu:

"Khi thực hiện ghi ít hơn 32 byte, dữ liệu trong phần còn lại của trang được làm mới cùng với các byte dữ liệu được ghi. Điều này sẽ buộc toàn bộ trang phải chịu đựng một chu kỳ ghi, vì lý do này độ bền được chỉ định cho mỗi trang."

vì vậy sẽ không có ý nghĩa khi sử dụng các khối dữ liệu nhỏ hơn một trang 32 byte.

Nhìn vào quầy của trang đầu tiên. Nếu không, bạn đã sử dụng số chu kỳ ghi tối đa cho trang đó, vì vậy bạn chuyển sang trang tiếp theo và kiểm tra bộ đếm đó. Lặp lại cho đến khi bạn tìm thấy một bộ đếm> không. Đó là trang bạn đang sử dụng. Các EEPROM của Microchip có độ bền 1 triệu chu kỳ, bạn có thể tăng lên 256 triệu với ví dụ đã cho là tối đa 32 byte cho mỗi khối trong EEPROM 64kb. Chừng đó là đủ để tồn tại lâu hơn sản phẩm của bạn: 40 năm nếu bạn viết cứ sau 5 giây (!).

Bạn sẽ muốn khởi tạo EEPROM của bạn trong lần sử dụng đầu tiên. Làm thế nào để bạn biết khi đó là. Sử dụng trang cuối cùng để viết chữ ký duy nhất khi khởi tạo. Kiểm tra mỗi lần bật nguồn nếu chữ ký ở đó. Nếu nó không phải là thiết bị phải được khởi tạo. Bạn có thể đặt trước bộ đếm trong mỗi trang với 0xF4240 (với giá 1 triệu) hoặc xóa mọi thứ thành 0xFF và viết 0xF4240 khi bạn sử dụng trang lần đầu tiên.
Khởi tạo EEPROM là cần thiết bởi vì đôi khi một mẫu nhất định được viết cho nó trong quy trình sản xuất / thử nghiệm.

chỉnh sửa
Việc cân bằng hao mòn sẽ giải quyết vấn đề của bạn, nhưng tôi vẫn muốn nhận xét về giải pháp tụ điện. Bạn nói rằng bo mạch khá ngốn điện, nhưng có lẽ bạn có thể cách ly sức mạnh của vi điều khiển / EEPROM khỏi phần còn lại của bo mạch bằng một diode. Vì vậy, có lẽ bạn sẽ chỉ cần một vài mA khi mất điện chính. 24AA64 viết một trang trong chưa đầy 5ms, sau đó ở mức 10mA và mức giảm điện áp cho phép là 100mV bạn sẽ cần

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

Dễ dàng với một siêu xe nhỏ.

đọc thêm
datasheet 24AA64
Hướng dẫn độ bền EEPROM


Độ bền của EEPROM được cung cấp trên mỗi trang (ít nhất là đối với 24AA64 và các EEPROM khác mà tôi đã sử dụng). 24AA64 chỉ định một trang 32 byte, do đó, số lượng phải là trên mỗi trang chứ không phải trên mỗi khối.
Saad

@Saad - Đúng. Đã sửa trong câu trả lời của tôi.
stevenvh

4

1) Khi bạn đã bắt đầu quá trình ghi, bạn chỉ cần cấp nguồn cho MCU / EEPROM và đảm bảo các dòng điều khiển không bị trục trặc - I2C có thể thích hợp hơn với SPI cho việc này. Chỉ cần một vài mA trong vài mili giây để không phải là một cái mũ lớn và bạn có thể đặt MCU để ngủ sau khi bắt đầu viết. 3) bạn có thể có thể áp dụng một số thông minh, ví dụ như một sự trì hoãn - một khi được viết, nó luôn luôn giữ một thời gian nhất định trước khi một lần viết khác có thể xảy ra. Hoặc chờ cho đến khi giá trị ổn định trong một thời gian trước khi viết.
Bạn cũng có thể tăng độ bền bằng cách trải đều dữ liệu trên một số vị trí. Microchip có một số công cụ và chú thích để tính toán độ bền cho eeprom của chúng, có thể hữu ích.


4
Lưu ý về Ứng dụng Microchip về độ bền: ww1.microchip.com/doads/en/AppNotes/01019A.pdf Từ Appnote, bạn cũng có thể tăng độ bền khoảng 2 lần bằng cách giảm điện áp hoạt động từ 5v xuống 3,5v.
vandee

1
Nếu bạn sử dụng phương pháp đầu tiên của mình, hãy đảm bảo rằng ghi vào bộ nhớ không biến đổi là ưu tiên cao nhất trong hệ thống của bạn khi nó bắt đầu, nghĩa là. các ngắt đó không thể khiến các giá trị của bạn thay đổi giữa ghi hoặc vi mô để bắt đầu một số xử lý khác khiến bạn hết thời gian. Điều quan trọng nhất là bạn không viết các giá trị bị hỏng khi bạn tắt nguồn. Ngoài ra, CRC về các giá trị sẽ giúp bạn xác nhận rằng tham nhũng đã không xảy ra, nhưng bạn phải quyết định phải làm gì nếu điều đó xảy ra, chẳng hạn như sử dụng mặc định.
Martin

3

Tôi sẽ đề nghị sử dụng một thiết bị flash hướng khối và sử dụng một byte từ mỗi khối làm cờ chế độ. Duy trì như một bất biến rằng hầu hết tất cả các cờ chế độ sẽ được lập trình; sẽ chỉ có một khối trong đó cờ chế độ không được lập trình nhưng khối trước đó (gói nếu cần thiết) là. Khối đó sẽ là khối có dữ liệu gần đây nhất. Khi khối đó lấp đầy, xóa khối sau (lưu ý rằng khối bị xóa có thể giữ bất kỳ tổ hợp dữ liệu nào trong chu kỳ xóa và bất biến vẫn sẽ giữ), sau đó khi xóa xong chương trình sẽ hiển thị cờ chế độ trên là khối cuối cùng.

Sẽ cần phải bảo vệ nguồn cung cấp cho đèn flash đủ tốt để đảm bảo rằng mọi nỗ lực lập trình byte sẽ thành công hoặc thất bại toàn bộ, nhưng sẽ không có vấn đề gì nếu chu trình xóa bị gián đoạn để lại một khối đầy dữ liệu tùy ý, vì lần thử tiếp theo để ghi một mục nhập dữ liệu sẽ xóa lại khối đó.

Nếu dữ liệu của bạn là 16 bit, chip 64Kx8 sẽ chứa hơn 32.000 mục. Viết một mục nhập mỗi giây sẽ lấp đầy chip khoảng 2,7 lần. Ngay cả một con chip có độ bền "chỉ" 10K chu kỳ xóa sẽ tồn tại hơn 10 năm. Sử dụng một con chip lớn hơn, hoặc một con có độ bền 100K, sẽ tăng tuổi thọ hữu ích theo tỷ lệ.


2

1) Có thể là tùy chọn đơn giản nhất, mặc dù nó có thể yêu cầu thay đổi phần cứng. Tôi đã đạt được điều này trước đây mà không cần sửa đổi PBC bằng cách chỉ tăng các nắp tách rời và làm gián đoạn màu nâu.

2) Như bạn đã chỉ ra, vấn đề với FRAM là giá cả!

3) Tùy thuộc vào mức độ biến động của dữ liệu vị trí và nhiệt độ của bạn, bạn sẽ tăng độ bền bằng cách chỉ viết nếu giá trị đã thay đổi. Bạn có thể lấy mẫu nhiệt độ mỗi giây một lần, nhưng nếu nó chỉ thay đổi cứ sau 5 phút, vấn đề sẽ được giải quyết.


1

Đây là cách tôi giải quyết vấn đề này trong dự án của mình:

Dự trữ 1 cung flash để giữ bitmask của các vị trí không sử dụng và một số vị trí cho giá trị.

Bitmask tôi đã sử dụng dài 16 byte, vì vậy tôi có 128 vị trí để đặt giá trị.

Bitmask được khởi tạo cho tất cả những cái, trong điều kiện flash là trạng thái bị xóa.

Khi bạn muốn viết một giá trị mới, hãy đọc trong bitmask và tìm bit đầu tiên là một. Đây là số vị trí mà bạn sẽ viết giá trị. Thay đổi bit đó thành 0 để đánh dấu nó là đã sử dụng và ghi bitmask trở lại flash mà không cần xóa nó trước. Tiếp theo, ghi giá trị vào khe sau bitmask mà không xóa flash.

Bằng cách này, bạn mở rộng chu kỳ ghi flash lên 128 lần bằng cách viết bitmask mới chỉ với một thay đổi từ một thành số không.

Nếu toàn bộ bitmask là 0, thì hãy xóa vùng flash và bắt đầu làm mới.


3
Tôi có thể làm bạn thất vọng, nhưng khi bạn flash một chút, toàn bộ khu vực bị ghi đè. Giải pháp của bạn sẽ khiến khu vực 'bitmask' chết thực sự sớm.
Andrejs Cainikovs

1
Nếu bạn không xóa đèn flash, bạn không sử dụng hết một trong các chu kỳ xóa 10K cho khu vực đó. Nếu bạn có giá trị 0x7F và bạn viết giá trị 0x3F, kết quả sẽ là 0x3F. Điều này giữ cho bitmask được cập nhật, nhưng không xóa đèn flash. Việc xóa chỉ xảy ra khi toàn bộ bitmask là 0.
Robert

Nếu tôi sai, hãy thảo luận. Tôi không muốn câu trả lời tồi ở đây và tôi thực sự không muốn một thiết kế xấu trong dự án của mình.
Robert

Tôi nghĩ Robert đã đúng. Trên vi điều khiển của tôi, bạn chỉ có thể ghi 4 byte mỗi lần, nhưng các bit cần thiết được đặt thành không. Cách duy nhất để đưa chúng trở lại 1 là để trống khối 1k. Đây chỉ là chu kỳ xóa mà đeo đèn flash ...
Tim

Nó có thể khác nhau cho từng loại bộ nhớ và thậm chí có thể là nhà cung cấp bộ nhớ. Tôi đã thấy EEPROM phải xóa trang sau đó viết lại cho mỗi lần viết. Tôi đã thấy bộ nhớ flash, bạn có thể ghi các bit vẫn là 1 mà không xóa trang.
mjh2007
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.