首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有AS4C4M32S SDRAM的STM32F469只能写入第一个字节

带有AS4C4M32S SDRAM的STM32F469只能写入第一个字节
EN

Stack Overflow用户
提问于 2021-04-13 12:58:46
回答 1查看 113关注 0票数 0

我已经制作了一个定制板,它具有与AS4C4M32S SDRAM耦合的STM32F469NI单片机。

以下是SDRAM时序和寄存器设置信息:

代码语言:javascript
复制
hsdram1.Instance = FMC_SDRAM_DEVICE;
  /* hsdram1.Init */
  hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32;
  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_DISABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
  /* SdramTiming */
  SdramTiming.LoadToActiveDelay = 2;
  SdramTiming.ExitSelfRefreshDelay = 7;
  SdramTiming.SelfRefreshTime = 4;
  SdramTiming.RowCycleDelay = 6;
  SdramTiming.WriteRecoveryTime = 2;
  SdramTiming.RPDelay = 2;
  SdramTiming.RCDDelay = 2;
 
  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
  {
    Error_Handler( );
  }
 
  /* USER CODE BEGIN FMC_Init 2 */
 
    FMC_SDRAM_CommandTypeDef cmd = { 0 };
 
    cmd.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
    cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
    cmd.AutoRefreshNumber = 1;
    cmd.ModeRegisterDefinition = 0;
    HAL_SDRAM_SendCommand(&hsdram1, &cmd, 0xFFFF);
 
    HAL_Delay(100);
 
    cmd.CommandMode = FMC_SDRAM_CMD_PALL;
    cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
    cmd.AutoRefreshNumber = 1;
    cmd.ModeRegisterDefinition = 0;
    HAL_SDRAM_SendCommand(&hsdram1, &cmd, 0xFFFF);
 
 
    cmd.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
    cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
    cmd.AutoRefreshNumber = 8;
    cmd.ModeRegisterDefinition = 0;
    HAL_SDRAM_SendCommand(&hsdram1, &cmd, 0xFFFF);
 
 
    cmd.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
    cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
    cmd.AutoRefreshNumber = 1;
    cmd.ModeRegisterDefinition = (uint32_t) 0x230; //also tried 0x231
    HAL_SDRAM_SendCommand(&hsdram1, &cmd, 0xFFFF);
 
 
 
    //Setup SDRAM Refresh Timer Register with the delay between refresh cycles of the SDRAM, this is SDRAM specific.
    HAL_SDRAM_ProgramRefreshRate(&hsdram1, 1404); //Tried 1386

此代码在STM32F469-I DISCOVERY board上运行时可以正常运行,但在我的自定义载板上运行时会失败。

在我的电路板上,每当我写入任何SDRAM地址时,只读/写第一个字节,例如,当我将0x00写入地址0xC0000000时,该地址在调试时的数据包含0x48129100,即前3个字节是随机垃圾,只有最后一个字节被正确写入(0x00),假设如果我将0xAA写入相同的地址,则被监控的数据包含值0x481291AA。

对于我从外部SDRAM读取/写入的每个地址都是如此。

只有最后一个字节是写/读的。

自定义电路板原理图和PCB布局与STM32F469-I DISCO板相同。

唯一不同的是内存芯片,而不是微米之一是联盟内存的AS4C4M32S。

这样的问题会有什么问题呢?

EN

回答 1

Stack Overflow用户

发布于 2021-04-13 14:39:47

读取SDRAM始终使用全位宽,但写入需要设置四个信号BL0、BL1、BL2和BL3,以说明要写入哪些字节。

听起来目前只有BL0在工作。可能BL1-3没有物理连接(硬件),或者您只是忘记配置它们(软件)。

(如果事实证明是硬件问题,那么具有适当权限的人将希望将此问题和答案转移到电子堆栈交换)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67068975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档