SDRAM STM32 не отвечает - PullRequest
       142

SDRAM STM32 не отвечает

0 голосов
/ 13 апреля 2020

Я уже несколько дней безуспешно пытаюсь протестировать SDRAM на STM32F429IG (Keil), я использую FM C и HAL / STMCUBEMX, номер детали для моей SDRAM IS: MT48LC16M16 ( 32 МБ / 256 МБ) микросхема имеет 16-разрядную ширину данных и содержит 4 банка по 8192 строки по 512 столбцов в каждом блоке шириной 2 байта. это мои настройки:

void MX_FMC_Init(void)
{
  FMC_SDRAM_TimingTypeDef SdramTiming = {0};

  /** Perform the SDRAM1 memory initialization sequence
  */
  hsdram1.Instance = FMC_SDRAM_DEVICE;
  /* hsdram1.Init */
  hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
  hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
  hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
  /* SdramTiming */
  SdramTiming.LoadToActiveDelay = 2;
  SdramTiming.ExitSelfRefreshDelay = 7;
  SdramTiming.SelfRefreshTime = 6;
  SdramTiming.RowCycleDelay = 6;
  SdramTiming.WriteRecoveryTime = 5;
  SdramTiming.RPDelay = 2;
  SdramTiming.RCDDelay = 2;

  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
  {
    Error_Handler( );
  }
}

и это мой основной файл:

uint16_t write_a = 's';
uint16_t read_a = 0x0000;
while(1){
    HAL_Delay(200);
    HAL_SDRAM_WriteProtection_Disable(&hsdram1);    
    if(HAL_OK==HAL_SDRAM_Write_16b(&hsdram1,(uint32_t *) 0XC0000000,&write_a,1))
    HAL_UART_Transmit(&huart1,(uint8_t *) "WRITEOK\n",8,500);
    /////READING    
    HAL_Delay(200);
    HAL_UART_Transmit(&huart1,(uint8_t *) "READST\n",7,500);
    if(HAL_OK==HAL_SDRAM_Read_16b(&hsdram1,(uint32_t *) 0XC0000000,&read_a,1))
        HAL_UART_Transmit(&huart1,(uint8_t *) "READOK\n",7,500);
    else
        HAL_UART_Transmit(&huart1,(uint8_t *) "READNK\n",7,500);
    ///SENDING DATA BY UART
    HAL_UART_Transmit(&huart1,(uint8_t *) read,10,500);
    HAL_Delay(100);
    if(write_a==read_a)
    HAL_UART_Transmit(&huart1,(uint8_t *) "DATAOK\n",7,500);
}

на плате был пример, который работает нормально, но это не HAL, я даже проверил пример F429 при обнаружении, но дает мне ту же проблему. числа синхронизации были проверены на примере, который исходил от производителя платы, поэтому я уверен, что аппаратное обеспечение и время правильно (я проверил это также с таблицей данных)

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

Я получаю «WRITEOK» и «READST» в последовательном порту моего компьютера, но не намного, кажется, что весь микроконтроллер зависает, когда он доходит до чтения

Я искал его, и это точная строка микроконтроллера.

*pDstBuffer = *(__IO uint16_t *)pSdramAddress;  

внутри файла HAL_SDRAM, код для этого блока:

HAL_StatusTypeDef HAL_SDRAM_Read_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize)
{
  __IO uint16_t *pSdramAddress = (uint16_t *)pAddress;

  /* Process Locked */
  __HAL_LOCK(hsdram);

  /* Check the SDRAM controller state */
  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
  {
    return HAL_BUSY;
  }
  else if(hsdram->State == HAL_SDRAM_STATE_PRECHARGED)
  {
    return  HAL_ERROR; 
  }  

  /* Read data from source */
  for(; BufferSize != 0U; BufferSize--)
  {
    *pDstBuffer = *(__IO uint16_t *)pSdramAddress;  
    pDstBuffer++;
    pSdramAddress++;               
  }

  /* Process Unlocked */
  __HAL_UNLOCK(hsdram);       

  return HAL_OK; 
}

спасибо

...