FT2232H - программатор SPI FLASH памяти.

 

 

    Появилась необходимость запрограммировать NOR SPI flash, и при этом хотелось как можно проще

без приобретения дорогостоящего программатора.

Под рукой оказалась FT2232H, у которой как раз есть SPI интерфейс.

Встал вопрос, каким софтом программировать? Так как FT2232H достаточна известна, то пришла идея

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

вариантов, но все они тем или иным не устраивали...

Было решено, что проще создать свою утилиту, под свои требования.

 

 

Требования.

 

0. Программатор на основе FT2232H (USB-to-SPI).

1. Работа под ос Windows и Linux.

2. Прикладной интерфейс - командная строка.

3. Простой способ добавления новых микросхем памяти в список поддерживаемых.

4. Функции: стирание, чтение, запись, проверка.

    Также выполнение операций по заданному смещению (чтение, запись).

5. Установка тактовой частоты SPI CLK.

 

 


Реализация.


    Программа написана на языке Си. Исходники программы находятся src.

Для сборки под Windows7 использовался компилятор - Microsoft VS2008, под Linux - GCC.

За основу проекта был взят пример от FTDI для работы с FT2323H в SPI режиме.


Версия под Windows.

    Для работы программы необходима библиотека libMPSSE.dll, которая должна располагаться в одной

директории вместе с программой.

Библиотеку libMPSSE.dll можно собрать из исходников которые находятся в архиве LibMPSSE-SPI_source.zip .

 

Версия под Linux.

    Для сборки утилиты используется make, Makefile прилагается.

Для добавления новой микросхемы памяти в программе необходимо добавить новый файл с описанием

функций в список сборки OBJ в Makefile.

 

ВНИМАНИЕ:

Перед тем как запускать утилиту необходимо ВЫгрузить следующие модули ftdi_sio и usbserial,

иначе утилита не получит доступ к FT2323H т.к. FT2232H будет уже занят данными модулями.

После того как USB кабель будет отключен и подключен заново к FTDI FT2232H,

ОС Linux загрузит модули ftdi_sio, usbserial заново !

 

Выгрузка осуществляется следующими командами:

sudo rmmod ftdi_sio

sudo rmmod usbserial

 

Запуск утилиты и команды по выгрузке модулей удобно разместить в скрипте.

Пример скрипта представлен в файле 1.sh .

 

 

 

Применение.


    Утилита работает в командной строке и принимает команды в виде аргументов командной строки.

При запуске утилиты без параметров в консоль выводится список доступных команд.

Пример:

 ================================================================================
FTx232x SPI FLASH MEMORY PROGRAMMATOR
================================================================================
----------------------------------------------------------------------------
- Prog for chip FTx232x. Read/Write file to SPI flash.----------------------
Parameters:
--chiplist - print all chips supported.
--channel - FT2232H channel, 0 or 1.
--chip <chipname> - set "name"chip.
--offset <offset> - set start address(format hex = 0x00000000 or dec).
--size <len> - set length(format hex = 0x00000000 or dec).
--read <file-name> - operation READ flash -> write to file.
--write <file-name> - operation file to -> WRITE flash.
--erase - erase flash(set --size & --offset).
--clk - set clk for spi (Hz)
--cmp <file-name> - compare FLASH & FILE, set --offset.
----------------------------------------------------------------------------

 

Описание параметров.

 

--chiplist

Выводит список поддерживаемых микросхем SPI FLASH памяти.

На текущий момент доступны следующие микросхемы: s25fl512s, m25p64, m25p128.

 

--channel <channel>

Установить номер канала, с которым работаем утилита. 0 - Channel A, 1 - Channel B.

Т.к. FT2232H в своем составе содержит 2 канала, то необходимо указать канал к которому

подключена микросхема памяти.

 

--chip <chipname>

Задает микросхему, с которой будет осуществляться работа.

 

--offset <offset>

Установка начального адреса (смещение от начала массива памяти), для операций чтения,

записи, стирания. Значение задается в формате HEX = 0x00000000 или DEC = 1234567890

 

--size <len>

Дополнительный параметр, задающий размер (длину), для операции чтение, стирания памяти.

Значение задается в формате HEX = 0x00000000 или DEC = 1234567890

 

--read <file-name>

Команда чтения массива из памяти в файл. Необходимо указать имя файла.

 

--write <file-name>

Команда записи файла в массив памяти. Необходимо указать имя файла с данными.

 

--erase

Команда стирания памяти. Дополнительно необходимо задать --size & --offset.

 

--clk <HZ>

Установка частоты SPI CLK в единицах герц. Т.е. Для SPI CLK = 5 MHz значение будет 5000000.

Для SPI CLK =100 KHz значение будет 100000.

 

--cmp <file-name>

Команда сравнения содержимого массива памяти с файлом на диске.

Необходимо установить значение начала размещения данных --offset.

 

 

 

 Примеры запуска утилиты.

 

Пример 1.

spi_flash --chip m25p128 --write 1.bin --clk 25000000 --channel 0

Память m25p128. Запись файла 1.bin, адрес начала 0, длинна = длинна файл 1.bin, канал A,

Частота SPI CLK = 25 MHz.

 

 

Пример 2.

spi_flash --chip m25p128 --offset 0 --read 2.raw --size 10283819 --channel 0 --clk 5000000

Память m25p128. Чтение массива памяти в файл 2.raw, адрес начала 0, длинна = 10283819 байт,

канал A, Частота SPI CLK = 5 MHz.

 

 

Пример 3.

spi_flash --chip s25fl512s --read 1.bin --offset 0 --size 28857503 --clk 25000000

Память s25fl512s. Чтение памяти в файл 1.bin, адрес начала 0, длинна 28857503,

частота SPI CLK = 25 MHz.

 

 

Пример 4.

spi_flash --chip s25fl512s --cmp 1.tar.gz --offset 0 --clk 25000000

Память s25fl512s. Сравнение памяти с файлом 1.tar.gz, адрес начала 0, длинна = длине файла 1.tar.gz,

частота SPI CLK = 25 MHz.


 

 

Схема подключения микросхемы памяти к FT2232H.

 


    Согласно даташиту только следующие выводы могут быть использованы как интерфейс SPI:

 

 

Channel A:

16 - ADBUS0 - SPI CLK.

17 - ADBUS1 - SPI MOSI.

18 - ADBUS2 - SPI MISO.

19 - ADBUS3 - SPI CS.

 

Channel B:

38 - BDBUS0 - SPI CLK.

39 - BDBUS1 - SPI MOSI.

40 - BDBUS2 - SPI MISO.

41 - BDBUS3 - SPI CS.

 

 

    Микросхема памяти размещается на макетной плате и подключается к FT2232H по кабелю.

Распиновка разъема макетной платы одна для всех макеток.

Распиновка задается устройством, в котором потом будет работать память.

Это позволяет свободно подключать разные микросхемы для программирования к FT2232H и затем

переносить и подключать в конечное устройство для экспериментов.

 

 
    Такое подключение не является идеальным, вносит искажение и нарушает целостность сигналов

на линиях данных (порождая звон), особенно это заметно на скоростях более 10 MHz.

    Для устранения паразитных эффектов на стороне памяти устанавливаются блокирующие

конденсаторы (по питанию), резисторы, включенные последовательно с линиями сигналов SPI

интерфейса(20-100 Ом),  а также подтягивающие резисторы(4-10к).

 


 

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

 

    Каждая новая микросхема памяти должна располагаться в своем файле, название файла задается,

но наименованию микросхемы.


    Для описания свойств микросхемы памяти используется следующая структура (файл memory.h):

struct mem_chip_st
{
char name[ NAME_SIZE ];
uint32 density;
uint32 sector_erase_size;
uint32 prog_buf_size;
FT_STATUS (*id_read)( FT_HANDLE ftHandle );
FT_STATUS (*read)(FT_HANDLE ftHandle, const uint32 adr_start, uint8 *buf, const uint32 len, uint32 * sizeTransfered);
FT_STATUS (*write)(FT_HANDLE ftHandle, const uint32 adr_start, uint8 *buf, const uint32 prog_buf_size, uint32 * sizeTransfered);
FT_STATUS (*erase)(FT_HANDLE ftHandle, const uint32 adr_sec);
FT_STATUS (*wren)(FT_HANDLE ftHandle);
FT_STATUS (*wrdi)(FT_HANDLE ftHandle);
int (*get_status)(FT_HANDLE ftHandle);
};

 

    В struct mem_chip_st описываются параметры и подпрограммы, реализующие специфику

работы с данной микросхемой.

 

Расшифровка полей структуры:

 

name

Наименование микросхемы, то как она будет числиться в

списке поддерживаемых утилитой.

density

Размер микросхемы памяти в байтах.

sector_erase_size

Минимальный размер стираемой области, размер задается в

байтах.

prog_buf_size

Размер внутреннего буфера микросхемы (буфер записи).

(*id_read)

Указатель на функцию чтения ID микросхемы. В функции

производится проверка на совпадение ID.

(*read)

Указатель на функцию чтения массива из памяти.

(*write)

Указатель на функцию записи массива в память.

(*erase)

Указатель на функцию стирания массива памяти.

(*wren) 

Указатель на функцию установки разрешения записи.

(*wrdi) 

Указатель на функцию установки запрета на запись.

(*get_status) 

Указатель на функцию чтения статуса микросхемы памяти.

 

 Примеры реализации можно посмотреть в файлах:

m25p128.cm25p128.hm25p64.cm25p64.hs25fl512s.cs25fl512s.h

 

 

Ускорение обмена по шине FTDI SPI (удаление задержки в 2 ms).

 

Наткнулся на статью РЕАЛИЗАЦИЯ SPI С ПОМОЩЬЮ МИКРОСХЕМ ФИРМЫ FTDI в которой автор рассказывает о том,

что библиотека libMPSSE.dll содержит следующею особенность в работе.

Перед тем как поднять SPI CS делает задержку в 2 мс frown, цитирую:

В оригинальной библиотеке в режиме SPI после того, как закончилась передача данных и деактивируется сигнал выбора ведомого CS, присутствует задержка около 2 мс. Это сделано разработчиками библиотеки libMPSSE.dll намеренно для исключения возможных проблем при сопряжении с медленными устройствами.

 

Подробности в статье FTDI FT2232H Ускорение обмена по SPI (удаление задержки в 2 ms).