Перейти к содержанию
    

Проблема с записью во флеш-память

Итак, просьба помочь. Есть плата zedboard на основе zynq, к нему подключена память spi-flash S25FL256S. Есть проблемы с записью в память в случае невыровненных данных, т.е. если нужно записать в память количество байт не кратное 4-м - 1, 2 или 3 байта.

 

Вот исходник драйвера https://github.com/Xilinx/embeddedsw/blob/m...s/src/xqspips.c

 

Столкнулся со следующей проблемой.

 

К примеру, нужно нам записать в память 1 байт. Используем команду Page Program=0x02 с 3 байтами адреса. Пишем в самое начало, поэтому можно для простоты все три байта адреса оставить нулевыми. К примеру пишем 0xAA.

 

Все подготовил так, как в примере использующем эту функцию https://github.com/Xilinx/embeddedsw/blob/m...flash_example.c - ручное управление линией SS и ручной старт.

 

Если идти по пути как указано в тексте драйвера в функции s32 XQspiPs_PolledTransfer() - мы должны будем послать данные по следующей схеме:

 

XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_TXD_01_OFFSET, 0x00000002) - в FIFO предназначенное для отправки 1-байтной инструкции. (т.е. отправится 0x02)

 

затем остальные, уже выровненные данные, отправлять в обычное FIFO предназначенное для отправки 4-байтного слова

 

в нашем случае это будет выглядеть так:

 

XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_TXD_00_OFFSET, 0xAA000000) где 0xAA и есть наш байт

 

И тут проблема: если ждать опустошения 1-байтного FIFO с адресом XQSPIPS_TXD_01_OFFSET перед отправкой остальных данных в FIFO с адресом XQSPIPS_TXD_00_OFFSET как в примере драйвера

 

do {

StatusReg = XQspiPs_ReadReg(

InstancePtr->Config.BaseAddress,

XQSPIPS_SR_OFFSET);

} while ((StatusReg & XQSPIPS_IXR_TXOW_MASK) == 0);

 

у меня записи не происходит и более того - даже в статусном регистре памяти SR1 значение защелки Write Enable Latch (WEL) не падает в 0.

 

Ок, уберем кусочек который ожидает опустошение передающей очереди TX_01. В этом случае когда мы после записи в TX_01 без ожидания опустошения пишем в TX_00 - происходит подвисание отладчика.

 

 

 

 

Если записывать по 4 байта, то есть сначала записать

 

XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_TXD_00_OFFSET, 0x00000012)

 

потом, не дожидаясь опустошения

 

XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_TXD_00_OFFSET, 0xAAAAAAAA)

 

статус защелки падает в 0, а вычитывание покажет 4 записанных байта в самое начало памяти

 

Поначалу думал, что можно записывать только кратно 4 байта, но мне показали что можно и не кратно 4.

 

Дайте пожалуйста совет, если есть соображения по поводу моей проблемы.

Изменено пользователем Bakradze

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за горячее участие, проблема решилась :)

Что за привычка не писать в чем заключалась ошибка и какое было решение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за горячее участие, проблема решилась :)

Прошу написать, как была решена данная проблема. В чем была ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

zynq - это FPGA (ПЛИС), а не микроконтроллер. Автор написал не в тот раздел форума.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

zynq - это FPGA (ПЛИС), а не микроконтроллер. Автор написал не в тот раздел форума.

Zynq - это не FPGA. Это SoC, если на то уж пошло. А раздела по процессорам общего назначения у нас нет. Равно как и про SoC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если бы проблема ТС была по ARM-ядру (A9 там?), то раздел правильный. А ежели с ПЛИС, то и соответствующий раздел тоже есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Zynq - это не FPGA. Это SoC, если на то уж пошло. А раздела по процессорам общего назначения у нас нет. Равно как и про SoC.

SoCоводы обычно тусят там:

https://electronix.ru/forum/index.php?showforum=164

(разработка встраиваемых процессоров и периферии для ПЛИС)

 

раньше там были только вопросы по nios и microblaze, но потом подтянулись и хардовые АРМы в фпга..

 

по ТС, к сожалению это частая практика - не публиковать решения или "вот решу и всё-всё потом напишу" и это "потом" тянется годами в бесконечность..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...