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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> хранение данных во флэш epcs4
Kuzmi4
сообщение Aug 18 2014, 16:57
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Цитата(dim99 @ Aug 18 2014, 13:43) *
...
Единственное не до конца понял, что за режим four_bytes_mode.

Есть новые камни - Quad-Serial Configuration (EPCQ) Devices, они позволяют не по одному проводу данные гонять а по 4м сразу. Этот мод как раз для них cool.gif
Go to the top of the page
 
+Quote Post
FLTI
сообщение Apr 23 2015, 08:40
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832



Цитата(Wic @ Oct 25 2011, 11:51) *
После прочтения темы Решил не пользоваться HAL, а использовать драйвер "epcs_commands.h".

Написал такой код

Код
#define EPCS_ADR 523776

alt_u8 data[15];
alt_u32 j;

     j = epcs_read_buffer(EPCS_FLASH_BASE+EPCS_FLASH_REGISTER_OFFSET, EPCS_ADR, &data, 15);

     for(i=0;i<15;i++)
     {
         printf("%x\n",data[i]);
     }


     data[0]=0x00;
     data[1]=0x01;
     data[2]=0x02;
     data[3]=0x03;
     data[4]=0x04;
     data[5]=0x05;
     data[6]=0x06;
     data[7]=0x10;
     data[8]=0x20;
     data[9]=0x30;
     data[10]=0x40;
     data[11]=0x50;
     data[12]=0x6C;
     data[13]=0xAA;
     data[14]=0xFF;


     j = epcs_write_buffer(EPCS_FLASH_BASE+EPCS_FLASH_REGISTER_OFFSET, EPCS_ADR , &data, 15);

     j = epcs_read_buffer(EPCS_FLASH_BASE+EPCS_FLASH_REGISTER_OFFSET, EPCS_ADR, &data, 15);

     for(i=0;i<15;i++)
     {
         printf("%x\n",data[i]);
     }


В пятницу всё прекрасно работало. Три дня меня не было, прихожу - часть переменных читается нулями, а в части лежат нужные данные. Пытаюсь писать туда нужные значения. Ничего не меняется.

Подскажите в чем может быть причина.

Возможно, что причина в этой строчке?
j = epcs_write_buffer(EPCS_FLASH_BASE+EPCS_FLASH_REGISTER_OFFSET, EPCS_ADR , &data, 15);
Что Вы хотели с её помощью получить?
Как можно переменной j присваивать действие процедуры epcs_write_buffer ?
Это корректно?
Ведь в следующей строке этой же переменной j присваиватся результат действия процедуры epcs_read_buffer.
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Apr 23 2015, 08:59
Сообщение #18


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(FLTI @ Apr 23 2015, 10:40) *
Возможно, что причина в этой строчке?
j = epcs_write_buffer(EPCS_FLASH_BASE+EPCS_FLASH_REGISTER_OFFSET, EPCS_ADR , &data, 15);
Что Вы хотели с её помощью получить?
Как можно переменной j присваивать действие процедуры epcs_write_buffer ?
Это корректно?
Ведь в следующей строке этой же переменной j присваиватся результат действия процедуры epcs_read_buffer.

Посмотрите как обьявляется функция epcs_write_buffer:
Код
alt_32 epcs_write_buffer(alt_u32 base, int offset, const alt_u8* src_addr,
                         int length, alt_u32 four_bytes_mode)

Она возвращает тип alt_32, так что всё правильно.
Go to the top of the page
 
+Quote Post
FLTI
сообщение Apr 23 2015, 18:10
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832



Тогда в чём в итоге была проблема?
Я сейчас похожую штуку буду применять, поэтому интересно.

Не могу даже поиском по сайту Альтеры найти описание на epcs_commands.h чтобы понять - как это функция epcs_write_buffer возвращает тип alt_32 и что это вообще за тип alt_32.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 24 2015, 01:54
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



ищите в: ip/altera/sopc_builder_ip/

epcs_commands.c:
CODE

...
alt_32 epcs_read_buffer(alt_u32 base, int offset, alt_u8 *dest_addr, int length)
{
alt_u8 read_command[4];

read_command[0] = epcs_read;
read_command[1] = (offset >> 16) & 0xFF;
read_command[2] = (offset >> 8) & 0xFF;
read_command[3] = offset & 0xFF;

#if 0
/* If a write is in progress, fail. */
if (epcs_test_wip(base))
return 0;
#endif
/* I don't know why this is necessary, since I call await-wip after
* all writing commands.
*/
epcs_await_wip_released(base);

alt_avalon_spi_command(
base,
0,
sizeof(read_command) / sizeof(*read_command),
read_command,
length,
(alt_u8*)dest_addr,
0
);

return length;
...
}

alt_types.h:
Код
...
typedef unsigned long alt_u32;
...
Go to the top of the page
 
+Quote Post
FLTI
сообщение Apr 24 2015, 06:19
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832



Если использовать драйвер epcs_commands.h, то надо ли делать какую-нибудь инициализацию или сразу можно читать командой epcs_read_buffer ?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 24 2015, 06:47
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(FLTI @ Apr 24 2015, 12:19) *
Если использовать драйвер epcs_commands.h, то надо ли делать какую-нибудь инициализацию или сразу можно читать командой epcs_read_buffer ?

можно сразу читать
Go to the top of the page
 
+Quote Post
FLTI
сообщение Apr 24 2015, 13:08
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832



По мотивам кодов в данной теме составил такой код:
Код
            unsigned int i;
             alt_u8 data[16];
    
             // адрес EPCS контроллера
             const alt_u32 EPCS_ADDR = EPCS_FLASH_CONTROLLER_0_BASE + EPCS_FLASH_CONTROLLER_0_REGISTER_OFFSET;
             // смещение параметров модуля в EPCS - 0 байт
             const alt_u32 EPCS_PARAMS_OFFSET = 0;
             // режим байтов для EPCS
             const alt_u32 EPCS_BYTE_MODE = 0;

             epcs_read_buffer(EPCS_ADDR, EPCS_PARAMS_OFFSET, &data, 16, EPCS_BYTE_MODE);

      for(i=0;i<16;i++)
      {
             IOWR_8DIRECT(ONCHIP_MEMORY2_0_BASE, 16+i, data[i]);
      }


Вроде всё нормально, но компилятор в Eclipse выдаёт предупреждение:
warning: passing argument 3 of 'epcs_read_buffer' from incompatible pointer type [enabled by default]
Что бы это значило?
В EPCS записан .jic с таким .map файлом:
BLOCK START ADDRESS END ADDRESS
Page_0 0x00000000 0x0006AD41
ПЛИС Cyclone 4 GX с этого файла нормально стартует, правильно грузится прошивка и правильно выполняется программа НИОСа.

Судя по всему если я буду читать эту EPCS с нулевого смещения , то первые три байта должны быть 0x4a 0x49 0x43, что соответствует кодам букв JIC ?
Потому что эти 3 буквы я вижу с нулевого смещения в .jic файле если посмотреть его в HEX Editor.
А чтение EPCS с нулевого смещения вышеприведённым кодом даёт первые 16 байт равные 0xFF.
По более старшим адресам ( читаю окнами по 16 байт ) в EPCS лежат уже не 0xFF, но прочитанные значения не находятся в .jic файле если поискать их с помощью HEX Editor.


UPD
Сделал запись в область со смещением , а потом чтение, всё верно получается - прочитанное совпало с записанным.


Код
            int i;
            int j;
            alt_u8 data_A[16];
            alt_u8 data_B[16];
    
            // адрес EPCS контроллера
            const alt_u32 EPCS_ADDR = EPCS_FLASH_CONTROLLER_0_BASE + EPCS_FLASH_CONTROLLER_0_REGISTER_OFFSET;
            // нулевое смещение параметров модуля в EPCS
            const alt_u32 EPCS_PARAMS_OFFSET = 16*65536;
            // режим байтов для EPCS
            const alt_u32 EPCS_BYTE_MODE = 0;


for(i=0;i<16;i++)
{
data_A[i]=i;
}
epcs_write_enable(EPCS_ADDR);
epcs_sector_erase(EPCS_ADDR, EPCS_PARAMS_OFFSET, EPCS_BYTE_MODE);
epcs_write_buffer(EPCS_ADDR, EPCS_PARAMS_OFFSET, &data_A, 16, EPCS_BYTE_MODE);

epcs_read_buffer(EPCS_ADDR, EPCS_PARAMS_OFFSET, &data_B, 16, EPCS_BYTE_MODE);
for(j=0;j<16;j++)
{
IOWR_8DIRECT(ONCHIP_MEMORY2_0_BASE, 16+j, data_B[j]);
}


Почему же прочитанный из EPCS .jic не совпадает с .jic файлом?
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Apr 24 2015, 17:33
Сообщение #24


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Цитата(FLTI @ Apr 24 2015, 16:08) *
Почему же прочитанный из EPCS .jic не совпадает с .jic файлом?

В паралельной ветке уважаемый krux объяснил Вам, почему. Потому, что jic в EPCS не записывается!
Jic - это комбинация SFL и sof-файла (ну, может быть дополнен еще hex'ом, если для Nios'a приложение).
Так что рекомендую разобраться с тем, что какой файл делает, и как именно.


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
FLTI
сообщение Apr 24 2015, 17:36
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832



Мне нужно исходный .jic файл, записанный в EPCS по адресу 0x00 заменить на другой .jic файл командами epcs_write_buffer ( из драйвера epcs_commands.h ).
Как это сделать?
Go to the top of the page
 
+Quote Post

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

 


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


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