SergeyVas 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба У nxp есть библиотека spifi, если правильно понял она для внешних микросхем памяти, в доке на нее перечень какие микросхемы она поддерживает, можно использовать внешнюю память для программ и загружаться из внешней памяти, если конечно правильно понимаю. Но исходников на саму библиотеку не нашел. Только готовый файл lib который подходит для iar и keil а для gcc не подходит. Можно гдето посмотреть исходники или может на похожую библиотеку что то есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Может есть библиотеки для чтения записи стирания Flash Memory AT25DF321A? Если я настрою spi на mode0 и функции чтения записи напишу, это правильно будет? Может в контроллере lpc4337 уже есть интерфейс для такой памяти ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Может есть библиотеки для чтения записи стирания Flash Memory AT25DF321A? Если я настрою spi на mode0 и функции чтения записи напишу, это правильно будет? Может в контроллере lpc4337 уже есть интерфейс для такой памяти ? AT25DF321A обычная себе память типа data-flash с возможностью стирания от 4к и постраничной записью. Работает через SPI. Если очень надо могу посмотреть в закромах процедуры работы с таким типом памяти. Производителя делают их совместимыми по опкодам и параметрам стирания-записи. Посмотрите во вложении. Эта микросхема памяти поддерживает Deep Power Down Mode. Вы можете добавить 2 процедуры: //-------------------------------- //процедура перевода памяти в режим 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Буду очень благодарен. Сейчас читаю доку на 4337 там на странице 609 описан этот интерфейс spifi, а это дока на библиотеку spifi Какая разница если использовать обычный spi или пользоваться spifi ? Подозреваю что процессор видит страниц памяти по адресам, без нискоуровневых функций работы с spi чтения записи ./ не понимаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Какая разница если использовать обычный spi или пользоваться spifi ? Если я всё правильно понял, то после настройки spifi Вы можете получить доступ к внешней памяти как к отдельному адресному пространству, к которому есть доступ процессора. Думаю полезная вещь, если в ней разобраться. По поводу SPI. Я просмотрел регистры LPC17 и LPC43. Разницы не увидел. Так что принимайте процедуры работы по SPI. В аппаратном есть контроль максимальной частоты работы переферийного устройства (для вашей микросхемы 66 МГц). Для настройки необходимо знать переферийную частоту тактирования SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Благодарю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба страница 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 6 4 января, 2014 Опубликовано 4 января, 2014 · Жалоба Определённо интересная вещь этот spifi. При обращении процессором к области памяти, отведённой под последовательную память, все манипуляции по работе с памятью берёт на себя spifi. Т.е. для программы это просто область памяти расположенная по определённому адресу. Так и есть память отображается в адресное пространство контроллера, из этой памяти может выполнятся програма (правда жудко медленно). этот модуль есть только в LPC43 На сколько я помню в LPC18 тоже есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Так и есть память отображается в адресное пространство контроллера, из этой памяти может выполнятся програма (правда жудко медленно). А зачем это тогда ? Может проше загружать простенькую прогу в память, которая затем перегружает часть памяти с флехи в память и запускается там... Хотя тоже не вариант, когда есть нормальный флеш в контроллере. Если дак только константы какие грузить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Смотрю доку на библиотеку ,но не могу найти как читать функциями этой библиотеки, как писать, стирать все понятно, а как читать? Можно воспользоваться memcpy, но если есть такая библиотека что же в ней нет функции чтения ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Смотрю доку на библиотеку ,но не могу найти как читать функциями этой библиотеки, как писать, стирать все понятно, а как читать? Можно воспользоваться 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 будет задействован автоматически Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Работает ваш код, через копирование по указателям. Думал что есть специальная функция чтения. А так удобно. пользоваться этим spifi. К стати работает под gcc )) проверил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Работает ваш код, через копирование по указателям. Думал что есть специальная функция чтения. А так удобно. пользоваться этим spifi. К стати работает под gcc )) проверил. А запись работает через указатели? Или только через процедуры из библиотеки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 5 января, 2014 Опубликовано 5 января, 2014 · Жалоба Была бы такая штука в LPC17 я бы не поленился разобраться. Дык - есть оно в LPC17x ;) Конкретно: LPC1773 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 5 января, 2014 Опубликовано 5 января, 2014 (изменено) · Жалоба Для записи использую функцию из библиотеки spifi_program а для чтения копирование по указателям. Может кому пригодиться пример как использовать spifi без библиотеки собранная библиотека для m0 m4 keil iar но и с gcc работает тоже Вот так использую не знаю насколько правильно но код работает,может что подправите или посоветуете? //---------------------------------------------------------------------------------------------------// 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"); } } //---------------------------------------------------------------------------------------------------// Стирание работает только секторами. Изменено 5 января, 2014 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться