Перейти к содержанию

    

EPCQ и Serial Flash Controller II

Пытаюсь записать данные с помощью мастера непосредственно в EPCQ32, используя Serial Flash Controller II

Если я правильно понимаю, то сначала нужно стереть сектор. Как указанно в документации Embedded Peripherals IP User Guide -> 16. Intel FPGA Serial Flash Controller and Controller II Core просто записываю 0x02 в регистр FLASH_MEM_OP чтобы стереть нулевой сектор. В результате ничего не происходит, сектор значений не меняет.

Делаю я это с помощь System Console и JTAG to Avalon Master Bridge с помощью команды:

master_write_32 $claim_path $offset $value

 

Подскажите в чём может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

BSP предоставляет замечательную функцию

int alt_epcq_controller2_erase_block(alt_flash_dev *flash_info, int block_offset);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
BSP предоставляет замечательную функцию

int alt_epcq_controller2_erase_block(alt_flash_dev *flash_info, int block_offset);

В системе не будет процессора, будет самописный компонент, который должен записывать данные в EPCQ32 являясь мастером. А отлаживаю я пока с использованием System Console и JTAG to Avalon Master Bridge, т.е. JTAG to Avalon Master Bridge пока является мастером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можете попробовать ядро Altera ASMI Parallel / Parallel II, оно для работы без Niosa.

 

В системе не будет процессора, будет самописный компонент, который должен записывать данные в EPCQ32 являясь мастером. А отлаживаю я пока с использованием System Console и JTAG to Avalon Master Bridge, т.е. JTAG to Avalon Master Bridge пока является мастером.

Зачем тогда вообще рассматривать Альтеровский контроллер, тут нужен просто SPI/QSPI и далее шлёте нужные для памяти команды и данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Можете попробовать ядро Altera ASMI Parallel / Parallel II, оно для работы без Niosa.

 

 

Зачем тогда вообще рассматривать Альтеровский контроллер, тут нужен просто SPI/QSPI и далее шлёте нужные для памяти команды и данные.

 

"просто SPI/QSPI" это Generic QUAD SPI Controller II ну если так то по описанию они идентичны. Я так понимаю, что в ячейку памяти нельзя записать 1 если там 0, её нужно стереть. А вот стереть не получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
"просто SPI/QSPI" это Generic QUAD SPI Controller II ну если так то по описанию они идентичны. Я так понимаю, что в ячейку памяти нельзя записать 1 если там 0, её нужно стереть. А вот стереть не получается.

Всё верно, надо стереть, потом можно записать.

Только Generic QUAD SPI Controller II не равно EPCQ Flash controller, он не знает протокол комманд для EPCQ.

Т.е. Вы отправляете по SPI комманду D8h, а флэш не трется?

 

post-63539-1530019969_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Т.е. Вы отправляете по SPI комманду D8h, а флэш не трется?

Нет.

Я записываю в регистр FLASH_MEM_OP (Offset = 0x03) значение равное 0x02.

В документации Embedded Peripherals IP User Guide -> 16. Intel FPGA Serial Flash Controller and Controller II Core сказано что это команда для стирания сектора. Т.е. я пытаюсь стереть нулевой сектор.

post-16608-1530027620_thumb.jpg

 

Система у меня такая:

post-16608-1530027700_thumb.jpg

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ответ был постом выше!

Только Generic QUAD SPI Controller II не равно EPCQ Flash controller, он не знает протокол комманд для EPCQ.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я записываю в регистр FLASH_MEM_OP (Offset = 0x03) значение равное 0x02.

Тогда, вероятно, проблема в параметрах offset и value

master_write_32 $claim_path $offset $value

 

Я записываю в регистр FLASH_MEM_OP (Offset = 0x03) значение равное 0x02.

И теперь ещё раз посмотрите чему соответствует Offset = 0x03 в Вашей системе.

 

P.S. Плюс для master_write_32 оффсет будет не 3, а 12 относительно базового адреса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
P.S. Плюс для master_write_32 оффсет будет не 3, а 12 относительно базового адреса.

 

Да, так и делаю. Смещение 12.

 

Короче, разобрался. Спасибо всем кто пытался помочь.

Пришлось сделать простую систему с процессором NIOS. Дело в следующем:

в функции

int alt_epcq_controller2_erase_block(alt_flash_dev *flash_info, int block_offset);

есть ошибка. Не знаю во всех версия Quartus или нет, у меня 17.0

 

Перед тем как стирать сектор, т.е. перед тем как записывать в регистр FLASH_MEM_OP[2:0] значение 3'b010 необходимо записать команду для разрешения записи, т.е. FLASH_MEM_OP[2:0] = 3'b100

Например, если нужно стереть сектор с начальным адресом 0x10000 (это первый сектор, не нулевой) сначала записываем FLASH_MEM_OP = 0x104, затем FLASH_MEM_OP = 0x102.

 

Дополнительный код для в функции int alt_epcq_controller2_erase_block в файле altera_epcq_controller2.c выглидит так:

/* calculate current sector/block number */
sector_number = (block_offset/(epcq_flash_info->sector_size));

/* sector value should occupy bits 23:8 */
mem_op_value = (sector_number << 8) & ALTERA_EPCQ_CONTROLLER2_MEM_OP_SECTOR_VALUE_MASK;

/* write enable command */
mem_op_value |= 0x04;

/* write sector erase command to EPCQ_MEM_OP register to erase sector "sector_number" */
IOWR_ALTERA_EPCQ_CONTROLLER2_MEM_OP(epcq_flash_info->csr_base, mem_op_value);

 

То же самое касается и доступа к EPCQ32 с помощью любого другого мастера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация