Как прочитать память 25q32

Обновлено: 04.07.2024


Всем привет! Информация не новая, но, думаю, есть и те, кому она будет полезной. Хочу рассказать о способе увеличения памяти в модулях esp8266. Подробности под катом.
Wi-Fi модули esp8266 благодаря своей дешевизне и маленьким габаритам получили широчайшее распространение, на них собрано множество различных конструкций для домашней автоматизации. А главное, они позволяют загружать прошивки собственных проектов. Меня это очень заинтересовало, для экспериментов купил самый дешевый модуль ESP8266-01 с одним мегабайтом памяти на борту.

Сейчас понимаю, что это не самый лучший выбор, но для ознакомительных целей подойдет.
Модуль имеет следующую распиновку.

Для его подключения собрал макетную плату, питание осуществляется от USB-UART переходника через стабилизатор AS1117 на 3.3в. В спецификации указано, что выводы tx/rx толерантны к 3.3 вольтам, но их зачастую подключают напрямую без согласования уровней. Я же решил использовать level converter, так безопасней и правильней.

CH_PD подключаем через резистор 10К к 3.3В.
RES — подключаем через кнопку на землю.
Также для перехода в режим перепрошивки вывел перемычку с GPIO0 на землю.
Для загрузки прошивок в модуль можно использовать любую из программ XTCOM_UTIL, NodeMCU Flasher или FLASH DOWNLOAD TOOL. Пробовал использовать каждую из программ, но больше всего понравилась FLASH DOWNLOAD TOOL (главное не забыть перевести еспшку в режим обновления). Для этого:
1. Отключаем питание
2. Подключаем gpio0 на землю
3. Подаем питание
4. В программе выбираем нужный com порт, скорость (в моем случае 115200) и путь к прошивке
5. Жмем кнопку загрузки прошивки, а вывод RES кратковременно подключаем к земле, например, через кнопку
6. После загрузки файла отключаем питание, goio0 отключаем от земли. Подаем питание

На ESP8266-01 установлена память 25Q80ASSIG фирмы Winbond Electronics. Это флеш-память с интерфейсом SPI, 8МБит, 1МБ. Datasheet.
Приступаем к апгрейду.
С помощью фена сдуваем старую микросхему.

Теперь на её место ставим купленную 25Q32FVSIG. Это флеш-память с интерфейсом SPI, 32Мбит, 4МБ. Datasheet. Несмотря на то, что её корпус чуть больше, она нормально встала на площадки.

Запускаем программу flash download tool, тут видно, что память определилась правильно.

Дальше попробовал загрузить прошивку от homes-smart, собранную в конструкторе. Все запустилось без проблем.

Заключение.
Данная микросхема памяти позволяет быстро и очень дешево сделать апгрейд, что существенно расширит ваши возможности в разработке проектов.

Работа с ESP8266: Первоначальная настройка, обновление прошивки, связь по Wi-Fi, отправка-получение данных на ПК
Работа с ESP8266: Собираем компилятор и пишем первую прошивку
Грязный хак модуля ESP8266 ESP-01 — дополнительно 4 GPIO
Библиотека с примерами для Ардуино, позволяет работать с флеш-памятью winbond W25Q80, W25Q16, W25Q32, W25Q64, W25Q128


В бонусе памятник самолету АН-26 — символу северной авиации.

Прошивка flash-памяти 25xxx через программатор USBasp

Микросхемы флеш-памяти eeprom серии 25xxx широко применяются в микроэлектронике. В частности, в современных телевизорах и материнских платах в 25xxx хранится прошивка биоса. Перепрошивка 25xxx осуществляется по интерфейсу SPI, в чем и заключается отличие этих микросхем от флеш-памяти семейства 24xxx, которые шьются по i2c(квадратная шина).

Соответственно, для чтения/стирания/записи 25xxx нужен SPI-программатор. Одним из самых дешевых вариантов программаторов для этой цели является USBasp, который стоит смешные деньги- с доставкой всего около 2$ на ебее. В свое время я купил себе такой для программирования микроконтроллеров. Теперь мне понадобилось прошить не микроконтроллер, а SPI-флеш и решено было им воспользоваться.

Забегая вперед скажу, что прошивка от Tifa работает, микросхемы 25xxx шьются. Кстати, кроме 25xxx, модифицированный программатор рассчитан на работу с 24xxx и Microwire.

1. Перепрошивка USBasp

Сначала нужно замкнуть контакты J2:


Лично я не просто замкнул, а впаял в контакты переключатель:


При замкнутых контактах J2 (это у меня переключатель в положении вправо) USBasp переходит в режим готовности к перепрошивке.

Сам себя USBap перепрошить не может, поэтому нужен еще один программатор. USBasp как бы оказывается в положении хирурга, который не может сам себе вырезать аппендикс и просит друга помочь. Для перепрошивки USBasp я использовал самодельный программатор AVR910, но для одного раза можно по-быстрому за пару минут спаять программатор «5 проводков», который состоит всего-лишь из одного разъема LPT и 5 резисторов.

Подключаем программатор к USBasp:


Теперь идем на форум альтернативной прошивки от Tifa, в самом верхнем посте находим и качаем архив с последней прошивкой и ПО.


Находим там файл mega8.hex, это и есть альтернативная прошивка для USBasp.

Запускаем CodeVisionAvr (я использую версию 2.0.5), выставляем настройки программатора: Settings-> Programmer.


Устанавливаем настройки записи: Tools->Chip programmer. Выбираем чип Atmega8L, именно такой стоит на USBasp. Фьюзы не выставляем- те, что надо, уже прошиты в чипе. Остальные настройки оставляем по умолчанию.


Стираем старую программу USBasp: Program-> Erase chip.

Открываем файл прошивки mega8.hex: File-> Load flash.

Перепрошиваем USBasp: Program-> Flash.


Теперь проверим, видит ли Windows 7 x86 этот программатор. Вставляем USBasp в USB и… система пишет «USBasp не удалось найти драйвер». Понятно, нужно установить драйвер. Но драйверов в скачанном на форуме архиве нет, их нужно скачать на родном сайте USBasp тут, оригинальные драйвера подходят и для модифицированного программатора. Скачали, установили, Win7 увидела программатор, все ок. Впрочем, я программирую микроэлектронику на ноутбуке с WinXP, она тоже после установки драйверов видит программатор.

2. Площадка для подключения USBasp к микросхеме 25xxx DIP

Теперь нужно подготовить площадку для программирования 25xxx. Я это сделал на макетной плате по такой схеме:


3. Прошивка микросхем 25xxx через USBasp

Для прошивки 25xxx через модифицированный USBasp используется программа AsProgrammer, которая тоже есть в архиве.

Для примера, поработаем с микросхемой Winbond 25×40. Запускаем AsProgrammer, ставим режим работы SPI и выбираем тип микросхемы: Микросхема-> SPI-> Winbond->…


… и видим, что W25X40 в списке нет. Что же, тогда заполним параметры микросхемы вручную. Находим мануал на Winbond 25X40 и там на странице 4 видим такие параметры:

Эти параметры вносим сюда:


Подключаем USBasp к компьютеру и микросхеме Winbond 25×40:


С помощью кнопок «прочитать», «записать», «стереть», проверяем работу программатора:


Только нужно учесть, что перед тем, как что-то записать в микросхему, сначала нужно выставить: Настройки-> Проверка записи, что бы после записи прошивки в микросхему была выполнена проверка на соответствие того, что писали тому, что в итоге записали. Это немаловажная вещь, потому что если прошивку делать не на очищенный чип, в него запишется чёрт-те что. Поэтому сначала нужно стереть микросхему, а затем только проводить ее запись.

Благодаря прошивке от Tifa дешевый китайский программатор USBasp теперь умеет работать с микросхемами flash-памяти eeprom 25xxx. Теоретически еще может работать c 24xxx и Microwire, но я проверил только работу с 25xxx.

UPD1:
Оказывается, такую же прошивку можно записать и в программатор AVR910. Тогда он тоже будет работать с flash-памятью 25xxx: Программатор ISP памяти из AVR910.

Поэтому сначала нужно сделать так, чтобы мы могли с лёгкостью подключиться к микросхеме флеш-памяти. Для этого можно воспользоваться либо специальным переходником, к которому придётся припаять микросхему, либо (что предпочтительнее) использовать панель с нулевым усилением (т.н. панель ZIF , купить можно на Али).

Флеш-память припаяна к плате-переходнику

Флеш-память припаяна к плате-переходнику

А вот так выглядит микросхема флеш-памяти в ZIF-панели:

Флеш-память в переходной панели с нулевым усилением

Флеш-память в переходной панели с нулевым усилением

И под микроскопом:

Флеш-память в панели с нулевым усилением под микроскопом

Флеш-память в панели с нулевым усилением под микроскопом

Купить ПЗУшку можно, например, в Китае.

Теперь мы можем использовать макетную плату (бредборд) и с лёгкостью подключаться к микросхеме.

2 Подключение Arduino к микросхеме flash-памяти 25L8005

Назначение выводов микросхемы флеш-памяти 25L8005

Назначение выводов микросхемы флеш-памяти 25L8005

Кстати, datasheet на микросхему флеш-памяти 25L8005 можно скачать в конце статьи.

Будем использовать для программирования флэш-памяти интерфейс SPI , поэтому подключимся к стандартным SPI выводам Arduino:

Соберём электрическую схему подключения микросхемы флеш-памяти MX25L8005 к Arduino.

Схема подключения микросхемы флеш-памяти 25L8005 к Arduino

Схема подключения микросхемы флеш-памяти 25L8005 к Arduino

Флеш-память на ZIF-панели, подключённая к Arduino Флеш-память на ZIF-панели, подключённая к Arduino

3 Очистка флеш-памяти с помощью Arduino

Перед тем как записывать данные в флеш-память, необходимо стереть тот сектор или страницу, в который мы собираемся записывать. Если записываемых данных немного (в нашем учебном примере это будут всего 16 байт), то достаточно стереть 1 сектор. Из документации на микросхему мы видим, что последовательность стирания такая: выставить разрешение на запись (1 байт), послать команду на стирание (1 байт) и адрес (3 байта), выставить запрет записи (1 байт). Данная последовательность приведена на рисунке ниже:

Диаграмма очистки одного сектора флеш-памяти 25L8005

Диаграмма очистки одного сектора флеш-памяти 25L8005

Именно это и делает приведённый ниже скетч:

Загрузим этот скетч в Arduino с подключённой по приведённой выше схеме микросхемой памяти. После того как он отработал, флешка готова к записи.

4 Запись данных в флеш-память с помощью Arduino

Теперь запишем на неё данные. Для примера возьмём небольшой массив из 16-ти байтов. Как видно из документации, для записи данных во флеш сначала нужно выставить разрешение на запись (1 байт), затем послать команду на запись (1 байт), передать начальный адрес (3 байта) и данные (в нашем примере 16 байт), а в конце выставить запрет записи (1 байт):

Диаграмма записи данных во флеш-память 25L8005

Диаграмма записи данных во флеш-память 25L8005

Напишем скетч, который записывает массив из 16-ти байт данных в ПЗУ :

Загрузим скетч в Arduino. Кстати, вот так выглядит на логическом анализаторе обмен по SPI между Arduino и ПЗУ 25L8005, когда выполняется данный скетч.

Временная диаграмма записи в ПЗУ массива данных по SPI

Временная диаграмма записи в ПЗУ массива данных по SPI

После выполнения данного скетча во флеш-память должен был записаться наш тестовый массив. Давайте проверим, так ли это.

4 Чтение данных из флеш-памяти с помощью Arduino

Согласно документации, чтение из флешки выполняется посредством такой последовательности: отправка команды на чтение (1 байт), начальный адрес (3 байта), а далее запрашивается столько байтов, сколько хотим прочитать из ПЗУ . Собственно, мы будем передавать в ПЗУ 16 нулей. Так как SPI – синхронный интерфейс, нам в ответ вернутся 16 записанных в ПЗУ байтов. Вот такая диаграмма приводится в описании к микросхеме:

Диаграмма чтения данных из флеш-памяти 25L8005

Диаграмма чтения данных из флеш-памяти 25L8005

Напишем скетч для чтения наших заветных 16-ти байт из микросхемы флеш-памяти 25L8005:

Загрузим скетч в Arduino и откроем монитор последовательных портов. В мониторе, как и ожидалось, 1 раз в секунду будет выводиться наш массив, считанный из флеш-памяти с помощью Arduino.

Чтение из флеш-памяти с помощью Arduino и вывод в монитор последовательных портов

Чтение из флеш-памяти с помощью Arduino и вывод в монитор последовательных портов

Временная диаграмма чтения данных из ПЗУ по SPI

Временная диаграмма чтения данных из ПЗУ по SPI

Как видно, байты этого массива соответствуют кодам ASCII строки "HELLO, SOLTAU.RU", которые мы и записали в микросхему памяти 25L8005 :-)

Похожие материалы (по тегу)

Последнее от aave

Другие материалы в этой категории:

11 комментарии

Спасибо, все понятно написано, благодаря вашей статье быстро разобрался!

Гриша, я рад, что смог вам помочь!

Доброго времени суток!
Подскажите, инструкция подходит для работы с W25Q64 ?
Пока в наличии нет (жду посылку), ищу инструкцию для работы с указанной flash памятью.
Буду благодарен за помощь!

Никита, доброго времени!
Я не изучал подробно вашу ПЗУшку W25Q64, но с первого взгляда она очень похожа на описываемую здесь. По крайней мере, подключение аналогично (если берём в том же корпусе), а на 21-ой странице datasheet приведён набор инструкций SPI, в котором команды чтения, записи, разрешения записи и некоторые другие аналогичны. Надо, конечно, ознакомиться внимательнее, но в целом ничего сложного тут нет. Действуйте согласно документации разработчика. Соберите схему и начните изучать работу с микросхемой с чтения регистров. Хорошие кандидаты для начала - регистры Device ID (0x90), JEDEC ID (0x9F). Если "пощупаете" их, прочитаете значения, которые должны там быть согласно документации, то станет понятно, что вы на верном пути, и это придаст уверенности в дальнейшем изучении.

Большое спасибо за ответ!

Доброго времени суток! Прочитал и отработал ваши примеры в данной статье на микросхеме флэш памяти W25Q32FV. Спасибо за материал. Всё работает нормально. Начал экспериментировать с кодом.

В вашем примере адрес передается тремя байтами ADDR1, ADDR2, ADDR3. Разобрался по даташиту со структурой памяти W25Q32FV но всё равно возникли вопросы.

Как записать данные в другой адрес отличного от примера? То есть, как записать и как разбить, например адрес типа 8192 (0x2000h) начального байта сектора 2, на три байта и приписать их переменным ADDR1, ADDR2, ADDR3 . Пробовал по разному. У меня получилось только побитовой передачей в цикле for.

ПРИМЕР:
const byte ADDR[24] = ; //24-битный адрес 0x2000h в двоичном виде и в массиве
for(byte b=0; b = 24; b++) //предаём 24-битный адрес побитно, вставлял его вместо ADDR1. ADDR3

И ещё вопрос не по теме:
В ардуино к сожалению не работает оператор round с указанием количества знаков после запятой.
То есть, выражение:
float number = 1,674938;
float VOLT = round(number,2); //округление до двух знаков после запятой.
НЕ РАБОТАЕТ. Оператор "round" в ардуино умеет округлять только до целых чисел.

Работает следующий вариант:
float number = 1,674938;
int NUM = round(number * 100); //умножаем на 100 и округляем до целых чисел. Получаем 167.
float VOLT = float(NUM / 100); //167 делим на 100 и получаем 1.67

Это я проверял. Это правда или я что-то не так делаю?

Сергей, что касается записи ПЗУшек, то в двух словах, ADDR1. ADDR3 - это 24-разрядный адрес, который следует читать как одно большое число. Например, адрес 8192 будет записываться как 0x002000 - теми же 24-мя битами (3 байта). Судя по тому, что я вижу в даташите, в вашем случае адрес передаётся аналогично - 3-мя байтами. Адресное пространство ПЗУшки состоит из 64-х блоков по 64 кб, т.е. в каждом блоке адреса с 0x000000 по 0x00ffff.

А что касается округления чисел. В штатной библиотеке ардуино функция round() умеет округлять только до целого числа, так и есть. Ваш вариант с умножением и потом делением рабочий. Можно ещё вот так сделать:

double p = 3.14159265359;

void setup()
Serial.begin(9600);
Serial.println(p, 10); // выводим с точностью до 10 знаков
Serial.println(roundTo(p, 2), 10); // округляем до 2-х знаков и выводим 10 после запятой
Serial.println(roundTo(p, 3), 10); // округляем до 3-х и выводим 10
Serial.println(roundTo(p, 4), 10); // округляем до 4-х и выводим 10
>

double roundTo(double value, int decimal)
double pwr = pow(10, decimal);
return (round(value * pwr) / pwr);
>

Вывод данного скетча будет:
3.1415927410
3.1400003433
3.1420006752
3.1416006088
Если обратите внимание, даже вывод числа с такой большой точностью в первой строчке уже некорректен. Микроконтроллер не очень дружит с точной математикой.

Микросхемы памяти серий 24хх (EEPROM), 25хх (Serial Flash) широко используются в электронике. Такие чипы присутствуют в составе практически любой конструкции современной бытовой и промышленной аппаратуры, где есть процессоры и/или микроконтроллеры. Данный программатор имеет возможность работы с обоими типами памяти.




В комплект поставки входят сам программатор и переходная плата с двумя посадочными местами под микросхемы памяти в SOIC корпусе.


Они дублируют имеющиеся на нижней стороне платы программатора, и если на плату программатора микросхемы памяти нужно обязательно припаивать, на переходнике можно попробовать прижать микросхему прищепкой или держателем для бумаг.


Так-же на переходнике есть посадочное место для разьема PLD-8 (в комплект не входит, я впаял 2хPLS-4), предназначенного для подключения прищепки или шлейфа программирования.


Аппаратная часть (Hardware).

Программатор выполнен на базе микроконтроллера «USB Bus Convert Chip» серии CH341A. Он рассчитан на физическое подключение к порту USB 2.0 компьютера, при подключении через хаб-удлиннитель программатор у меня работал с ошибками (может у меня хаб такой). Модуль программирования памяти собран на плате размерами 63х27мм (без учета USB разьема, с разьемом 84х27мм) из черного стеклотекстолита.


В распоряжении автора есть два экземпляра этого программатора, приобретенные в разное время, визуально их можно отличить по названию, один (более ранний) называется "CH341A Mini Programmer", второй "CH341A MinProgramment". Схемы одинаковые, различаются только цветом светодиода "RUN". На первом зеленый, на втором желтый.
Некоторые схемные обозначения на конкретном программаторе могут немного отличаться, например самовосстанавливающийся предохранитель F1 (fuse) может обозначаться как R1. В инете встречались упоминания, что в эту позицию иногда ставят резистор нулевого сопротивления т.е. перемычку. У меня как и положено на обоих стоят предохранители

400mA, сопротивление 0,92Ом, маркировка на корпусе «5». Также на плате часто отсутствует схемное обозначение резисторной сборки PR1. Более грамотное обозначение схемных элементов программатора можно посмотреть на изображении верхней стороны платы от магазина WAVGAT (на AliExpress):


Особых отличий от даташита схема не имеет, разве что на блокировочных конденсаторах по питанию сильно экономили. Питание 5V от USB подается на вывод 28, на выходе 9 внутреннего стабилизатора блокировочный конденсатор.


Т.к. на выводах ввода/вывода напряжение соответствует 5V уровням, в основном это устройство на 5V, правда в инете много упоминаний и о программировании им микросхем на 3.3V без каких либо ошибок и отрицательных последствий. Выход отдельного стабилизатора AMS1117-3.3 в схеме не задействован и просто выведен на выходной ZIF разьем и на контакт боковой гребенки SPI.
В даташите указан способ сделать уровни на выходах совместимыми с 3.3V. Для этого необходимо соединить выводы 28 и 9 и подать на них 3.3V, при этом внутренний стабилизатор просто не используется. Но при этом 3.3V уровни также будут на на переходнике USB <-> RS232, что иногда не приемлемо. Также на Ali сушествует другая версия этого программатора, скомпонованная немного по другому и выполненая на зеленом текстолите. Читал, что там на вывод 28 подается 3.3V от внешнего стабилизатора, но выводы 28 и 9 не соединены, и это нормально работает. В любом случае, уровни на переходнике USB <-> RS232 и здесь будут 3.3V.
Если планируется программирование флешек 1.8V через основной разьем необходимо дополнительно приобрести модуль 1.8V-adapter. Бонусом является то, что переделать его для поддержки и уровней 3.3V несложно, надо лишь закоротить вход/выход стабилизатора 1.8V дополнительным джампером.


Теперь при наличии джампера адаптер работает с логическими уровнями 3.3V, при отсутствии — 1.8V.
Минус тут в том, что стоимость адаптера не намного меньше, чем самого программатора. Но если он уже есть, почему бы его не использовать по полной?

Если для программирования будет использована боковая гребенка SPI, можно поступить проще. На Ali много предложений 4-канального двунаправленного преобразователя уровней на МОП транзисторах за очень небольшие деньги.


Работа этого преобразователя подробно описана в статье "Согласование логических уровней 5В и 3.3В устройств". Схема отличается от рассмотренной в статье только номиналами резисторов (сопротивление меньше — увеличено быстродействие и энергопотребление). За счет добавления дополнительных джампера J1 и двух кремниевых диодов, можно будет программировать как 3.3V, так и 1.8V флешки.


Программная часть (Software), драйвер.

Перед применением программатора необходимо инсталировать в Windows его драйвер(а), легко находятся в инете, я брал из архива программы AsProgrammer. Программатор поддерживает два режима, они переключаются аппаратно джампером J1. Применен интересный прием, при переключении джампера у чипа меняется Device ID на шине USB. Это вынуждает Windows найти подходящий по VID/PID драйвер и подключить его.
При джампере в положении «1-2» по VID_1A86&PID_5512 подгружается драйвер "USB-EPP/I2C… CH341A". Он создает в диспетчере устройств раздел "Interface" в который и устанавливается.


В этом случае чтение, верификация, запись чипов памяти должны осуществляться непосредственно через ZIF-панель программатора CH341A или через боковой разьем Р2 с интерфейсом SPI.

При джампере в положении «2-3» по VID_1A86&PID_5523 подгружается драйвер "USB-SERIAL CH341A". В диспетчере устройств найти его можно в разделе "Порты (COM и LPT)". Там же можно посмотреть и номер присвоенного СОМ порта.


При этом программирование может производиться только через интерфейс RS232 TTL на разьеме Р1 (там же где и джампер), если целевое устройство поддерживает такой способ (встроенный загрузчик или монитор).

Программная часть (Software), программа прошивальщик.


Программа не требует установки, включает в архив драйверы для обоих режимов программирования СН341А.
Log-файл работы программы с флешкой W25Q128FW, 16Мб, 1.8V через "1.8V-adapter":


Используется программатор: CH341
Sreg: 00000000(0x00), 00000010(0x02), 01100000(0x60)

Используется программатор: CH341
Читаю флэшку…
Готово
Время выполнения: 0:02:49

Используется программатор: CH341
Стираю флэшку…
Готово
Время выполнения: 0:01:03

Используется программатор: CH341
Записываю флэшку с проверкой…
Готово
Время выполнения: 0:24:45

5 вариантов BIOS) ни одного сбоя или ошибки.

Линуксоидам использовать стороннюю программу нет необходимости, стандартный прошивальщик Flashrom полностью поддерживает данный программатор (должен быть собран с поддержкой ключа "-ch341a").

WARNING: If the /WP or /HOLD pins are tied directly to the power supply or ground during standard SPI or Dual SPI operation, the QE bit should never be set to a 1.


Как по мне, проще сделать это на переходнике 1.8V-adapter, если задействовать его вторую незанятую половину разьема. Тем более при применении адаптера переделка на плате программатора становится бесполезной, порты у трансмиттера используются как однонаправленные.

Доработка 2. Увеличение кол-ва блокировочных конденсаторов по питанию.

Участник сообщества «AlexX1810» предложил добавить на плату программатора три блокировочных конденсатора 0.1 мкФ. По его словам улучшается стабильность работы программатора.
Если ориентироваться по схеме, первый конденсатор между 6-7 контактами разьема Р1 (5V), второй между 5-6 контактами разьема Р2 (3.3V), третий между 15-16 контактами ZIF панельки (7-8 контакты разьема I2C, 3.3V). Все впаяны со стороны контактов.


У меня во время использования программатора сбоев не было, но хуже во всяком случае не будет.

Читайте также: