-
- Бит занятости всё время сброшен, точнее он работает как надо, но
обнуляется рано, видимо еще до фактического окончания процессов -
не дожидаюсь окончания стирания сектора и т.п.операции. Ставлю
задержку тупую (причем не по паспорту, а секунду!) - работает. - POV(16.01.2024 10:58)
- Победил ... для меня это не очевидно было... POV(370 знак., 16.01.2024 12:09)
- А разве WEL не read-only? О.о Это же "индикаторный" бит. Зачем его
пытаться переписывать? - reZident(16.01.2024 13:39)
- Ридонли если писать через SR. А через 06 он как раз взводится. И
вот для данного чип эта операция требует контроля BUSY. Предварение
командой 50 устранило необходимость контроля. Мне кажется, всё
вышло в итоге логично... POV(711 знак., 16.01.2024 17:06, картинка, картинка)
- Все это интересно, но биты WEL и BUSY не являются non-volatile, о чем я уже писал ниже по топику. И вообще это называется "замазать" проблему, а не решить ее. На 99% уверен, что где-то ошибка в программе имеется. reZident(1 знак., 16.01.2024 17:19, ссылка)
- Тут непонятка с микросхемой. ТС утверждает, что после команды 06h
Enable Write, выставляется бит бизи на время, характерное для
записи во флеш. Он его не пытается прямо переписать, но обнаружил
занятие микросхемы после 06h. - Nikolay_Po(16.01.2024 13:43)
- А по-моему он путает WEL и WIP. - reZident(16.01.2024 13:50)
- Нет, именно wel, который взводится команде разрешения записи. - POV(16.01.2024 13:53)
- То бишь после команды WREN, результатом которой должна быть
установка бит WEL, вначале устанавливается бит WIP (сигнализируя о
процессе записи), а WEL устанавливается лишь через 5мс, после чего
(или одновременно с ним) WIP сбрасывается. Я все правильно понял? - reZident(16.01.2024 14:59)
- Что за WIP? Я просто контролирую BUSY. POV(1 знак., 16.01.2024 16:57, картинка)
- Позиционно это тот же самый бит, но в документации производителя он
называется WIP. reZident(2 знак., 16.01.2024 17:04, ссылка, картинка)
- Мы всё еще говорим о ZD25Q? Я не вижу в описании такого бита.
Конкретно чип ZD25Q64B если буковки на что-то влияют. POV(2 знак., 16.01.2024 17:10, ссылка, картинка)
- На снимке, бит WEL не подписан как Non-Volatile, значит, его
изменение не должно было приводить к попытке какой-либо записи.
Интересно проверить такую гипотезу: бит WEL сохраняется при
выключении питания из-за ошибки на кристалле. Можно проверить так: Nikolay_Po(347 знак., 16.01.2024 18:32)
- Не останется. Условия для сброса WEL перечислены, power-up указано в том числе. reZident(1 знак., 16.01.2024 19:45, картинка)
- Ага. Я смотрел datasheet на м/с другого объема - ZD25Q80, ZD25Q16, ZD25WQ80. Там везде - WIP, а не BUSY. - reZident(16.01.2024 17:15)
- На снимке, бит WEL не подписан как Non-Volatile, значит, его
изменение не должно было приводить к попытке какой-либо записи.
Интересно проверить такую гипотезу: бит WEL сохраняется при
выключении питания из-за ошибки на кристалле. Можно проверить так: Nikolay_Po(347 знак., 16.01.2024 18:32)
- Мы всё еще говорим о ZD25Q? Я не вижу в описании такого бита.
Конкретно чип ZD25Q64B если буковки на что-то влияют. POV(2 знак., 16.01.2024 17:10, ссылка, картинка)
- Позиционно это тот же самый бит, но в документации производителя он
называется WIP. reZident(2 знак., 16.01.2024 17:04, ссылка, картинка)
- Не обязательно. WEL может устанавливаться в ОЗУ сразу, но
параллельно, начинается запись в SR в связи с изменением статуса по
команде. И, пока эта запись не завершиться (BUSY), команда на
выполнение следующей записи не принимается. Может быть так (это
домысел). Может, WIP вообще не устанавливается, но, по факту,
запись происходит. - Nikolay_Po(16.01.2024 15:29)
- Это все ваши домыслы. Потому, что WEL не является non-volatile
битом статусного регистра. Но даже и volatile-биты статуса (BPx)
копируются в "ОЗУ" при подаче питания и далее читается их состояние
из этого самого "ОЗУ". Для изменения WEL и WIP в процессе
функционирования SerialFlash запись их состояния в "ПЗУ" не
требуется и более того - невозможна. reZident(526 знак., 16.01.2024 15:35)
- В описании на ZD25Q64B такого текста нет, формулировки иные POV(762 знак., 16.01.2024 17:24)
- Формулировка другая, а суть та же. Non-volatile это условно "ПЗУ", а volatile - условно "ОЗУ". Биты WEL и BUSY - тип volatile. WEL это индикатор готовности High Voltage Generator (как я предполагаю) к записи данных, т.е. состояние выхода какого-нибудь триггера или компаратора. - reZident(16.01.2024 17:53)
- Мысль в том, что WEL, из-за ошибки конструктора, почему-то попал в
non-volatile биты. Факты говорят об этом. Может, самой записи и не
происходит, но таймер записи отрабатывает вместе с BUSY. Обходной
путь - дать 50h перед 06h. Это экономит ~5мс и гарантирует
отсутствие протирания флеш SR, если запись всё-таки происходит. Nikolay_Po(43 знак., 16.01.2024 15:41, ссылка)
- Если бы ваше предположение (о записи в "ПЗУ" состояния SR при
изменении бита WEL) было верно, то чип был бы забракован и м/с не
выпустили бы в тираж. Потому, что заявленный ресурс в 100К записей
был бы выработан уже после 25 циклов записи всего объема 8Мбитной
SerialFlash. - reZident(16.01.2024 16:09)
- И потом, 100к это гарантированный ресурс. При нормальных условиях, и 1000к может отработать до отказа. Не во всех применениях требуется полный ресурс. Так что "авось прокатит". Помним, что мы лаоваи. - Nikolay_Po(16.01.2024 16:20)
- Проходил ли контроль чип ТС? Смотря где покупать. Может, как раз отбраковку и приобрели, нечаянно. - Nikolay_Po(16.01.2024 16:19)
- Если бы ваше предположение (о записи в "ПЗУ" состояния SR при
изменении бита WEL) было верно, то чип был бы забракован и м/с не
выпустили бы в тираж. Потому, что заявленный ресурс в 100К записей
был бы выработан уже после 25 циклов записи всего объема 8Мбитной
SerialFlash. - reZident(16.01.2024 16:09)
- В описании на ZD25Q64B такого текста нет, формулировки иные POV(762 знак., 16.01.2024 17:24)
- Это все ваши домыслы. Потому, что WEL не является non-volatile
битом статусного регистра. Но даже и volatile-биты статуса (BPx)
копируются в "ОЗУ" при подаче питания и далее читается их состояние
из этого самого "ОЗУ". Для изменения WEL и WIP в процессе
функционирования SerialFlash запись их состояния в "ПЗУ" не
требуется и более того - невозможна. reZident(526 знак., 16.01.2024 15:35)
- Что за WIP? Я просто контролирую BUSY. POV(1 знак., 16.01.2024 16:57, картинка)
- То бишь после команды WREN, результатом которой должна быть
установка бит WEL, вначале устанавливается бит WIP (сигнализируя о
процессе записи), а WEL устанавливается лишь через 5мс, после чего
(или одновременно с ним) WIP сбрасывается. Я все правильно понял? - reZident(16.01.2024 14:59)
- Нет, именно wel, который взводится команде разрешения записи. - POV(16.01.2024 13:53)
- А по-моему он путает WEL и WIP. - reZident(16.01.2024 13:50)
- Ридонли если писать через SR. А через 06 он как раз взводится. И
вот для данного чип эта операция требует контроля BUSY. Предварение
командой 50 устранило необходимость контроля. Мне кажется, всё
вышло в итоге логично... POV(711 знак., 16.01.2024 17:06, картинка, картинка)
- Не победил. Что-то не то! Не должно быть никакой записи, требующей
5мс! Есть возможность снять логическим анализатором, что творится
на шине (CS, SCK, DI, DO)? Микросхема такая же, что и те, с
которыми я работаю (Winbond). Nikolay_Po(1175 знак., 16.01.2024 13:23)
- И цитата всё же должна быть иная т.к. команда 06 POV(69 знак., 16.01.2024 13:36, картинка)
- По моему все логично. 1) Команда разрешения записи WREN -> 2)
проверка бита WEL, ожидаем его установку -> 3) запись данных
-> 4) ожидаем завершения записи, проверяя бит WIP. Зачем бит
WEL пытаться перезаписать-то? - reZident(16.01.2024 13:49)
- Не нужно проверки бита WEL. Просто первой транзакцией командуем 06,
следующей - сразу пишем. Так оно работает в W25Q. Почему Z25Q
требует ожидания - вопрос! И я подозреваю, что идёт реальная запись
в SR, коей быть не должно и не должно требоваться задержки перед
командой записи страницы. - Nikolay_Po(16.01.2024 13:53)
- Бит есть, значит проверка не помешает. Подозреваю, что между командой разрешения записи и началом записи должны включиться генераторы повышенного напряжения, что занимает время вовсе не наносекунды. - reZident(16.01.2024 14:19)
- на fm25V и at25 код работал. А тут вот или ждать окончания записи
wel или надеяться что команда 50 исключает запись, не насилуя
флешку. - POV(16.01.2024 13:56)
- Если после команд 50h+06h нет бизи, а следующая команда на запись
принимается сразу, значит, лишней записи во флеш нет, можно быть
спокойным. - Nikolay_Po(16.01.2024 14:20)
- гуд - POV(16.01.2024 14:21)
- Возможно, я спас ваши флешки :) - Nikolay_Po(16.01.2024 13:57)
- Если после команд 50h+06h нет бизи, а следующая команда на запись
принимается сразу, значит, лишней записи во флеш нет, можно быть
спокойным. - Nikolay_Po(16.01.2024 14:20)
- Не нужно проверки бита WEL. Просто первой транзакцией командуем 06,
следующей - сразу пишем. Так оно работает в W25Q. Почему Z25Q
требует ожидания - вопрос! И я подозреваю, что идёт реальная запись
в SR, коей быть не должно и не должно требоваться задержки перед
командой записи страницы. - Nikolay_Po(16.01.2024 13:53)
- Это если в микросхеме баг или недоработка алгоритма. Похоже, что по
команде Write Enable, вместо того, чтобы просто временно взвести
бит WEL, происходит ещё и запись в регистр статуса SR, что
блокирует последующую запись. И, если так, то нельзя исключать, что
потом, после автоматического сброса WEL после записи, изменение
статуса опять записывается во флеш и нужно ещё ждать. Nikolay_Po(110 знак., 16.01.2024 13:42)
- Если команда 50 присутствует, то работает сразу, без паузы. Видать
где-то внутри микрухи этот бит в РАМе сидит вне зависимости от
запомненного в SR. - POV(16.01.2024 13:54)
- Для этого команда 50h и нужна, чтобы писать в ОЗУ, а не во флеш.
Чтобы не протереть флеш. Другое дело, что в нормальных чипах от
Winbond, снятие/установка WEL по командам происходит без теневой
записи SR и, поэтому, не требует спец. команды 50h для нормальной
работы. - Nikolay_Po(16.01.2024 13:57)
- "Энергонезависимые" (non-volatile) биты статуса (типа BPx) при
подаче питания автоматически копируются в "ОЗУ". Далее работа идет
с их (потенциально volatile) копией. Команда Write Enable for
Volatile Status Register (50h) позволяет изменить состояние
"энергонезависимых" бит статуса без их записи в энергонезависимую
память, то бишь изменить именно volatile-копию. Для бита WEL,
который мало того, что read-only, но еще и чисто "индикаторый" эта
команда разрешения записи (50h) reZident(196 знак., 16.01.2024 15:30)
- Угу. Так в теории и так у Winbond W25Q. А вот у конкретного
экземпляра Z25Q, попытка разблокировки возможности записи командой
06h, вызывает занятие чипа на время записи. А вот использование 50h
перед 06h, устраняет занятость чипа и, вероятно, устраняет лишнюю
запись в SR. Nikolay_Po(718 знак., 16.01.2024 15:37)
- Вы же не работали с ZD32 и судите о ситуации лишь со слов POV. Но
дело в том, что POV находится внутри этой ситуации. И пока из нее не вышел истина может ускользать в
виде программной ошибки, которую он пока не замечает. При
программировании такое случается сплошь и рядом - глаз "замылился".
Поэтому бывает полезен некий "аудит" программы от независимого
человека. - reZident(16.01.2024 15:48)
- Согласен. - Nikolay_Po(16.01.2024 15:55)
- Вы же не работали с ZD32 и судите о ситуации лишь со слов POV. Но
дело в том, что POV находится внутри этой ситуации. И пока из нее не вышел истина может ускользать в
виде программной ошибки, которую он пока не замечает. При
программировании такое случается сплошь и рядом - глаз "замылился".
Поэтому бывает полезен некий "аудит" программы от независимого
человека. - reZident(16.01.2024 15:48)
- Угу. Так в теории и так у Winbond W25Q. А вот у конкретного
экземпляра Z25Q, попытка разблокировки возможности записи командой
06h, вызывает занятие чипа на время записи. А вот использование 50h
перед 06h, устраняет занятость чипа и, вероятно, устраняет лишнюю
запись в SR. Nikolay_Po(718 знак., 16.01.2024 15:37)
- "Энергонезависимые" (non-volatile) биты статуса (типа BPx) при
подаче питания автоматически копируются в "ОЗУ". Далее работа идет
с их (потенциально volatile) копией. Команда Write Enable for
Volatile Status Register (50h) позволяет изменить состояние
"энергонезависимых" бит статуса без их записи в энергонезависимую
память, то бишь изменить именно volatile-копию. Для бита WEL,
который мало того, что read-only, но еще и чисто "индикаторый" эта
команда разрешения записи (50h) reZident(196 знак., 16.01.2024 15:30)
- Для этого команда 50h и нужна, чтобы писать в ОЗУ, а не во флеш.
Чтобы не протереть флеш. Другое дело, что в нормальных чипах от
Winbond, снятие/установка WEL по командам происходит без теневой
записи SR и, поэтому, не требует спец. команды 50h для нормальной
работы. - Nikolay_Po(16.01.2024 13:57)
- Если команда 50 присутствует, то работает сразу, без паузы. Видать
где-то внутри микрухи этот бит в РАМе сидит вне зависимости от
запомненного в SR. - POV(16.01.2024 13:54)
- По моему все логично. 1) Команда разрешения записи WREN -> 2)
проверка бита WEL, ожидаем его установку -> 3) запись данных
-> 4) ожидаем завершения записи, проверяя бит WIP. Зачем бит
WEL пытаться перезаписать-то? - reZident(16.01.2024 13:49)
- И всё же этот бит имеет отображение в SR. А тому для записи нужно
время. Я всего лишь ввёл проверку занятости после команды 50 и всё
взлетело. POV(1 знак., 16.01.2024 13:26, картинка)
- Не путайте изменение значения бита статуса по команде от изменения с записью регистра во флеш. Nikolay_Po(625 знак., 16.01.2024 13:37)
- Так! А зачем вы вообще использовали команду 50? Вам, по-хорошему,
частая запись в статус вообще не нужна. Туда пишут разок, чтобы
залочить, например, бутлоадер. Для обычных записи-стирания, к
регистру статуса обращаются только для чтения. А для разрешения
записи, используют команду 06h. - Nikolay_Po(16.01.2024 13:36)
- Я выше поправил. Я использую команду 6. - POV(16.01.2024 13:37)
- ОК. Тогда что будет, если перед командой 06h дать команду 50h? Я
ожидаю, что бизи не будет, а последующая запись или стирание -
заработают. Nikolay_Po(89 знак., 16.01.2024 13:39)
- Да, так пишет без бузи. Спасибо. Цитируемый абзац не весь прочитал,
всё в последней строчке раскрыто )) - POV(16.01.2024 13:52)
- Ура! Мои старания не пропали даром! Донёс! Nikolay_Po(228 знак., 16.01.2024 13:55)
- Да, так пишет без бузи. Спасибо. Цитируемый абзац не весь прочитал,
всё в последней строчке раскрыто )) - POV(16.01.2024 13:52)
- ОК. Тогда что будет, если перед командой 06h дать команду 50h? Я
ожидаю, что бизи не будет, а последующая запись или стирание -
заработают. Nikolay_Po(89 знак., 16.01.2024 13:39)
- Я выше поправил. Я использую команду 6. - POV(16.01.2024 13:37)
- И цитата всё же должна быть иная т.к. команда 06 POV(69 знак., 16.01.2024 13:36, картинка)
- А разве WEL не read-only? О.о Это же "индикаторный" бит. Зачем его
пытаться переписывать? - reZident(16.01.2024 13:39)
- Победил ... для меня это не очевидно было... POV(370 знак., 16.01.2024 12:09)
- Считать SFDP и действовать на основе его информации? Toчкa oпopы(1 знак., 12.01.2024 22:54, ссылка)
- Читаю коды мануфактурера и ёмкости (добавил специфичное в проверки, всё проходит). Далее под это настраиваю. Само по себе для малых ёмкостей FM25 и AT25 (для ат25 четко указываю конкретную микруху) оно великолепно работает. И тут не вижу прям чего-то заметно важного для этих 64Мбит, но нихера ((( - POV(12.01.2024 23:02)
- Используем ZD25WQ80, проблем нет. - LightElf(12.01.2024 18:15)
- А биты защиты записи BP0, BP1, BP2 в статусном регистре сброшены? - reZident(12.01.2024 16:47)
- Да, они про нулям. POV(75 знак., 12.01.2024 16:49, картинка)
- А команда стирания сектора или всего чипа проходит? - reZident(12.01.2024 16:52)
- О! После стирания оно записалось и прочиталось. Во всяком случае 10
байт. - POV(12.01.2024 17:01)
- Файловая система поверх не накатывается. Какой косяк всё же
присутствует. - POV(12.01.2024 18:46)
- Сделайте, пожалуйста, серию тестов: стираем сектор, пишем страницу.
Ждём снятия бизи. Без задержки пишем следующую страницу. Ждём
снятия бизи. Без задержки пишем следующую и так до конца сектора.
Проверяем результат. Если не записалось, повторяем то же самое,
только добавляем задержку после снятия бизи. Находим задержку,
необходимую для завершения записи. Nikolay_Po(199 знак., 16.01.2024 11:07)
- Я вот напоролся с W25Q80DV и NUC970 (что само по себе анекдот).
Шьется, читается, верифицируется. Но не грузится с нее, хоть
тресни. Чем-то она ROM-загрузчику не нравится. Разбираться было
лень, поставил ZD25WQ80BT - полет нормальный - LightElf(16.01.2024 12:52)
- Микросхемы разные, хотя бы по записи в регистр статуса. См. моё
сообщение выше (ссылка). Nikolay_Po(1 знак., 16.01.2024 13:20, ссылка)
- 1) С точки зрения того же U-Boot чипы не отличаются ничем. Просто добавил ID в список и все поехало. LightElf(321 знак., 16.01.2024 15:25)
- Микросхемы разные, хотя бы по записи в регистр статуса. См. моё
сообщение выше (ссылка). Nikolay_Po(1 знак., 16.01.2024 13:20, ссылка)
- Я вот напоролся с W25Q80DV и NUC970 (что само по себе анекдот).
Шьется, читается, верифицируется. Но не грузится с нее, хоть
тресни. Чем-то она ROM-загрузчику не нравится. Разбираться было
лень, поставил ZD25WQ80BT - полет нормальный - LightElf(16.01.2024 12:52)
- А зачем использовать именно Quad SPI SerialFlash, если режим Quad
SPI не требуется? Может в библиотеке от FM25V каких-то специфичных
команд не хватает (типа чтения второго статусного регистра)? - reZident(12.01.2024 22:31)
- Я просто SPI использую... POV(139 знак., 12.01.2024 22:43)
- Может там времянки другие? - LightElf(12.01.2024 20:21)
- В понедельник продолжу изыскания - POV(12.01.2024 22:29)
- Сделайте, пожалуйста, серию тестов: стираем сектор, пишем страницу.
Ждём снятия бизи. Без задержки пишем следующую страницу. Ждём
снятия бизи. Без задержки пишем следующую и так до конца сектора.
Проверяем результат. Если не записалось, повторяем то же самое,
только добавляем задержку после снятия бизи. Находим задержку,
необходимую для завершения записи. Nikolay_Po(199 знак., 16.01.2024 11:07)
- Файловая система поверх не накатывается. Какой косяк всё же
присутствует. - POV(12.01.2024 18:46)
- О! После стирания оно записалось и прочиталось. Во всяком случае 10
байт. - POV(12.01.2024 17:01)
- А команда стирания сектора или всего чипа проходит? - reZident(12.01.2024 16:52)
- Да, они про нулям. POV(75 знак., 12.01.2024 16:49, картинка)
- Бит занятости всё время сброшен, точнее он работает как надо, но
обнуляется рано, видимо еще до фактического окончания процессов -
не дожидаюсь окончания стирания сектора и т.п.операции. Ставлю
задержку тупую (причем не по паспорту, а секунду!) - работает. - POV(16.01.2024 10:58)