Flash Programmer для Serial Flash Micron M25Pxx Печать
Добавил(а) microsin   

Для поддержки программирования микросхем последовательной памяти Micron серии M25P мною был написан драйвер Flash Programmer для среды IDE VisualDSP++ [1].

За основу был взят драйвер для микросхем Serial Flash M25P16 для компании Micron, исходный код которого поставлялся вместе с VisualDSP++ 5.0 (находится в каталоге Blackfin\lib\src\drivers\flash\M25P16\). Что изменено по сравнению с оригинальной версией:

1. Кроме M25P16, также поддерживаются микросхемы Serial Flash M25P80, M25P32, M25P64, M25P128. Количество секторов и их размер определяются не константами, а вычисляются на основе идентификатора UID, прочитанного из регистра микросхемы.

Микросхема UID Количество секторов Емкость
M25P80 14h 2 сектора по 32 килобайта 1 мегабайт
M25P16 15h 32 сектора по 64 килобайта 2 мегабайта
M25P32 16h 64 сектора по 64 килобайта 4 мегабайта
M25P64 17h 128 секторов по 64 килобайта 8 мегабайт
M25P128 18h 64 сектора по 256 килобайт 16 мегабайт

2. Раньше запись и чтение осуществлялись по одному байту, теперь сразу блоками размером до 256 байт (по размеру страницы). Поэтому все операции с памятью происходят гораздо быстрее, и меньше расходуется ресурс FLASH.

3. Для упрощения кода удалена поддержка записи и чтения данных с интервалом (величина параметра Stride может быть только равной 1).

4. Для отладки добавлена возможность вывода сообщений в порт UART0 (макрос umsg).

Перед записью новой программы в микросхему серии M25P её память должна быть стерта (стертое содержимое получает байты FFh). Тут есть два варианта - либо она может быть стерта целиком, либо по секторам, в зависимости от того, в какие секторы должна занимать новая прошивка. Вся память целиком стирается командой BULK ERASE (код команды C7h, константа SPI_BE). Секторы по отдельности стираются командой SECTOR ERASE (код команды D8h, константа SPI_SE), при этом стираются все страницы сектора (всего в секторе sectorsize/256 страниц).

Микросхема Serial Flash подключается к порту SPI0, чтобы можно было осуществлять с неё загрузку процессора. Драйвер тестировался на микросхеме M25P80 [4] и процессоре ADSP-BF538F. Схема подключения к процессору:

ADSP BF538 SPI FLASH M25P80

Чтобы исполняемый код мог загружаться, на входы BMODE0 и BMODE1 процессора нужно подать лог. 1 [2, 3]. Для формирования загружаемого образа в свойствах проекта нужно выбрать 8-битный файл загрузчика, формат может быть HEX или двоичный:

ADSP BF538 SPI FLASH M25P80 loader file format

Код из Serial Flash грузится заметно медленнее, чем из Parallel Flash. Двоичный файл размером 32 килобайта загружается примерно за секунду.

[Что еще можно улучшить в драйвере]

1. Разобраться с задержками. Либо выкинуть их совсем, либо пересчитать их в реальные интервалы времени на основе тактовой частоты процессора. Это должно ускорить работу драйвера.

2. Вернуть поддержку интервалов адреса (stride) при работе с памятью.

Исходный код и исполняемый DXE-файл драйвера можно скачать по ссылке [5].

[Ссылки]

1. VisualDSP API программирования FLASH для процессоров Blackfin.
2. Как происходит загрузка ADSP-BF533 Blackfin.
3. Blackfin: утилита elfloader.exe.
4. Micron M25P80 Serial FLASH.
5. 190121FlashProgrammer-M25P.zip - исходный код и исполняемый файл драйвера (Debug\FlashDriver_M25Pxx.dxe).