Вроде поздно к обсуждению, но для всех, кто читает его после поиска ....
Одна вещь, которую я не заметил, это абсолютно важно при программировании микросхем 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 байтов (или размер страницы).
Как всегда, не несет ответственности за последствия каких-либо ошибок, опечаток, упущений или отклонений в вышеперечисленном, а также за то, как вы его используете.