Easyelectronics.ru

Электроника для всех
Текущее время: 05 июн 2020, 15:25

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 00:18 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
PriZraK писал(а):
Нет, флаг OVR всегда в нуле.

Уверен? Проверяем:
Код:
   while (!(SPI1->SR & SPI_SR_TXE)) {}
   SPI1->DR = 0x01;

   delay_ms(1);
   
   rtt.printf("%d", SPI1->SR & SPI_SR_OVR);

И получаем 0. А теперь добавим вторую запись:
Код:
   while (!(SPI1->SR & SPI_SR_TXE)) {}
   SPI1->DR = 0x01;
   while (!(SPI1->SR & SPI_SR_TXE)) {}
   SPI1->DR = 0x02;

   delay_ms(1);
   
   rtt.printf("%d", SPI1->SR & SPI_SR_OVR);

И получаем 64...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 00:42 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 2008
Это очевидно !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 01:20 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 804
PriZraK писал(а):
Это не для разработок. Микросхема уже стоит на ките - просто поиграться.

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

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 13:25 
Заглядывает иногда

Зарегистрирован: 07 июн 2016, 19:24
Сообщения: 123
Reflector писал(а):
Уверен?

Уверен, т.к. вторая запись выглядит вот так:
Код:
   while ((SPI2->SR & (SPI_SR_TXE | SPI_SR_RXNE)) == 0 || (SPI2->SR & SPI_SR_BSY)) {}
   SPI2->DR = 0x01;
   while ((SPI2->SR & (SPI_SR_TXE | SPI_SR_RXNE)) == 0 || (SPI2->SR & SPI_SR_BSY)) {}
        (void) SPI2->DR;
   while ((SPI2->SR & (SPI_SR_TXE | SPI_SR_RXNE)) == 0 || (SPI2->SR & SPI_SR_BSY)) {}
   SPI2->DR = 0x02;
   while ((SPI2->SR & (SPI_SR_TXE | SPI_SR_RXNE)) == 0 || (SPI2->SR & SPI_SR_BSY)) {}
        (void) SPI2->DR;

Я про неё говорил. А это, конечно, неправильно:
Код:
   while (!(SPI2->SR & SPI_SR_TXE)) {}
   SPI1->DR = 0x01;
   while (!(SPI2->SR & SPI_SR_TXE)) {}
   SPI1->DR = 0x02;

В прерывании выдаёт "1" в OVR.

AVI-crak писал(а):
Я честно говоря не понимаю как можно играться в слепую.

Ты о чём вообще? На M25P80 есть документация, где прописаны режимы работы, макс. частота, последовательность команд, сами инструкции в конце концов. Так что ни о какой "игре вслепую" речь не идёт. Тем более, я уже писал, что на HAL всё запустилось. Проверял: запись/чтение массивов, софтовая защита от записи секторов, очистка части/всего чипа - всё это работает. Просто хочу это же сделать на регистрах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 13:34 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
PriZraK писал(а):
Код:
while ((SPI2->SR & (SPI_SR_TXE | SPI_SR_RXNE)) == 0 || (SPI2->SR & SPI_SR_BSY)) {}
Дичь дичайшая!

PriZraK писал(а):
А это, конечно, неправильно:
Код:
   while (!(SPI2->SR & SPI_SR_TXE)) {}
   SPI1->DR = 0x01;
   while (!(SPI2->SR & SPI_SR_TXE)) {}
   SPI1->DR = 0x02;
Чё эта? Если ты только посылаешь данные, то этого достаточно. Избавиться от OVR надо только перед приёмом.

PS: Может подсмотреть в HAL? Там то работает, однако.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 14:34 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Мда... Когда пишете очередную длиннющую строку, не стесняйтесь проговорить по-русски, что вы написали. Разложите все операции на литературные слова. У вас получилось:
"
- Пока (буфер передачи не освободился И нет принятого байта) ИЛИ (интерфейс занят), {ждем-с}.
- После этого записываем в регистр передачи.
- Пока (буфер передачи не освободился И нет принятого байта) ИЛИ (интерфейс занят), {ждем-с}.
- После этого производим пустое чтение регистра приема.
- Пока (буфер передачи не освободился И нет принятого байта) ИЛИ (интерфейс занят), {ждем-с}.
- После этого записываем в регистр передачи.
"

А теперь посмотрите, где у вас есть лишние условия.
Если вы ожидаете завершения приема (а он идет совершенно параллельно с передачей!), то ясен перец, у вас к моменту завершения приема будет уже свободен регистр бля дередачи. И если вы только что прочитали принятый байт, то у вас стопудово интерфейс остановлен и свободен, регистр передачи свободен и в него можно смело записать.

Адрес регистра (буфера) DR один, но там фактически находятся два буфера. Запись и чтение выполяется в разные буферы, находящиеся под одним адресом. И есть еще сдвиговый регистр, недоступный напрямую - из него идет передача байта и в него принимается байт. Передаваемый байт побитно выдвигается на выход, и одновременно со входа в этот же регистр вдвигается принимаемый байт.
Записывая первый раз в DR, мы записываем в буфер передачи, из этого буфера тут же переносится в сдвиговый регистр. Буфер передачи освобождается. Флаг TXE в этом случае пропадает только на короткое время. Как только в сдвиговом регистре появился байт, он начинает передаваться, а не его место приходит принимаемый байт, ну и выставляется флаг занятости BSY. После завершения принятый байт из сдвигового регистра переписывается в буфер приема и выставляется флаг непустого буфера RXNE, и сбрасывается флаг занятости BSY. При этом буфер передачи, если в него ничего не писали, пуст и выставлен флаг TXE.

Вот цэ хааррошая рисунка:
Вложение:
Безымянный.png
Безымянный.png [ 103.24 Кб | Просмотров: 196 ]


А вот це другая рисунка, которая иллюстрирует ситуацию, почему BSY может давать неверную инфу. И заметьте, что это относится только к режиму Slave. И это вполне логично, ведь в слейве всем заправляет мастер со стороны методом подачи CLK сигнала. А он может разрывать байты, делая между ними пауззы.
Вложение:
Безымянный2.png
Безымянный2.png [ 60.32 Кб | Просмотров: 196 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 22:19 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 408
[quote="PriZraK"]Приветствую!

Не получается завести данную флеш на регистрах :( На HAL запустилась сразу
[/code]

Я в свое время тоже не смог взвести на регистрах, хотя на SPL взлетело сразу.
Я придумал универсальный способ разбираться в таких проблемах - снимаю анализатором, потом на регистрах подгоняю картинку.
Конечно надо писать только на регистрах. Любые библиотеки - это мода и зависимость от тех, кто ее написал.
На ребят не обижайся, здесь это нормально, кого-то против шерсти погладить :)))))

Так у меня было написано под stm32f746

Код:
uint8_t m25p80_SPI_write(uint8_t data) {
   while(!(SPI2->SR & SPI_SR_TXE));
   *(__IO uint8_t*)&(SPI2->DR) = data;
   while(!(SPI2->SR & SPI_SR_RXNE));
   data = (uint8_t) SPI2->DR;
   return data;
}

uint8_t SF_read_signature() {
   SF_CS0;
   m25p80_SPI_write(0xAB);
   m25p80_SPI_write(0x0);
   m25p80_SPI_write(0x0);
   m25p80_SPI_write(0x0);
   uint8_t value;
   value = m25p80_SPI_write(0);
   SF_CS1;
   return value;
}

void m25p80_driver_init(void) {

   // S = CS = PB12 H = hold not
   // *******************************************************
   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // Enable GPIOB clock

   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER12)) | (GPIO_MODER_MODER12_0); // PB12 Output for cs SPI2 NSS
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER10)) | GPIO_MODER_MODER10_1; //Select AF mode on PB10 SPI2 SCK
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER14)) | GPIO_MODER_MODER14_1; //Select AF mode on PB14 SPI2 MISO
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER15)) | GPIO_MODER_MODER15_1; //Select AF mode on PB15 SPI2 MOSI

   GPIOB->AFR[1] |= (0x05<<((10-8)*4)); // AF5 for SPI2 signal on PB10
   GPIOB->AFR[1] |= (0x05<<((14-8)*4)); // AF5 for SPI2 signal on PB14
   GPIOB->AFR[1] |= (0x05<<((15-8)*4)); // AF5 for SPI2 signal on PB15


   RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; // Включаем тактирование SPI
   SPI2->CR1 = 0x00;
   SPI2->CR1 |= SPI_CR1_MSTR; // Устанавливаем мастер - режим
   SPI2->CR1 |= SPI_CR1_SSM; // SSM - Software slave management - программное формирование NSS
   SPI2->CR1 |= SPI_CR1_SSI; // SSI - Software (internal) slave select - обеспечить высокий уровень программного NSS
   SPI2->CR1 |= SPI_CR1_BR_0; // Скорость SPI - делитель
   SPI2->CR1 &= ~SPI_CR1_CRCEN; //расчёт контрольной суммы выключен
//   SPI2->CRCPR = 7; // Полином для вычисления CRC
   SPI2->CR1 &= ~SPI_CR1_CPOL; //Полярность тактового сигнала CPOL = 0
   SPI2->CR1 &= ~SPI_CR1_CPHA; //Фаза тактового сигнала CPHA = 0
//   SPI2->CR2 |= SPI_CR2_FRF;
   SPI2->CR2 |= SPI_CR2_FRXTH;

   SPI2->CR2 |= SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0; // Data frame width configuration - 8 bit
   SPI2->CR2 &= ~SPI_CR2_DS_3;             // Data frame width configuration - 8 bit

   SPI2->CR1 &= ~SPI_CR1_LSBFIRST; // MSB передается первым
   SPI2->CR1 |= SPI_CR1_SPE; // Запустить модуль SPI

   if (SF_read_signature()==0x13) {
      SendUsart1((uint32_t)("Flash memory m25p80 is ok\r"));
      uint8_t id[21];
      SF_read_ID(id);

      uint8_t Buf[110];

      itoa(id[0], Buf, 10);
      SendUsart1((uint32_t)("Memory manufacturer id is "));
      SendUsart1((uint32_t)(Buf));
      SendUsart1((uint32_t)("\r"));

      itoa(id[1], Buf, 10);
      SendUsart1((uint32_t)("Memory type is "));
      SendUsart1((uint32_t)(Buf));
      SendUsart1((uint32_t)("\r"));

      itoa(id[2], Buf, 10);
      SendUsart1((uint32_t)("Memory capacity is "));
      SendUsart1((uint32_t)(Buf));
      SendUsart1((uint32_t)("\r"));
       }

}



Было давно, в том проекте память забросил, обошелся внутренней.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 23:40 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
Да уж... Это, пожалуй, рекорд. 19 обращений к SPI2->CR1 для записи одной константы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 23:48 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4787
Откуда: Кемеровская область, Киселевск
Код:
GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER12)) | (GPIO_MODER_MODER12_0); // PB12 Output for cs SPI2 NSS
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER10)) | GPIO_MODER_MODER10_1; //Select AF mode on PB10 SPI2 SCK
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER14)) | GPIO_MODER_MODER14_1; //Select AF mode on PB14 SPI2 MISO
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER15)) | GPIO_MODER_MODER15_1; //Select AF mode on PB15 SPI2 MOSI

   GPIOB->AFR[1] |= (0x05<<((10-8)*4)); // AF5 for SPI2 signal on PB10
   GPIOB->AFR[1] |= (0x05<<((14-8)*4)); // AF5 for SPI2 signal on PB14
   GPIOB->AFR[1] |= (0x05<<((15-8)*4)); // AF5 for SPI2 signal on PB15


Это что ли нормально?

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 30 мар 2020, 23:52 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
Нет, но это не рекорд.

Я сам не смотрел, если честно, но думаю в HAL такого пи...ца не должно быть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 00:35 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4787
Откуда: Кемеровская область, Киселевск
Код:

   GPIOB->MODER |=
   _VAL2FLD(GPIO_MODER_MODER12, 1)     //OUTPUT PB12 SPI2_NSS
   | _VAL2FLD(GPIO_MODER_MODER10, 2)    //AF PB10 SPI2_SCK
   | _VAL2FLD(GPIO_MODER_MODER14, 2)    //AF PB14 SPI2_MISO
   | _VAL2FLD(GPIO_MODER_MODER15, 2);   //AF PB15 SPI2_MOSI


   GPIOB->AFR[1] |=
    _VAL2FLD(GPIO_AFRH_AFRH1, 5)
   | _VAL2FLD(GPIO_AFRH_AFRH5, 5)
   | _VAL2FLD(GPIO_AFRH_AFRH6, 5);


VladislavS SPI ты ему собирай

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 00:47 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
А оно мне надо? Чтобы в ответ обматерили и на голову насрали?

Кстати, с MODER на чистом |= не сработает. У него ненулевое начальное состояние.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 00:57 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4787
Откуда: Кемеровская область, Киселевск
VladislavS почему не сработает? Я знаю B3 B4 JTAG стоят AF после сброса это не мешает добавлять, как раз если не нулевое нужно применять |=, или если раньше настраивался регистр

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 10:06 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
Oxford писал(а):
VladislavS почему не сработает?
В общем случае не сработает.

Oxford писал(а):
Я знаю B3 B4 JTAG стоят AF после сброса
Это в частном случае GPIOB для F3 и F4. А если L-ку какую-нибудь глянуть? Или GPIOA?

Oxford писал(а):
это не мешает добавлять, как раз если не нулевое нужно применять |=
???

Oxford писал(а):
, или если раньше настраивался регистр
Тогда и подавно содержимое MODER неизвестно и на одном |= точно никуда не уедешь. В таком случае будет конструкция MODER = (MODER & ~mask) | value; с возможными оптимизациями.


Последний раз редактировалось VladislavS 31 мар 2020, 13:49, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 10:46 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Блин, Славик до сих пор с инитом ног возится... Да сколько ж можно то. Давно уже пора законченные осмысленные прожэкты делать, а не переставлять биты на ногах. Настройка ног - это одна миллионная от всего проекта, а тут намалёвано уже столько, что...
Разница там в три инструкции, а воды налито - аж овердохуя. Оптимизация в другом месте больше нужна, а не тут. Из практики, зачастую (да практически постоянно) после инита портов и прочего приходится ожидать готовности подключенных компонентов после подачи питания или внешнего сброса. Так что несколько сэкономленных инструкций на фоне нескольких миллисекунд ожидания - это фигня. Такие вот дела, такие дела...


Последний раз редактировалось BusMaster 31 мар 2020, 11:15, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 11:12 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4787
Откуда: Кемеровская область, Киселевск
VladislavS все там работает.
BusMaster ну чел видать развлекается так, может хобби такое

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 12:27 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
Oxford писал(а):
VladislavS все там работает.
Даже если начальное состояние MODER == 0xFFFFFFFF ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 20:36 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4787
Откуда: Кемеровская область, Киселевск
Начальное состояние это 0x00000280, не фантазируй.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 22:22 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
Контроллеры разные бывают, есть и с 0xFFFFFFFF начальным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re: STM32F407ZG и M25P80 (serial Flash memory)
СообщениеДобавлено: 31 мар 2020, 22:33 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
VladislavS писал(а):
Контроллеры разные бывают, есть и с 0xFFFFFFFF начальным.

Почти во всех относительно новых так: L0/L4/L5/G0/G4/H7...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Glebiys


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB