|
Библиотека spifi |
|
|
|
Jan 4 2014, 14:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(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.
|
|
|
|
|
Jan 4 2014, 14:51
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
страница 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 и работать с памятью просто как с внешней микросхемой.
|
|
|
|
|
Jan 4 2014, 18:48
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Определённо интересная вещь этот spifi. При обращении процессором к области памяти, отведённой под последовательную память, все манипуляции по работе с памятью берёт на себя spifi. Т.е. для программы это просто область памяти расположенная по определённому адресу. Так и есть память отображается в адресное пространство контроллера, из этой памяти может выполнятся програма (правда жудко медленно). Цитата этот модуль есть только в LPC43 На сколько я помню в LPC18 тоже есть.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jan 5 2014, 12:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(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 будет задействован автоматически
|
|
|
|
|
Jan 5 2014, 17:42
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Для записи использую функцию из библиотеки 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"); }
} //---------------------------------------------------------------------------------------------------// Стирание работает только секторами.
Сообщение отредактировал IgorKossak - Jan 5 2014, 20:47
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|