Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Библиотека spifi
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sergey sva
У nxp есть библиотека spifi, если правильно понял она для внешних микросхем памяти, в доке на нее перечень какие микросхемы она поддерживает, можно использовать внешнюю память для программ и загружаться из внешней памяти, если конечно правильно понимаю. Но исходников на саму библиотеку не нашел. Только готовый файл lib который подходит для iar и keil а для gcc не подходит. Можно гдето посмотреть исходники или может на похожую библиотеку что то есть?
sergey sva
Может есть библиотеки для чтения записи стирания Flash Memory AT25DF321A? Если я настрою spi на mode0 и функции чтения записи напишу, это правильно будет?
Может в контроллере lpc4337 уже есть интерфейс для такой памяти ?
mempfis_
Цитата(sergey sva @ Jan 4 2014, 17:52) *
Может есть библиотеки для чтения записи стирания Flash Memory AT25DF321A? Если я настрою spi на mode0 и функции чтения записи напишу, это правильно будет?
Может в контроллере lpc4337 уже есть интерфейс для такой памяти ?


AT25DF321A обычная себе память типа data-flash с возможностью стирания от 4к и постраничной записью. Работает через SPI. Если очень надо могу посмотреть в закромах процедуры работы с таким типом памяти. Производителя делают их совместимыми по опкодам и параметрам стирания-записи.

Посмотрите во вложении. Эта микросхема памяти поддерживает Deep Power Down Mode. Вы можете добавить 2 процедуры:
CODE
//--------------------------------
//процедура перевода памяти в режим DP
void setDP(void)
{
SELECT_SPI(nSS_SFLASH); //выбираем устройство spi
SPIWriteChar(MP25_DP); //запись кода команды
DESELECT_SPI(); //отпускаем устройство spi
}
//--------------------------------

//--------------------------------
//процедура вывода памяти из режима DP
void releaceDP(void)
{
SELECT_SPI(nSS_SFLASH); //выбираем устройство spi
SPIWriteChar(MP25_RDP); //запись кода команды
DESELECT_SPI(); //отпускаем устройство spi

//время выхода из DP 30 uS
for(volatile unsigned int i=0; i<(50*30); i++);
);
}
//--------------------------------


При инициализации памяти установите setDP(); И в каждой процедуре работы с памятью следует добавить releaceDP(); а перед выходом setDP();
Должно работать. Нужно только проверить опкоды и ввести корректные таймауты вхождения/выхода deep power down.

Также есть процедуры программного/аппаратного SPI. Если будет нужно могу поделится. Програмный не привязан к процессору, а аппаратный работает на LPC17.
sergey sva
Буду очень благодарен. Сейчас читаю доку на 4337 там на странице 609 описан этот интерфейс spifi, а это дока на библиотеку spifi Какая разница если использовать обычный spi или пользоваться spifi ?
Подозреваю что процессор видит страниц памяти по адресам, без нискоуровневых функций работы с spi чтения записи ./ не понимаю
mempfis_
Цитата(sergey sva @ Jan 4 2014, 18:20) *
Какая разница если использовать обычный spi или пользоваться spifi ?

Если я всё правильно понял, то после настройки spifi Вы можете получить доступ к внешней памяти как к отдельному адресному пространству, к которому есть доступ процессора. Думаю полезная вещь, если в ней разобраться.

По поводу SPI. Я просмотрел регистры LPC17 и LPC43. Разницы не увидел. Так что принимайте процедуры работы по SPI. В аппаратном есть контроль максимальной частоты работы переферийного устройства (для вашей микросхемы 66 МГц). Для настройки необходимо знать переферийную частоту тактирования SPI.
sergey sva
Благодарю.
mempfis_
страница 610, абзац 3
Цитата
SPI Flash devices respond to commands sent by software, or automatically sent by the
SPIFI when software reads the serial flash region of the memory map.


Определённо интересная вещь этот spifi. При обращении процессором к области памяти, отведённой под последовательную память, все манипуляции по работе с памятью берёт на себя spifi. Т.е. для программы это просто область памяти расположенная по определённому адресу.
Была бы такая штука в LPC17 я бы не поленился разобраться. Но если подумать - этот модуль есть только в LPC43 и потребует своей модели работы с внешней памятью. И если потребуется переносить проект или принцип организации работы с памятью на процессоры, где такого модуля нет, то придётся также менять и модель работы с внешней памятью.
Вобщем решать Вам. Вы можете с помощью аппаратного модуля получить лоступ к внешней памяти как отдельному адресному пространству, или использовать SPI и работать с памятью просто как с внешней микросхемой.
skripach
Цитата
Определённо интересная вещь этот spifi. При обращении процессором к области памяти, отведённой под последовательную память, все манипуляции по работе с памятью берёт на себя spifi. Т.е. для программы это просто область памяти расположенная по определённому адресу.

Так и есть память отображается в адресное пространство контроллера, из этой памяти может выполнятся програма (правда жудко медленно).
Цитата
этот модуль есть только в LPC43

На сколько я помню в LPC18 тоже есть.
mantech
Цитата(skripach @ Jan 4 2014, 22:48) *
Так и есть память отображается в адресное пространство контроллера, из этой памяти может выполнятся програма (правда жудко медленно).


А зачем это тогда ? Может проше загружать простенькую прогу в память, которая затем перегружает часть памяти с флехи в память и запускается там...

Хотя тоже не вариант, когда есть нормальный флеш в контроллере. Если дак только константы какие грузить.
sergey sva
Смотрю доку на библиотеку ,но не могу найти как читать функциями этой библиотеки, как писать, стирать все понятно, а как читать?
Можно воспользоваться memcpy, но если есть такая библиотека что же в ней нет функции чтения ?
mempfis_
Цитата(sergey sva @ Jan 5 2014, 14:55) *
Смотрю доку на библиотеку ,но не могу найти как читать функциями этой библиотеки, как писать, стирать все понятно, а как читать?
Можно воспользоваться memcpy, но если есть такая библиотека что же в ней нет функции чтения ?


Видимо она и не нужна. В доках на процессор указывается что при обращении к памяти, на которую отображается внешняя flash, SPIFI задействуется автоматически.

Вероятно всё должно работать так:
Код
#define EXT_FLASH_ADDR 0x01234567 //это условный адрес, реальный надо смотреть в доках
unsigned char ext_flash_buff[1024] @EXT_FLASH_ADDR;
unsigned char local_buff[1024];
for(unsigned int i=0; i<1024; i++)  local_buff[i] = ext_flash_buff[i]; //тут SPIFI будет задействован автоматически

sergey sva
Работает ваш код, через копирование по указателям. Думал что есть специальная функция чтения. А так удобно. пользоваться этим spifi. К стати работает под gcc )) проверил.
mempfis_
Цитата(sergey sva @ Jan 5 2014, 16:13) *
Работает ваш код, через копирование по указателям. Думал что есть специальная функция чтения. А так удобно. пользоваться этим spifi. К стати работает под gcc )) проверил.


А запись работает через указатели? Или только через процедуры из библиотеки?
jcxz
Цитата(mempfis_ @ Jan 4 2014, 20:51) *
Была бы такая штука в LPC17 я бы не поленился разобраться.

Дык - есть оно в LPC17x wink.gif
Конкретно: LPC1773
sergey sva
Для записи использую функцию из библиотеки spifi_program а для чтения копирование по указателям.
Может кому пригодиться пример как использовать spifi без библиотеки
собранная библиотека для m0 m4 keil iar но и с gcc работает тоже
Вот так использую не знаю насколько правильно но код работает,может что подправите или посоветуете?
CODE
//---------------------------------------------------------------------------------------------------//
void at25df_Read(void* buffer, uint32_t addrsoffsetstruct, uint32_t sizett) {

int i;
opers.dest = (char *) (obj.base + addrsoffsetstruct);
opers.length = sizett;
opers.scratch = NULL;
opers.options = S_VERIFY_PROG;
opers.protect = -1;



for(i = 0; i < sizett; i++)
{
((char*)buffer)[i] = ((char*)opers.dest)[i];
}

UART_printf("Read flash ok.....\r\n");

}
//---------------------------------------------------------------------------------------------------//
void at25df_Erase(uint32_t addrsoffsetstruct, uint32_t sizett) {

opers.dest = (char *) (obj.base + addrsoffsetstruct);
opers.length = sizett;
opers.scratch = NULL;
opers.options = S_FORCE_ERASE;
opers.protect = -1;

// Erase Device
if (pSpifi->spifi_erase(&obj, &opers)) {
UART_printf("ERROR Erace.....\r\n");

} else {
UART_printf("Erace flash ok.....\r\n");
}

}
//---------------------------------------------------------------------------------------------------//
void at25df_Write(void* buffer, uint32_t addrsoffsetstruct, uint32_t sizett) {

opers.dest = (char *) (obj.base + addrsoffsetstruct);
opers.length = sizett;
opers.scratch = NULL;
opers.options = S_VERIFY_PROG;
opers.protect = -1;


if (pSpifi->spifi_program(&obj, (char *) buffer, &opers)) {
UART_printf("ERROR write....\r\n");
} else {
UART_printf("Write flash ok.....\r\n");
}

}
//---------------------------------------------------------------------------------------------------//


Стирание работает только секторами.
toweroff
Цитата(jcxz @ Jan 5 2014, 20:50) *
Дык - есть оно в LPC17x wink.gif
Конкретно: LPC1773

и, похоже, только в нем
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.