Я уже несколько дней безуспешно пытаюсь протестировать 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;
}
спасибо