реклама на сайте
подробности

 
 
> Проблема с записью во флеш-память, zedboard, zynq, arm
Bakradze
сообщение Jul 17 2018, 07:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 432
Регистрация: 17-12-09
Пользователь №: 54 306



Итак, просьба помочь. Есть плата 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 - Jul 17 2018, 07:55
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Bakradze
сообщение Jul 18 2018, 10:39
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 432
Регистрация: 17-12-09
Пользователь №: 54 306



Всем спасибо за горячее участие, проблема решилась sm.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 02:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01348 секунд с 7
ELECTRONIX ©2004-2016