Как мне записать на флэш-память SPI?


9

Я работаю над аудиоприложением, в котором вместо хранения аудиоданных на SD-карте ( Waveshield на Arduino) я сохраняю их на микросхеме флэш-памяти SPI и использую собственную плату с MCU, DAC и усилителем.

Я использую Winbond W25Q80BVSSIG .

Я довольно хорошо знаком с программированием AVR с использованием AVRISP MKII или USBTiny , записывают данные на устройстве флэша сделано с тем же программистом? Я не смог ничего найти, когда специально искал программистов SPI-флэш-памяти.

Этот вопрос является продолжением этого .


Я не знаю, существует ли программист, который специально может сделать это для вас легко, с ПК или чего-то еще, но если в вашей схеме есть CPLD, вы можете настроить его для записи данных во флэш-память.
deed02392 13.12.12

Я думаю, что модули spi flash теперь разработаны для хранения прошивок / BIOS, которые процессор использует в большинстве компьютеров. Не для надежного устройства хранения.
маршал ремесло

Ответы:


12

Если вы просто ищете способ запрограммировать флэш-память Winbond SPI с «предварительно загруженными» данными, которые ваш микроконтроллер будет читать для использования во время работы, то вам стоит поискать программиста, который может выполнять внутрисхемное программирование. чипа SPI Flash. Это также известно как внутрисистемное программирование (ISP).

Одним из вариантов является программист из DediProg, Это устройство, подключенное через USB, может программировать по схеме, если вы правильно проектируете свою плату. Они даже продают переходник, который можно прикрепить к корпусу SOW-16 без необходимости создавать отдельный программный заголовок на вашей плате. DediProg имеет информационные бюллетени по применению, чтобы помочь с правильным дизайном для внутрисхемного использования. Основная стратегия проекта - найти простой способ изолировать драйверы интерфейса SPI в вашей системе MCU, чтобы они не мешали драйверам в модуле программирования SPI. Самый простой способ сделать это - поместить последовательные резисторы в линии, управляемые микроконтроллером, между микроконтроллером и флэш-памятью SPI. Программист подключается со стороны SPI-вспышки последовательных резисторов. Альтернативные методы могут включать добавление MUX или аналоговых переключателей в управляемых интерфейсных линиях. Еще более умная схема - добавить

введите описание изображения здесь

Второй вариант, который стоит рассмотреть, - это USB-программист от ASIX . Presto может выполнять различные типы устройств SPI и I 2 C, включая устройства SPI Flash. У меня есть одно из этих устройств специально для программирования микроконтроллеров Atmel и различных типов флэш-устройств SPI. Это более экономичное решение, чем вышеуказанное устройство, но не такое гибкое. Их более дорогое устройство под названием Forte способно делать больше вещей, потому что у него больше контактов интерфейса.

введите описание изображения здесь

Иногда может быть полезно иметь возможность подключить программатор к целевой плате без необходимости добавлять программный заголовок. Одним из хороших решений для этого является размещение небольшого набора площадок в специальном месте, определенном компанией TagConnect . Они производят и продают серию быстроразъемных кабелей для программирования, которые имеют pogo-контакты, которые занимают специальную площадь на плате. Доступны 6-контактные, 10-контактные и 14-контактные версии кабеля для широкого спектра применений. Стоимость кабелей очень разумная.

введите описание изображения здесь


Это очень полезно. Я планирую запрограммировать флэш-память перед тем, как перепаять ее на конечную плату. До сих пор я сделал это для MCU, и это сработало хорошо. Я не знаю, является ли хорошей идеей предоставление выводов ISP на печатной плате, так как они не должны перепрограммироваться после завершения.
Джелтон

1
@JYelton - По моему опыту, было бы неплохо спланировать ISP по нескольким причинам. ECO (Заказы на внесение изменений) являются фактом жизненного цикла продукта. Кто-то или что-то потребует изменения содержимого Flash, как только вы начнете работать. Микросхемы флэш-памяти иногда подвержены неожиданным шумовым помехам в цепи и в конечном итоге их контент подвергается риску. Еще одна причина, чтобы обеспечить ISP.
Майкл Карас

1
Существует ли «стандартный» заголовок, который совместим с большинством этих программистов хотя бы с помощью прилагаемых адаптерных кабелей? Я видел заголовки контактов 2x4 и 2x5 с кучей разных выводов. Также см. Flashrom.org/Supported_hardware
kert

У каждого свое разумное представление. Тэг-соединительные кабели стоят $ 35 ~ $ 40.
markrages

1
@markrages - Но для данной лаборатории разработки или заводской станции программирования вам нужно приобрести только один кабель. Вам не нужен один для каждого продукта. Кроме того, эти кабели намного дешевле, чем пытаться свернуть свое собственное крепление с помощью pogo-pin, чтобы у провайдера не было разъема.
Майкл Карас

8

Могу поспорить, что вы могли бы сделать это с Bus Pirate, не проходя через MCU ... что позволяет вам выполнять несколько произвольных последовательных взаимодействий непосредственно с микросхемой, используя SPI, I2C или связь UART. «Сценарий» может занять немного времени, но, вероятно, позволит вам выполнить эту работу.

Я также видел специализированные инструменты для прямой загрузки EEPROM через I2C, но не флэш и не SPI специально.


Я начинаю задаваться вопросом, является ли мой выбор SPI-флэш-памяти хорошим, учитывая, как (по-видимому) неясны методы записи в проклятые вещи.
Джелтон

1
Это заняло бы несколько серьезных сценариев, но все равно хорошая идея. Немного сложнее на мой вкус. Может стоит рассмотреть SD-карту? Тогда вам просто нужно позаботиться о чтении, записи в него с помощью компьютера
chwi

Текущий прототип использует Arduino и Waveshield (который имеет устройство чтения SD-карт). Я хочу уйти от SD-карты, потому что я считаю, что стоимость будет меньше (без считывателя и карты), а также более защищенным от несанкционированного доступа.
Джелтон

7

Я никогда не слышал о каких-либо других инструментах, говорящих SPI напрямую с таким чипом, и я думаю, что это невозможно, поскольку «все» чипы требуют разных вызовов для разных операций.

Чипу необходимы вызовы SPI для записи, чтения, изменения сектора, размера данных и т. Д. В разделе 7.2 «Инструкции» в таблице данных вы можете увидеть все команды SPI, которые вы можете отправить ему. Следовательно, поскольку все внешние флэш-памяти не имеют одинакового набора инструкций, вам необходимо написать специальное приложение для этого.

РЕДАКТИРОВАТЬ: Будучи продолжением, я действительно рекомендую одну из собственных флэш-памяти SPI от Atmels, так как большинство из них уже написали открытый код для них. Посмотрев на этот пост от AVRFreaks , вы получите код для некоторых серийных флеш-чипов Atmels AT45xxxx.


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

Да. Вы можете отправлять данные с последовательной линии вашего компьютера с помощью UART, которые вы записываете на флэш-память. Кроме того, вы можете написать несколько программ для MCU, программируя флэш-память по нескольким блокам за раз. Это может занять немного времени, но это работает, поскольку внешняя вспышка не будет стерта, пока вы правильно отслеживаете изменение секторов
chwi

2
Это правильный ответ. Таким образом, вам понадобится программа на вашем ПК для загрузки блоков в MCU, которая затем записывает их во флэш-память. Это помогает, если есть проверка ошибок, и вам не нужно писать новую программу на ПК; поэтому я предлагаю вам найти код для XMODEM или аналогичный.
pjc50 13.12.12

@ pjc50 ... не так быстро объявить «правильный ответ» :)
vicatcu

На самом деле многие программисты могут программировать флэш-память; и одна из распространенных схем программирования, используемых с Atmel Micros, довольно близка к SPI.
Крис Страттон

4

Я купил программатор FlashCAT от Embedded Computers за 30 долларов США. Было удивительно легко подключаться к ПК через USB и записывать файлы на флэш-память Winbond. Методы и программисты в других ответах, вероятно, так же хороши, некоторые дороже или сделают сам, но это дешевый и простой способ, который соответствует тому, что я искал.

Вот картина установки:

Программирование с FlashCAT

Программатор FlashCAT находится слева, подключен к USB. Он работает с программным обеспечением для программирования SPI (в отличие от JTAG) и обеспечивает питание флэш-памяти. Подаваемая мощность выбирается (3,3 В или 5 В) с помощью перемычки.

У меня есть SOIC для DIP-сокета на макете, чтобы было легко программировать несколько чипов. (Вы также можете увидеть еще одну микросхему флэш-памяти на макете.)

FlashCAT Software

Я еще не преобразовал свой аудиофайл в надлежащий двоичный формат, но я записал WAV-файл размером 211 КБ в память только для проверки, как показано выше. Затем я прочитал его обратно и сохранил как новый файл, переименовал в .wav, и он правильно воспроизводится на ПК.

Следующим шагом будет правильное кодирование файла, а также написание программного обеспечения AVR для считывания данных и отправки их через ЦАП.

Отказ от ответственности: я не связан с Embedded Computers, я просто клиент, который выбрал что-то недорогое и делюсь информацией об опыте работы с продуктом.


4

Вроде поздно к обсуждению, но для всех, кто читает его после поиска ....

Одна вещь, которую я не заметил, это абсолютно важно при программировании микросхем SPI Flash, это управление выводом Chip Select (CS_). Вывод Chip Select используется для пунктуации команд на SPI Flash. В частности, переход от CS_ high к CS_ low должен непосредственно предшествовать выдаче любого кода операции операции записи (WREN, BE, SE, PP). Если существует активность между переходом CS_ (т. Е. После того, как CS_ опустился) и до передачи операционного кода записи, операционный код записи обычно игнорируется.

Кроме того, то, что обычно не объясняется в таблицах данных SPI Flash, поскольку это неотъемлемая часть протокола SPI, что также важно, так это то, что для каждого байта, передаваемого по шине SPI, он получает взамен байт. Кроме того, никто не может получить никаких байтов, если он не передает байт.

Как правило, мастер SPI, которым командует пользователь, имеет буфер передачи, который отправляет байты на линию MOSI шины SPI, и буфер приема, который принимает байты от линии MISO шины SPI.

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

Если вы не будете осторожны с балансировкой записей Transmit и Receive, то вы не будете знать, чего ожидать в буфере приема. Если буфер приема переполнен, данные обычно просто разливаются и теряются.

Таким образом, когда кто-то отправляет команду чтения, которая представляет собой однобайтовый код операции и три байта адреса, он сначала получает четыре байта «мусора» в буфере основного приема SPI. Эти четыре байта мусора соответствуют коду операции и трем адресным байтам. Пока они передаются, Flash еще не знает, что читать, поэтому он просто возвращает четыре слова мусора.

После того, как эти четыре слова мусора возвращены, чтобы получить что-либо еще в буфере приема, вы должны передать количество данных, равное количеству, которое вы хотите прочитать. После кода операции и адреса не имеет значения, что вы передаете, это просто заполнитель, чтобы передать чтение DAta из SPI Flash в приемный буфер.

Если вы не внимательно следите за этими первыми четырьмя возвращенными мусорными словами, вы можете подумать, что одно или несколько из них являются частью ваших возвращенных данных чтения.

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

Перед запуском любой операции SPI Flash рекомендуется «истощить» прием FIFO. Это означает, что нужно проверить состояние буфера приема и очистить его (обычно это делается путем «чтения» буфера приема), если он еще не пуст. Обычно очистка (чтение) уже пустого буфера приема не причиняет вреда.

Следующая информация доступна из временных диаграмм в таблицах вспышек SPI, но иногда люди пропускают биты. Все команды и данные передаются на флэш-память SPI с использованием шины SPI. Последовательность чтения SPI Flash:

1) Start with CS_ high.
2) Bring CS_ low.
3) Issue "Read" op code to SPI Flash.
4) Issue three address bytes to SPI Flash.
5) "Receive" four garbage words in Receive Buffer.
6) Transmit as many arbitrary bytes (don't cares) as you wish to receive. 
Number of transmitted bytes after address equals size of desired read.
7) Receive read data in the Receive Buffer.
8) When you've read the desired amount of data, set CS_ high to end the Read command.
If you skip this step, any additional transmissions will be interpreted as 
request for more data from (a continuation of) this Read.

Обратите внимание, что шаги 6 и 7 должны чередоваться и повторяться в зависимости от размера чтения и размера ваших буферов приема и передачи. Если вы передадите большее количество слов за один раз, чем может вместить ваш буфер приема, вы потеряете некоторые данные.

Для того чтобы выполнить команду Page Program или Write, выполните следующие действия. Размер страницы (обычно 256 байт) и размер сектора (обычно 64 КБ) и связанные границы - это свойства используемой вами SPI Flash. Эта информация должна быть в таблице данных для Flash. Я опущу детали балансировки буферов передачи и приема.

1) Start with CS_ high.
2) Change CS_ to low.
3) Transmit the Write Enable (WREN) op code.
4) Switch CS_ to high for at least one SPI Bus clock cycle.  This may be tens or
hundreds of host clock cycles.  All write operations do not start until CS_ goes high.  
The preceding two notes apply to all the following 'CS_ to high' steps.
5) Switch CS_ to low.
6) Gadfly loop:   Transmit the 'Read from Status Register' (RDSR) op code and 
one more byte.   Receive two bytes.  First byte is garbage.  Second byte is status.
Check status byte.  If 'Write in Progress' (WIP) bit is set, repeat loop. 
(NOTE:  May also check 'Write Enable Latch' bit is set (WEL) after WIP is clear.)
7) Switch CS_ to high.
8) Switch CS_ to low.
9) Transmit Sector Erase (SE) or Bulk Erase (BE) op code.  If sending SE, then follow
it with three byte address.
10) Switch CS_ to high.
11) Switch CS_ to low.
12) Gadfly loop:  Spin on WIP in Status Register as above in step 6.  WEL will
be unset at end.
13) Switch CS_ to high.
14) Switch CS_ to low.
15) Transmit Write Enable op code (again).
16) Switch CS_ to high.
17) Switch CS_ to low.
18) Gadfly loop:  Wait on WIP bit in Status Register to clear. (WEL will be set.)
19) Transmit Page Program (PP = Write) op code followed by three address bytes.
20) Transmit up to Page Size (typically 256 bytes) of data to write.  (You may allow
Receive data to simply spill over during this operation, unless your host hardware
has a problem with that.)
21) Switch CS_ to high.  
22) SWitch CS_ to low.
23) Gadfly loop:  Spin on WIP in the Status Register.
24) Drain Receive FIFO so that it's ready for the next user.
25)  Optional:  Repeat steps 13 to 24 as needed to write additional pages or
page segments.

Наконец, если ваш адрес записи не находится на границе страницы (обычно кратной 256 байтам), и вы пишете достаточно данных, чтобы пересечь следующую границу страницы, данные, которые должны пересечь границу, будут записаны в начало страницы, на которой адрес вашей программы падает. Итак, если вы попытаетесь записать три байта по адресу 0x0FE. Первые два байта будут записаны в 0x0fe и 0x0ff. Третий байт будет записан по адресу 0x000.

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

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


«Перед запуском любой операции SPI Flash рекомендуется« истощить »приемный FIFO. Это означает проверить состояние приемного буфера и очистить его (обычно это делается путем« чтения »приемного буфера), если это не так. уже пустой. Обычно очистка (чтение) уже пустого буфера приема не причиняет вреда. " Какие шаги мне нужно предпринять, чтобы прочитать состояние буфера приема и очистить буфер приема?

3

Вопреки некоторым утверждениям здесь, в то время как есть некоторые причудливые PROM SPI, есть также некоторые стандартные инструкции, используемые большим разнообразием PRI SPI, включая тот, который вы выбрали.

Как уже упоминалось викатку, есть хорошие кабели с бит-bash, которые могут напрямую программировать SPI. С точки зрения сигнала, SPI очень похож на JTAG, поэтому любой кабель с битовой комбинацией должен использоваться при условии открытого интерфейса. Внутренний протокол вспышки довольно прост.

Мы используем старшего брата той части, на которую вы смотрите, для загрузки наших плат FPGA (256M - 2G). У адресации есть дополнительный байт для обработки тома хранилища, но в остальном команды в основном идентичны.

Тип используемого PROM должен быть удален по секторам, а затем запрограммирован по страницам. Чтение значительно быстрее, чем запись (в случае тех, которые мы используем, программирование может занять полчаса, но чтение всего PROM занимает меньше секунды на частоте 108 МГц).

Теперь для команд: Есть способ более доступные команды в этих устройствах , чем на самом деле требуется программировать их. На самом деле вам нужно только следующее:

  • RDID (чтение ID) - просто для проверки PROM и сигнализации, прежде чем делать что-то более сложное.
  • WREN (запись включена) - необходима перед каждой записью.
  • PP (0x02 - программа страницы) - необходим для программирования страницы.
  • SE (0x20 - стирание сектора) - возвращает биты в секторе в «1».
  • RDSR (0x05 - чтение регистра состояния) - необходим для контроля цикла стирания / записи.
  • FREAD (0x0B - быстрое чтение) - читать данные PROM и проверять запись.

Если вам нужна дополнительная информация, ознакомьтесь с примечаниями к ответам по программированию SPI для ПЛИС Xilinx на их веб-сайте (http://www.xilinx.com). Они реализуют сокращенный набор команд, чтобы их FPGA могли загружаться с этих устройств.

Я разработал свой собственный программист, чтобы сделать это на основе того, что у меня есть, и написал скрипт для программиста на Python, но вы можете сделать то же самое с помощью кабеля. В вашем случае я бы серьезно подумал сделать все косвенно через MCU, как предлагает Майкл Карас. Вам не нужно программировать весь PROM от MCU за один раз - вы можете сделать это по секторам.


2

Вы должны быть в состоянии изменить назначение USBtiny для программирования флэш-памяти вместо целевого MCU, если вам удобно менять его программирование. Однако на нем может не хватить памяти, чтобы сделать ее достаточно универсальной для программирования как MCU, так и флэш-памяти.

Где-то у меня есть плата из проекта, которая имеет как ATTINY, так и SPI-флешку, и использует ее как Arduino в качестве легкодоступного «программиста». Небольшая модификация эскиза ISP используется для программирования MCU с помощью avrdude, затем специальная утилита отправляет последовательность, которая переводит эскиз в специальный режим и записывает блоки данных во флэш-память SPI.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.