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

 
 
 
Reply to this topicStart new topic
> Проблема с записью во флеш-память, 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
Bakradze
сообщение Jul 18 2018, 10:39
Сообщение #2


Местный
***

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



Всем спасибо за горячее участие, проблема решилась sm.gif
Go to the top of the page
 
+Quote Post
segment
сообщение Jul 18 2018, 11:35
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



Цитата(Bakradze @ Jul 18 2018, 13:39) *
Всем спасибо за горячее участие, проблема решилась sm.gif

Что за привычка не писать в чем заключалась ошибка и какое было решение
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 20 2018, 11:38
Сообщение #4


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(Bakradze @ Jul 18 2018, 13:39) *
Всем спасибо за горячее участие, проблема решилась sm.gif

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


--------------------
Go to the top of the page
 
+Quote Post
etoja
сообщение Jul 24 2018, 14:26
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



zynq - это FPGA (ПЛИС), а не микроконтроллер. Автор написал не в тот раздел форума.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 24 2018, 14:30
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(etoja @ Jul 24 2018, 18:26) *
zynq - это FPGA (ПЛИС), а не микроконтроллер. Автор написал не в тот раздел форума.

Zynq - это не FPGA. Это SoC, если на то уж пошло. А раздела по процессорам общего назначения у нас нет. Равно как и про SoC.
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 25 2018, 14:58
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Jury093
сообщение Jul 25 2018, 19:47
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Arlleex @ Jul 24 2018, 17:30) *
Zynq - это не FPGA. Это SoC, если на то уж пошло. А раздела по процессорам общего назначения у нас нет. Равно как и про SoC.

SoCоводы обычно тусят там:
https://electronix.ru/forum/index.php?showforum=164
(разработка встраиваемых процессоров и периферии для ПЛИС)

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

по ТС, к сожалению это частая практика - не публиковать решения или "вот решу и всё-всё потом напишу" и это "потом" тянется годами в бесконечность..
Go to the top of the page
 
+Quote Post

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

 


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


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