Простой вопрос, я надеюсь! Я не нахожу никаких окончательных ответов ...
Я пишу драйверы для чипа флэш-памяти SST25VF064C . Он общается через SPI.
Как и вся флэш-память (о которой я знаю), ее необходимо стереть (все биты = 1), прежде чем ее можно будет записать (биты = 0). Для этого чипа наименьшая область, которая может быть стерта, составляет 4 КБ.
Его память делится на 256-байтовые страницы. С помощью одной инструкции я могу записать на указанную страницу от одного байта до 256 байтов. Мне не нужно начинать с границы страницы: первое местоположение, которое нужно запрограммировать, может быть где угодно на странице.
Общее правило состоит в том, чтобы удостовериться, что страница удалена перед записью в нее. Но могу ли я написать на ранее написанную страницу, если я избегу уже написанных областей? Например, скажем, что я храню данные в байтах 0-127. Могу ли я позже написать еще 128 байтов на той же странице, если я начну с байта 128?
Если я понимаю р. 16 таблицы данных правильно, это говорит: с этим конкретным чипом, вы не должны писать на ранее написанной странице, даже если вы избегаете уже написанных областей.
Детали
Спецификация чипа флэш-памяти SST25VF064C на стр. 16 гласит: «Инструкция программы Page-Program запрограммирует до 256 байтов данных в памяти. Выбранный адрес страницы должен быть в стертом состоянии (FFH) перед началом операции Page-Program».
Поэтому я предполагаю, что «вся выбранная страница должна быть в стертом состоянии (каждый байт на странице FFh) перед началом операции Page-Program». Выпустил ли SST или Microchip какую-либо документацию, разъясняющую это безумно неоднозначное предложение?
По моему опыту, производитель всех флеш-микросхем MLC и некоторых более новых флеш-микросхем SLC требует, чтобы после того, как страница была написана, страница должна быть стерта перед повторной записью этой страницы, даже если вы хотите изменить только 1 бит на 0 бит (Это называется «правилом однократной записи» в статье YAFFS .)
По моему опыту, все старые флеш-чипы позволяют вам изменять любой 1 бит на 0 бит без цикла стирания, даже если этот бит находится на странице или даже в байте, в котором уже были запрограммированы другие биты на ноль - a Страница вспышки может быть запрограммирована несколько раз между стиранием. (Это называется «множественная запись» в статье YAFFS).
Лист данных производителя - это условное обещание, которое производитель дает вам. Пока вы будете следовать всем рекомендациям таблицы, производитель обещает, что чип будет работать так, как указано. Я подозреваю, что если вы программируете ранее написанную страницу, избегая уже написанных областей, есть большая вероятность, что немедленное обратное чтение может дать ожидаемые вами данные - недавно записанные байты - это значения, которые вы только что написали, и другие байты, вероятно, не изменились. Однако, поскольку это не соответствует рекомендациям таблицы, вы больше не можете полагаться на все обещания в таблице. Я слышал слухи о том, что такая несанкционированная деятельность приводит к ухудшению времени хранения и стойкости данных из-за программных помех, перепрограммирования, перезарядки, эффектов, подобных удару строки DRAM и т. Д.
«Схема использования памяти влияет на частоту ошибок по битам. Программирование частичных страниц, непоследовательное программирование страниц внутри блока, чрезмерное чтение на блок без стирания, а также неравное количество операций чтения в одном блоке увеличивает число операций чтения. беспокоить ошибки. " - Михал Джедрак. «NAND Flash память во встроенных системах».
«Программный сбой возникает, когда бит непреднамеренно программируется от« 1 »до« 0 »во время события программирования страницы. Эта битовая ошибка может возникать либо на программируемой странице, либо на другой странице в блоке. Условия напряжения смещения в блок во время программирования страницы может привести к тому, что небольшое количество тока будет туннелировать в соседние ячейки памяти. Повторные попытки частичного программирования страницы продолжат усугублять это состояние ». - Дуглас Шелдон и Майкл Фри. «Тестирование тревог во флэш-памяти» . п. 8, 9.
«Программный сбой происходит, когда бит непреднамеренно запрограммирован (от 1 до 0) во время операции программирования. ... Это условие усугубляется случайным программированием в блоке и применением нескольких частичных записей на страницы». «Уменьшение сбоя флэш-памяти Yaffs NAND»
источник
Весьма вероятно, что программное обеспечение для программирования, которое вы используете, уже записывает «необходимые» 256 байтов. Он «появляется», как будто он дает вам возможность записывать от одного до 256 байтов, но я подозреваю, что он выполняет ИЛИ - байт (ы), которые вы хотите, с «маской» из 256 «FF». Если это правильно, то вы можете «безопасно» записать любой байт один раз , без необходимости стирать целые 4K байта. Если контрольная сумма записана вне вашего контроля, то, скорее всего, будет создана недопустимая контрольная сумма, когда вы записываете другой байт в ранее записанный сегмент. Последствия этого зависят от чипа.
Если ваше программное обеспечение не выполняет операции «ИЛИ», вы можете сделать это самостоятельно. Очистите 256-байтовый сегмент, запишите байты в правильную позицию (и) ИЛИ с 256-байтовой маской FF и запишите сегмент на нужную страницу.
Работает ли тот или иной метод с каким-либо конкретным чипом, вы можете легко определить. Записать в первые 128 байтов, записать во вторые 128 байтов, убедиться, что первые 128 байтов НЕ «перепутаны»!
источник