Для прошивки Flash-памяти BIOS материнских плат, винчестеров, а также своих любительских конструкций мне потребовался программатор. Любимый PonyProg поддерживает только до 256кбит, кроме того LPT-порт теперь редкость, поискав по Интернету, нашел довольно простой USB-вариант "BlackcatUSB". Программатор предназначен для чтения/записи SPI-Flash чипов памяти объемом от 1 Мбита и выше (т.е. более 128кбайт) популярных серий 25ххх, 26ххх. По протоколу JTAG (требуется перепрошивка) CFI-Flash чипов - 25ххх, 28ххх, 29ххх, 39ххх, 49ххх, 58ххх, а так же K8D17ххх, K8D32ххх.

Его основой является микроконтроллер AT90USB162, имеющий USB-загрузчик, поэтому первоначальная его прошивка и обновление ПО производится по шине USB. Для перепрошивки не требуется дополнительных программ - это можно сделать прямо из его собственной программы. ПО распространяется свободно, более того. разработчики предоставляют файлы прошивок и исходники программы. Поддерживается система скриптов для добавления новых алгоритмов. Можно вручную выбирать все параметры работы с неизвестной памятью. Программа не требует установки, просто запускаем и работаем.

Внешний вид фабричного варианта

На оригинальной плате имеются перемычки для выбора напряжения SPI - 3,3V / 5V, кнопка сброса и переключатели выбора режима загрузки: обычный / загрузчик. В повседневной работе сброс и перепрошивка программатора крайне редко требуются, поэтому для клона кнопка и переключатели были исключены. Вместо 10-штырькового разъема установлен DIP-сокет, а разъем USB выполнен продолжением печатной платы:

Чтобы "разъем USB" не болтался в гнезде, он должен быть толщиной 2,5мм, Мне удалось найти кусочек текстолита такой толщины, а для платы в 1,5мм придется приклеивать "подкладку" 1мм. Она должна быть обязательно неметаллической - на случай случайной вставки в разъем "вверх ногами".


Схема программатора

При установке перемычки J1 в положение 1-2 питание микроконтроллера осуществляется от линии 5V USB, при установке 2-3 - от внутреннего стабилизатора 3,3V. Внимательно смотрите даташит памяти перед выбором напряжения программирования - большинство трехвольтовых чипов выйдут из строя при питании от 5V.

Собранный без ошибок клон сразу определится системой как AT90USB162 в режиме DFU. Запускаем оболочку BlackcatUSB и убеждаемся в этом:

Если микроконтроллер не "чистый", то принудительно переводим его в режим загрузчика:

  1. замыкаем на корпус контакт RESET
  2. замыкаем на корпус контакт BOOT
  3. отпускаем RESET
  4. отпускаем BOOT

Важно, чтобы BOOT был отпущен чуть позже, чем RESET. Далее переходим во вкладку AVR Firmware, выбираем файл прошивки BCUSB.1.09.SPI.hex и кнопкой "Program" запускаем процесс прошивки:

По окончании процесса (пара секунд), жмем "Start Application". Программатор определится системой и потребует драйвер - находим его в папке Drivers. После его установки видим готовый к работе программатор:

Теперь можно проверить его в работе.

ВАЖНО! Если горит (или мигает) светодиод режима, то вставлять и вынимать память из сокета нельзя - он под напряжением, это может испортить информацию!

Поэтому просто вынимаем клон из разъема USB, вставляем память в сокет и пробуем:

Память определилась и появилась вкладка SPI Flash, на которой можно ее прочесть и записать:

P.S. Программатор "BlackcatUSB" на сегодняшний момент не поддерживается разработчиком - вместо него выпускается обновленная версия "FlashcatUSB":

Из "железных" обновлений только замена мк на более емкий вариант - ATmega32U2. В программной части обновлений больше - поддержка большей номенклатуры чипов, в том числе NAND. Новые версии программы доступны на сайте разработчика. Новые прошивки NAND (FCUSB.1.07.NAND.hex) и JTAG (FCUSB.7.05.EJTAG_16K.hex) подходят и для нашего клона - во всяком случае запускаются и определяются, функционал не проверял - просто не на чем.

Программатор микросхем BIOS для материнских плат, ноутбуков, DVD, видеокарт и т.д. 24 EEPROM и 25 SPI FLASH на CH341A через USB

USB мини программатор CH341A используется для программирования микросхем BIOS для материнских плат компьютеров, ноутбуков, видеокарт, мультимедийных плееров, памяти телевизоров, ЖК-дисплеев, маршрутизаторов, игровых приставок, спутниковых ресиверов, ресиверов T2, 24 EEPROM, 25 SPI FLASH и т.п. Программатор по размеру немного больше флэшки и собран на микросхеме USB bus convert chip CH341A.

Джампер P/S служит переключателем режима работы микросхемы CH341A как конветрер USB > Параллельный Порт (Paralel) или USB > Последовательный Порт (Serial). С программатором используется программное обеспечение которому необходимо, чтобы CH341A работала как конвертер USB > Параллельный Порт (Parallel), следовательно джампер должен быть установлен и контакты замкнуты.

Программатор на CH341A имеет драйвера и программное обеспечение для операционных систем Windows 98, Windows ME, Windows 2000, Windows XP, Windows Vista и Windows 7.

Установка драйвера . Для начала использования программатора нужно сначала подключить его к USB порту компьютера, можно даже без установленного чипа в колодке. Если программатор рабочий и с USB разъёмом компьютера всё в порядке, то на корпусе программатора должен загореться светодиод, сигнализирующий о поступлении питания, и Ваш компьютер издаст звук, оповещающий Вас, что вставлено новое USB устройство. После этого операционная система должна начать поиск драйверов и в результате их скорее всего НЕ обнаружит. Ничего страшного в этом нет. Установка драйвера программатора такая же, как у любого USB девайса. Сделаем всё сами, как говорится "вручную". Жмём сочетание клавиши Win + Pause, или просто открываем Диспетчер Устройств. В списке устройств для неизвестного устройства указываем путь к драйверу (заранее распакуйте их из архива, который можно скачать ниже на странице), это должен быть файл ch341wdm.inf . Второй способ установки драйвера - это просто запустить файл ch341par.exe с правами администратора и драйвер установится сам. Если драйвер установлен верно, то можно переходить к программированию чипов.

Установка чипа в программатор . Обязательно! Вытаскиваем программатор из USB разъёма компьютера. Если вы будете программировать микросхему на ZIF панели программатора, то нужно поднять ручку-фиксатор, чтобы открыть пазы для установки микросхемы. Необходимо отсоединить чип, который собираетесь программировать, от конечного устройства (снять с материнской платы, выпаять из ноутбука или т.п.), и установить чип согласно ключа в пазы программатора (расположение ключа должно совпадать с маркировкой около сокета на программаторе, где написано 25xx или 24xx). Потом следует опустить ручку-фиксатор, чтобы зафиксировать чип в колодке. Если нужно программировать микросхемы 25 серии в корпусе SOP8 или SOP16, то на плате программатора есть по одной контактной площадке под эти типы корпусов. Соединить микросхему с контактной площадкой можно как с помощью пайки, так и с помощью аккуратного закрепления ножек микросхемы механическим путем (прижать пластмассовым крокодилом или прищепкой). Когда чип установлен, подключаем программатор с чипом на борту опять к компьютеру в USB порт и запускаем программу CH341A.exe . Слышим звук подключения USB устройства и радуемся успешно выполненому первому шагу.

Как программировать чипы . Вот тут начинается самое интересное. Описывать работу с программой я не буду, а порекомендую просмотреть несколько видеоинструкций по работе с данными программаторами. Видеоинструкции можете просмотреть ниже на этой странице.

Примечание 1: Программатор прошивает чипы вполне шустро, но некоторые типы микросхем немного медленно. Всё зависит от объёма чипа и его типа.

Схема программатора:

Для примера, вот только некоторые типы поддерживаемых микросхем:

  • ATMEL
    AT25DF041A, AT25DF321, AT25F004, AT25F512A, AT25F2048, AT25F4096, AT25F1024A, AT25FS010, AT25FS040, AT26DF081A, AT26DF161A, AT26DF321, AT26F004
  • EON
    EN25B05, EN25P05, EN25B10, EN25P10, EN25BF20, EN25P20, EN25F20, EN25B40, EN25P40, EN25F40, EN25B80, EN25P80, EN25F80, EN25T80, EN25B16, EN25P16, EN25B32, EN25P32, EN25B64, EN25P64
  • Excel Semiconductor Inc
    ES25P10, ES25P20, ES25P40, ES25P80, ES25P16, ES25P32
  • ST
    M25P05A, M25P10A, M25P20, M25P40, M25P80, M25P16, M25P32, M25P64, M25PE10, M25PE20, M25PE40, M25PE80, M25PE16, M25PE32, M45PE10, M45PE20, M45PE40, M45PE80, M45PE16, M45PE32
  • MXIC
    MX25L512, MX25L1005, MX25L2005, MX25L4005, MX25L8005, MX25L1605, MX25L3205, MX25L6405, MX25L6445, MX25L6405(SOP16)
  • NexFlash
    NX25P80, NX25P16, NX25P32
  • Chingis Technology Corporation
    Pm25LV512, Pm25LV010, Pm25LV020, Pm25LV040, Pm25LV080, Pm25LV016, Pm25LV032, Pm25LV064
  • Saifun Semiconductors
    SA25F005, SA25F010, SA25F020, SA25F040, SA25F080, SA25F160, SA25F320
  • WINBOND
    W25P10, W25X10, W25Q10, W25P20, W25X20, W25Q20, W25P40, W25X40, W25Q40, W25P80, W25X80, W25Q80, W25P16, W25X16, W25Q16, W25P32, W25X32, W25Q32, W25P64, W25X64,W25Q64

И другие. Более полный список смотрите на этом фото .

Примечание 2: Из личной практики, даже если необходимой вам микросхемы нет в списке прошиваемых, или программа не может автоматически правильно определить тип вашей микросхемы, то можно вручную выбрать подобную с тем же объёмом памяти и попробовать прошить. Обычно получается в 99% случаев.

Примечание 3: Среди самых частых поломок программатора обычно встречается "вылет" стабилизатора по питанию 3.3V (обычно, маленькая микросхемка 1117 серии). При этом программатор перестаёт определять вставленные в сокет микросхемы и процесс записи/чтения длится почти вечность. Стабилизатор сгорает в случае ошибочной установки микросхем в сокет не соблюдая полярность, а также при установке дефектных микросхем. Для восстановления работоспособности программатора необходимо заменить микросхемку стабилизатора питания.

Для работы с планарными (SMD) микросхемами Вам могут понадобиться адаптеры (переходники) TSU-D08/SO08-150 для 24xx и 93xx чипов или DIP08/SO08-208 для 25xx чипов:

Переходник-прищепка для прошивки чипов БЕЗ ВЫПАИВАНИЯ. C данным программатором очень удобно использовать переходник-прищепку для прошивки микросхем BIOS БЕЗ ВЫПАИВАНИЯ. Очень удобно использовать переходник в том случае, когда нет возможности аккуратно выпаять микросхему не повредив соседние детали и разъемы на плате. Однако в некоторых случаях цепи питания микросхемы, разведенные на плате вашего оборудования, мешают и программатор невсиле запитать микросхемы. В этом случае процесс прошивки без выпаивания микросхемы невозможен.

Заказать программатор можно у нас в магазине с доставкой по Украине. Срок доставки в ваш город 2-3 дня. Отправка в день оплаты. Стоимость программатора и комплектация указана в таблице. Оплата на карту ПриватБанка или WebMoney (WMZ). Как смотрите в конце данной страницы.

Прайс-лист на программаторы:

Наименование, фото

Комплектация

Прайс-лист на аксессуары:

Наименование, фото

Комплектация

Вы можете также просмотреть видеоинструкции по программаторам данной серии:

Программное обеспечение для программатора:
  • Драйвер программатора: CH341PAR_drivers.rar
  • Драйвер RS232 порта:
Во время очередной уборки был случайно выключен удлинитель, к которому были подключены работающие системный блок и монитор. Системный блок состоит из:
  • материнская плата - ASRock B75 Pro 3
  • процессор - Intel Core i5-3570
  • блок питания - Corsair CX750M
После включения системник начал издавать пять противных писков, что вроде как соответствует неисправности процессора. Процессор, судя по Яндекс.Маркету, на данный момент стоит от 11000 руб. Покупать довольно накладно, а недорогой, но слабенький не хочется. В общем, немного испугался…

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

В первую очередь подключил другой старенький БП - комп не запускается.

Для дальнейших проверок принес домой автомобильный комп. Состав:

  • материнская плата - ASRock B75M-ITX
  • процессор - Intel Pentium G640T
Как хорошо, что компоненты оказались взаимозаменяемыми.

Вытащил из автомобильного компа процессор, вставил его в домашний - комп не запускается. Но появилась надежда, что процессор все таки цел, а неисправна материнка, которая немного дешевле (хотя новые на чипсетах не H61 и H67 - дефицит).

Собственно, программирование

Хорошо, что микросхема BIOS не впаяна, а на обычной панельке DIP-8. Программатора у меня нет, заказывать в Китае и ждать месяц - не выход. Решил сделать программатор из ноутбука жены и имеющейся в наличии Arduino Nano. Покопался в интернете… Везде в основном прошивка заливается через COM-порт, я же решил прошивать с карты памяти (так вроде гораздо быстрее).

Набросал схему подключения:

Собрал все на макетной плате:

Тип и объем карты памяти, способ ее форматирования, имя файла должны соответствовать требованиям библиотеки SD Arduino.

Для начала набросал скетч, который считывает содержимое SPI Flash и записывает его в файл на карту памяти, попутно вычисляя контрольную сумму по методу Checksum-32, т.е. простым суммированием.

ReadFlash_WriteSD.ino

#include #define Flash_CS 9 #define SD_CS 10 #define FILENAME "BIOS.ROM" File myFile; SPIFlash flash(Flash_CS); void setup() { Serial.begin(115200); while (!Serial) {} // Ждем подключения последовательного порта // Инициализация SD-карты Serial.println("Initializing SD card..."); if (!SD.begin(SD_CS)) { Serial.println("Initialization SD card failed!"); return; } Serial.println("Initialization done."); // Удаляем старый файл, если есть Serial.print(FILENAME); if (SD.exists(FILENAME)) { Serial.println(" exists, removing..."); SD.remove(FILENAME); } else { Serial.println(" doesn"t exist."); } // Создаем файл и открываем его для записи Serial.print("Creating "); Serial.print(FILENAME); Serial.println("..."); myFile = SD.open(FILENAME, FILE_WRITE); // Если удалось создать и открыть файл - будем записывать в него if (myFile) { // Инициализация SPI Flash Serial.println("Initializing SPI Flash..."); flash.begin(); // Читаем/записываем блоками/страницами по 256 байт uint8_t data_buffer; // Количество страниц uint32_t maxPage = flash.getMaxPage(); // Checksum (32 bit) uint32_t checkSum = 0; for (int page = 0; page < maxPage; page++) { // Выводим прогресс работы if ((page % 1000) == 0) { Serial.print(page + 1); Serial.print("/"); Serial.println(maxPage); } // Читаем страницу SPI Flash flash.readByteArray(page, 0, &data_buffer, 256); // Записываем блок в файл на карте памяти myFile.write(data_buffer, 256); // Обновляем контрольную сумму for (int i = 0; i < 256; i++) { checkSum += data_buffer[i]; } } // Закрываем файл на карте памяти myFile.close(); // Выводим контрольную сумму Serial.print("Checksum-32: 0x"); Serial.println(checkSum, HEX); Serial.println("Done."); } else { // Если файл не создался, то выводим сообщение об ошибке Serial.println("Error creating "); Serial.println(FILENAME); } } void loop() { // Пустой цикл }


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

ReadSD_WriteFlash.ino

/* Подключение SPI-Flash: CS - D9 MOSI - D11 MISO - D12 CLK - D13 Подключение SD-Card Shield: CS - D10 MOSI - D11 MISO - D12 CLK - D13 */ #include #include #define Flash_CS 9 #define SD_CS 10 #define FILENAME "B75PRO31.90" File myFile; SPIFlash flash(Flash_CS); void setup() { Serial.begin(115200); while (!Serial) {} // Ждем подключения последовательного порта // Инициализация SD-карты Serial.println("Initializing SD card..."); if (!SD.begin(SD_CS)) { Serial.println("Initialization SD card failed!"); return; } Serial.println("Initialization done."); if (!SD.exists(FILENAME)) { Serial.print(FILENAME); Serial.println(" doesn"t exist."); return; } // Открываем файл для чтения Serial.print("Opening "); Serial.print(FILENAME); Serial.println("..."); myFile = SD.open(FILENAME, FILE_READ); // Если удалось открыть файл - будем читать из него if (myFile) { Serial.print("File "); Serial.print(FILENAME); Serial.println(" is open."); // Инициализация SPI Flash Serial.println("Initializing SPI Flash..."); flash.begin(); // Стираем чип if (flash.eraseChip()) { Serial.println("Chip erased."); } else { Serial.println("Error erasing chip."); return; } // Читаем/записываем блоками/страницами по 256 байт uint8_t data_buffer; // Количество страниц uint32_t maxPage = flash.getMaxPage(); // Checksum (32 bit) uint32_t checkSum = 0; for (int page = 0; page < maxPage; page++) { // Выводим прогресс работы if ((page % 1000) == 0) { Serial.print(page + 1); Serial.print("/"); Serial.println(maxPage); } // Читаем блок с карты памяти myFile.read(data_buffer, 256); // Записываем блок в страницу SPI Flash flash.writeByteArray(page, 0, &data_buffer, 256); // Обновляем контрольную сумму for (int i = 0; i < 256; i++) { checkSum += data_buffer[i]; } } // Закрываем файл на карте памяти myFile.close(); // Выводим контрольную сумму Serial.print("Checksum-32: 0x"); Serial.println(checkSum, HEX); Serial.println("Done."); } else { // Если файл не открылся - выводим сообщение об ошибке Serial.print("Error opening "); Serial.println(FILENAME); } } void loop() { // Пустой цикл }


Запустил, подождал, скетч вывел контрольную сумму, она совпала с контрольной суммой оригинального файла. Но это контрольная сумма файла на карте памяти, мне же нужна контрольная сумма содержимого SPI Flash.

Можно было использовать первый скетч, но написал третий, который только считает контрольную сумму содержимого SPI Flash по тому же алгоритму.

ChecksumFlash.ino

/* Подключение SPI-Flash: CS - D9 MOSI - D11 MISO - D12 CLK - D13 */ #include #define Flash_CS 9 SPIFlash flash(Flash_CS); void setup() { Serial.begin(115200); while (!Serial) {} // Ждем подключения последовательного порта // Этот код нужен, чтобы не мешалась SD-карта pinMode(10, OUTPUT); digitalWrite(10, HIGH); // Инициализация SPI Flash Serial.println("Initializing SPI Flash..."); flash.begin(); // Читаем страницами по 256 байт uint8_t data_buffer; // Количество страниц uint32_t maxPage = flash.getMaxPage(); // Checksum (32 bit) uint32_t checkSum = 0; for (int page = 0; page < maxPage; page++) { // Выводим прогресс работы if ((page % 1000) == 0) { Serial.print(page + 1); Serial.print("/"); Serial.println(maxPage); } // Читаем страницу SPI Flash flash.readByteArray(page, 0, &data_buffer, 256); // Обновляем контрольную сумму for (int i = 0; i < 256; i++) { checkSum += data_buffer[i]; } } // Выводим контрольную сумму Serial.print("Checksum-32: 0x"); Serial.println(checkSum, HEX); Serial.println("Done."); } void loop() { // Пустой цикл }


Контрольная сумма SPI Flash совпала с контрольной суммой оригинального файла.

После вставки прошитой микросхемы BIOS в домашний комп - он благополучно заработал.

В среде Arduino IDE необходимо установить библиотеку SPIFlash через управление библиотеками.

Контрольную сумму вычислял с помощью HEX-редактора HxD.

PS: Первоначально в качестве SD-модуля использовал вот такой:

Но с ним были частые глюки, не инициализировалась SD-карта. Помогало «горячее» переподключение самой SD-карты при подключенной к компу Arduino.

PPS: Вместо резисторов пробовал подключить двунаправленный конвертер сигналов:

Но с ним схема не заработала.

Микросхемы флеш-памяти 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.

Если прошла запись и не выдало сообщение об ошибке, значит альтернативная прошивка благополучно прошита в USBasp. Теперь USBasp может не только шить AVR-микроконтроллеры, как раньше, но еще и работать с флеш-памятью. Размыкаем контакты J2, что бы USBasp снова перешел в режим программатора.

Теперь проверим, видит ли 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: