Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32 QUADSPI

Сб дек 21, 2019 19:23:37

Здравствуйте товарищи!
Плата STM32F412G Disco
По протоколу QSPI подключена Флешка N25Q128A13EF840F.
Пытаюсь запустить режим отображения Memory-mapped mode.
При попытке чтения по адресу 0х90000000 падает в хард.
Реализую так.
Код:
RCC->AHB3ENR |= RCC_AHB3ENR_QSPIEN; //Тактирование QSPI
RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOFEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOGEN);
    GPIOG->AFR[0] |= 0xA0C0000;
    GPIOB->AFR[0] |= 0x900;
    GPIOF->AFR[0] |= 0x99000000;
    GPIOF->AFR[1] |= 0xAA;
GPIOF->OSPEEDR |=  (GPIO_OSPEEDER_OSPEEDR6_1 | GPIO_OSPEEDER_OSPEEDR7_1 | GPIO_OSPEEDER_OSPEEDR8_1 | GPIO_OSPEEDER_OSPEEDR9_1 );
GPIOB->OSPEEDR |=  ( GPIO_OSPEEDER_OSPEEDR2_1 );
GPIOG->OSPEEDR |=  ( GPIO_OSPEEDER_OSPEEDR6_1 );

//параметры QuadSpi
   QUADSPI->CR|= QUADSPI_CR_EN; //QUADSPI_CR_EN - Включаем QuadSPI
   
   //параметры внешней Flash
   QUADSPI->DCR|= (QUADSPI_DCR_FSIZE_0 | QUADSPI_DCR_FSIZE_1 | QUADSPI_DCR_FSIZE_3 | QUADSPI_DCR_FSIZE_4 | QUADSPI_DCR_CSHT_0);// Размер флешь и что то с цикламми CLK
   
   //Режим работы
   QUADSPI->CCR|= (QUADSPI_CCR_IMODE_0 | QUADSPI_CCR_ADSIZE_1 | QUADSPI_CCR_DMODE_0 | QUADSPI_CCR_DMODE_1 | 0xB1);
   //QUADSPI_CCR_IMODE_0 инструкции на одной строке
   //QUADSPI_CCR_ADSIZE_1 24 битный адрес
   //QUADSPI_CCR_DMODE данные по 4 строкам
   //0x6B инструкция QSPI чтение
   // FMODE 00 - режим indirect
    QUADSPI->DLR|= 0xFFFFFFFF;
    QUADSPI->DR = 0x0600;
    QUADSPI->CCR|= (QUADSPI_CCR_FMODE_0 | QUADSPI_CCR_FMODE_1 | 0x06B ); //QUAD OUTPUT FAST READ
   uint32_t address =0x90000000;
   i1 = (*(__IO uint32_t*)address);
   Ciferki(145, 220, i1, 0x0000); // Вывести на дисплей



Помогите люди добрые, уже неделю с ней любовь делаю.
СпойлерИзображение


Добавлено after 40 minutes 9 seconds:
Сделал перестановку, в хард перестала падать.
Код:
 //Режим работы
   QUADSPI->DR = 0x0600;QUADSPI->DLR|= 0xFFFFFFFF;
   QUADSPI->CCR|= (QUADSPI_CCR_IMODE_0 | QUADSPI_CCR_ADSIZE_1 | QUADSPI_CCR_DMODE_0 | QUADSPI_CCR_DMODE_1 | 0xB1);

Т.е. Сначала наполняю DR, там у меня регистр флешки, XIP:quad output fast read
Потом регистр размера пересылаемой информации.
А потом уже отправка инструкции.

Теперь выводит 10 нулей таким кодом, хотя на флешке по адрессу 90000000h - 8 8
Код:
    for ( i = 0; i < 10; i++ )
    {
      address=address+1;
      volatile uint32_t var = *(uint32_t*)address;
      Ciferki(239, 220 - (i*19), var, 0x0000); 
    }

Re: STM32 QUADSPI

Сб дек 21, 2019 20:56:56

Надеюсь, вот это до дыр зачитано DM00227538.pdf?

Ну вот что это?
Код:
QUADSPI->DLR |= 0xFFFFFFFF;
Ну сколько можно? Проблема, естественно, не в этом, но неужели глаз не режет?

Re: STM32 QUADSPI

Сб дек 21, 2019 21:26:52

TEPEM писал(а):Помогите люди добрые, уже неделю с ней любовь делаю.
Вниз головой? :shock: :)))

Re: STM32 QUADSPI

Вс дек 22, 2019 08:14:57

Надеюсь, вот это до дыр зачитано DM00227538.pdf?

Ну вот что это?
Код:
QUADSPI->DLR |= 0xFFFFFFFF;
Ну сколько можно? Проблема, естественно, не в этом, но неужели глаз не режет?


Зря Вы так, Владислав, тут по даташиту,
СпойлерBits 31:0 DL[31:0]: Data length
Number of data to be retrieved (value+1) in indirect and status-polling modes. A value
no greater than 3 (indicating 4 bytes) should be used for status-polling mode.
All 1s in indirect mode means undefined length, where QUADSPI will continue until the
end of memory, as defined by FSIZE.
0x0000_0000: 1 byte is to be transferred
0x0000_0001: 2 bytes are to be transferred
0x0000_0002: 3 bytes are to be transferred
0x0000_0003: 4 bytes are to be transferred
...
0xFFFF_FFFD: 4,294,967,294 (4G-2) bytes are to be transferred
0xFFFF_FFFE: 4,294,967,295 (4G-1) bytes are to be transferred
0xFFFF_FFFF: undefined length -- all bytes until the end of Flash memory (as defined
by FSIZE) are to be transferred. Continue reading indefinitely if FSIZE = 0x1F.
DL[0] is stuck at ‘1’ in dual-flash mode (DFM = 1) even when ‘0’ is written to this bit, thus
assuring that each access transfers an even number of bytes.
This field has no effect when in memory-mapped mode (FMODE = 10).
This field can be written only when BUSY = 0.


Конечно до дыр, и даташит на саму флешь, и референс и этот документ

Вниз головой ее сделал местный хост для картинок

Re: STM32 QUADSPI

Вс дек 22, 2019 08:34:28

Логическое ИЛИ с 0xFFFFFFFF ===== 0xFFFFFFFF !!!

Добавлено after 1 minute 49 seconds:
Счастливой " любви".

Re: STM32 QUADSPI

Вс дек 22, 2019 11:07:40

Логическое ИЛИ с 0xFFFFFFFF ===== 0xFFFFFFFF !!!

Добавлено after 1 minute 49 seconds:
Счастливой " любви".



К чему это? Там и должно быть FFFF FFFF, передача до конца данных.

Добавлено after 2 hours 4 minutes 2 seconds:
Расписал используемые регистры и инструкции

СпойлерQUADSPI->CR|= QUADSPI_CR_EN;
// Включаем режим qspi - mem map
////////////////////////////////////////////////////////////////////////////////
QUADSPI->DCR|= (QUADSPI_DCR_FSIZE_0 | QUADSPI_DCR_FSIZE_1 | QUADSPI_DCR_FSIZE_3 | QUADSPI_DCR_FSIZE_4 | QUADSPI_DCR_CSHT_0);
//Задаем размер флешь - 128мб // nCS остается высоким два цикла между командами флешь
////////////////////////////////////////////////////////////////////////////////
QUADSPI->DR = 0x0602; //bit11:9 xip mode: 011-xip:quad output fast read
QUADSPI->DLR|= 0x00000003;// 4 байта должны быть переданы
////////////////////////////////////////////////////////////////////////////////
QUADSPI->CCR|= (QUADSPI_CCR_IMODE_0 | QUADSPI_CCR_ADSIZE_0 | QUADSPI_CCR_DMODE_0 | 0xB1);
//IMODE 01: инструкция на одной строке
//ADSIZE 01: 16-битный адрес
//DMODE 01: данные по 1 строкам
//0xB1 Запись энергонезависсимых регистров
////////////////////////////////////////////////////////////////////////////////
QUADSPI->CCR|= ( 0xB );
QUADSPI->CCR|= ( 0x6B );
QUADSPI->CCR|= ( 0xEB );
//0xEB QUAD INPUT/OUTPUT FAST READ
////////////////////////////////////////////////////////////////////////////////
QUADSPI->CCR|= (QUADSPI_CCR_FMODE_0 | QUADSPI_CCR_FMODE_1);
//FMODE 11: режим отображения памяти

Re: STM32 QUADSPI

Вс дек 22, 2019 12:00:58

Во-первых, в AN4760 раздел 5.2.1 прямо код есть как всё включить. Ничего похожего я в твоём коде не наблюдаю.
Во-вторых, оператор присваивания в языке Си это "=". Не "|=", не "&=" и даже не "=:".
В-третьих, X | 0xFFFFFFFF ====== 0xFFFFFFFF. Точно так же как Y & 0x00000000 ====== 0x00000000.

Re: STM32 QUADSPI

Вс дек 22, 2019 12:50:31

Во-первых, в AN4760 раздел 5.2.1 прямо код есть как всё включить. Ничего похожего я в твоём коде не наблюдаю.
Во-вторых, оператор присваивания в языке Си это "=". Не "|=", не "&=" и даже не "=:".
В-третьих, X | 0xFFFFFFFF ====== 0xFFFFFFFF. Точно так же как Y & 0x00000000 ====== 0x00000000.


Вроде не '=:', а ':=' постоянно подмывает написать)

Добавлено after 29 minutes 55 seconds:
Стараюсь использовать "или", чтобы по запаре не затереть инфу, которая доселе могла бы быть в регистре.
Ведь если там уже есть что то, = сотрет все остальное. Конечно, не в случае с ffff ffff.
Это как выходя из тира, спускать курок в воздух, понимаешь, что ружье разряжено но так спокойнее, я кстати на работе в тире два раза запиздярил так в потолок

Re: STM32 QUADSPI

Вс дек 22, 2019 13:19:07

Стараюсь использовать "или", чтобы по запаре не затереть инфу, которая доселе могла бы быть в регистре.
Регистры периферии это не просто переменные, в которых что-то хранится. Не только изменение, но и каждое чтение-запись вызывает какие-то изменения/действия в периферийном модуле. Нельзя с ними работать "по запаре". Спешка нужна только при ловле блох. Так что, открываем AN4760, подсматриваем в stm32f4xx_hal_qspi.c и методичненько шаг за шагом... Желательно с контролем ЛА и осциллоглядом.

Re: STM32 QUADSPI

Вс дек 22, 2019 17:14:00

Стараюсь использовать "или", чтобы по запаре не затереть инфу, которая доселе могла бы быть в регистре.
"Затереть" - боитесь, а вписать туда лишнее этой "|=" - не боитесь?
Как уже сказали - в общем случае использовать нужно "=".

Re: STM32 QUADSPI

Вс дек 22, 2019 17:53:11

Чтобы не затереть нужно |=0x00000000 или &=0xFFFFFFFF. Логические функции.

Добавлено after 3 minutes 6 seconds:
Блин , Ещё и рейтинг понижаешь.

Re: STM32 QUADSPI

Вс дек 22, 2019 19:53:17

Чтобы не затереть нужно |=0x00000000 или &=0xFFFFFFFF. Логические функции.

Добавлено after 3 minutes 6 seconds:
Блин , Ещё и рейтинг понижаешь.


Мне почему то кажется, что вы издеваетесь :dont_know:

Заработало сие чудо.
Код из документа про QUADSPI кривой до ужаса, и не функциональный, в режиме отладки видно что он работает через раз(
Когда в голове уже нарисовалось все что надо было сделать регистрами, оставалось дело за малым - расставить их в нужной последовательности и с обработкой обратной связи, которая кстати говоря очень тонкая и может флешка на том конце просто лечь и молчать.
Последовательность спер из халовского примера в режиме отладки, по другому там хуже чем с дисплеем.
Как то так, красиво оформлю положу.
Да пойду почитаю К&Р, пока Владислав меня ей по голове бить не начал)

Re: STM32 QUADSPI

Вс дек 22, 2019 21:14:20

Не нужно по каждому "затыку" орать СПАСИТЕ-ПОМОГИТЕ !

Детский сад бл....
Скоро отдельную ветку на форуме создавать придется " ТЕРЕМ ".

Re: STM32 QUADSPI

Вс дек 22, 2019 21:35:22

Не нужно по каждому "затыку" орать СПАСИТЕ-ПОМОГИТЕ !

Детский сад бл....
Скоро отдельную ветку на форуме создавать придется " ТЕРЕМ ".

Я уже начал переживать, что со мной что то не так, а потом не поленился изучил вашу историю постов...

Re: STM32 QUADSPI

Пн дек 23, 2019 10:44:47

Код из документа про QUADSPI кривой до ужаса, и не функциональный,
Извини за прямоту, но тебе ещё рановато оценивать чужой код. Всё там нормально написано, ну кроме "мэджик намберс".

Когда в голове уже нарисовалось все что надо было сделать регистрами, оставалось дело за малым - расставить их в нужной последовательности
Кхм. Там же в 5.2.1 последовательность чётко определена. Не думаю, что хорошей идеей будет отступать от неё.

Re: STM32 QUADSPI

Пн дек 23, 2019 16:21:13

Не в коем разе, я не говорю что он плохой, я говорю что он не работает) По отладчику видно, что whil не отрабатывают, и половина флагов не успевают записаться в регистры( И там код, только инициализации, сбрасывания внутренних регистров, запись новых volantil регистров. А основная фишка в записи non valantil регистров, и их не надо сбрасывать каждый раз. Volantil в дефолте вполне подходят для моих задач. Я бы мог не верно интропретировать отладчик, но в примере хала все регистры успевают записаться по ходу работы кода. И у меня была большая проблема в этом, когда регистры стали успевать ложиться - все заработало.

Хотя я конечно могу ошибаться, не надо в меня кидать тапками)

Re: STM32 QUADSPI

Пн дек 23, 2019 18:26:10

TEPEM писал(а):По отладчику видно, что whil не отрабатывают, и половина флагов не успевают записаться в регистры
Какая частота ядра и периферийных шин?

Re: STM32 QUADSPI

Пн дек 23, 2019 18:39:24

74мГц. У Flash заявлено чуть более 100мГц

Re: STM32 QUADSPI

Пн дек 23, 2019 19:54:30

https://bitbucket.org/AVI-crak/system_f ... S25FL256S/
Внимательно прочитать доку на свой чип, и заменить не соответствия. Алгоритм для всех внешних чипов памяти - одинаков.
Ответить