Jump to content

    
Sign in to follow this  
Salamander

Не получается включить writeEnable в QSPI

Recommended Posts

3 день бьюсь, мозги уже опухли

Вот функция

  void QSPI_WriteEnable(void)
{
  QUADSPI_ComConfig_InitTypeDef QUADSPI_ComConfig_InitStructure;
	
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_FMode = QUADSPI_ComConfig_FMode_Indirect_Write;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_DDRMode = QUADSPI_ComConfig_DDRMode_Disable;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_SIOOMode = QUADSPI_ComConfig_SIOOMode_Disable;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_DummyCycles = 0;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_ABSize = QUADSPI_ComConfig_ABSize_8bit;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_ADSize = QUADSPI_ComConfig_ADSize_24bit;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_DMode = QUADSPI_ComConfig_DMode_NoData;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_ADMode = QUADSPI_ComConfig_ADMode_NoAddress;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_ABMode = QUADSPI_ComConfig_ABMode_NoAlternateByte;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_IMode = QUADSPI_ComConfig_IMode_1Line;

  QUADSPI_SetFIFOThreshold(0);
  QUADSPI_SetDataLength(0);
  
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_Ins = WRITE_ENABLE_CMD ; 
  QUADSPI_ComConfig_Init(&QUADSPI_ComConfig_InitStructure);
  while(QUADSPI_GetFlagStatus(QUADSPI_FLAG_BUSY)==SET);

  QUADSPI_AutoPollingMode_Config(0x02,0x02,QUADSPI_PMM_AND);
  QUADSPI_AutoPollingModeStopCmd(ENABLE);
  QUADSPI_SetDataLength(0x00);

  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_FMode = QUADSPI_ComConfig_FMode_Auto_Polling;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_ADMode = QUADSPI_ComConfig_ADMode_NoAddress;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_DMode = QUADSPI_ComConfig_DMode_1Line;
  QUADSPI_ComConfig_InitStructure.QUADSPI_ComConfig_Ins = READ_STATUS_REGISTER_CMD;
  QUADSPI_ComConfig_Init(&QUADSPI_ComConfig_InitStructure); 

  while(QUADSPI_GetFlagStatus(QUADSPI_FLAG_SM)==RESET); // ВОТ ТУТ ВИСНЕТ
	
  QUADSPI_ClearFlag(QUADSPI_FLAG_SM);
  QUADSPI_ClearFlag(QUADSPI_FLAG_TC);
  while(QUADSPI_GetFlagStatus(QUADSPI_FLAG_BUSY)==SET);
	

}

Виснет при проверке одного и флагов....

while(QUADSPI_GetFlagStatus(QUADSPI_FLAG_SM)==RESET);

Сразу оговорюсь - эта функция прекрасно работала на связке F746+w25Q128

А я решил переехать на STM32H743+MT25QL128 - виснет, хоть ты тресни. Пока удалось только инициализировать память и включать MappedMode.

Как с этим бороться?

Share this post


Link to post
Share on other sites
5 часов назад, Salamander сказал:

Сразу оговорюсь - эта функция прекрасно работала на связке F746+w25Q128

А я решил переехать на STM32H743+MT25QL128 - виснет, хоть ты тресни.

Несколько лет назад я писал драйвера для W25Q128 и MT25Q256. Насколько я помню, были какие-то отличия на уровне некоторых команд. Исходников при мне нет, заглянуть не могу. Предлагаю скачать документацию на обе микросхемы, и посмотреть систему команд и адресации.

Share this post


Link to post
Share on other sites
5 hours ago, MrBearManul said:

Предлагаю скачать документацию на обе микросхемы, и посмотреть систему команд и адресации.

Зачитано до дыр.

5 hours ago, MrBearManul said:

Насколько я помню, были какие-то отличия на уровне некоторых команд.

У меня есть проект, сгенерированный кубом, на HAL. С этим проектом при миграции с W25Q на MT25Q нужно просто перепаять микросхему и, кажется, поменять DUMMY_CYCLES.

Алогритм, то есть шаблон, работает с несколько другим кодом.  Мне кажется, что проблема в самой библиотеке, а не в тактике работы с микросхемой.

Короче, в новом кейле версии 5.33, есть DFP версии 2.7.0. А там наконец-то появились и алоритмы под H747 и исходники. Копну там.

Share this post


Link to post
Share on other sites
06.02.2021 в 03:57, Salamander сказал:

Виснет при проверке одного и флагов....

while(QUADSPI_GetFlagStatus(QUADSPI_FLAG_SM)==RESET);

Буквально недавно столкнулся с такой же проблемой. Тоже вис контроллер на проверке этого флага. Что я только не делал: стучал в бубен, исполнял ритуальные танцы, бился головой о стену, плакал...
Случайно выяснил, что если в момент этого зависания коснуться пальцем одной из ножек микросхемы памяти, что была подключена к QSPI интерфейсу, то зависание исчезает и все работает как швейцарские часы. Оказывается, мой случай не был уникальным. Зависания нет, если снять питание с контроллера и подать вновь. Если же просто нажать кнопку Reset (в моем случае это плата Nucleo-144), то зависание будет.

Edited by evgen.05

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this