|

楼主 |
发表于 2016-10-24 14:06:18
|
显示全部楼层
回 eric2013 的帖子
eric2013:这个就是你上次说的,采用两个16位的组成32位的那个测试吗。 (2016-10-24 11:46)  是的啊,目前测试 32位模式没有问题,就是16位、8位不行,但是 16/8位单独读写貌似又可以
配置如下:
/* 两片 MT48LC32M16(数据宽度16位) 组合成为 一片 MT48LC32M32(即把两片16位的组合成32位宽的)*/
void MX_FMC_Init(void)
{
FMC_SDRAM_TimingTypeDef SdramTiming;
hsdram1.Instance = FMC_SDRAM_DEVICE; //SDRAM在BANK5,6
/* hsdram1.Init */
hsdram1.Init.SDBank = FMC_SDRAM_BANK1; // SDRAM接在BANK5上
hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; // 列地址线数目
hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; // 行地址线数目
hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32; // 数据宽度 32位
hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; // 一共4个BANK
hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2; // CAS为3
hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; // 写保护禁止
hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; // SDRAM时钟为HCLK/2
hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; // 使能突发读
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; // 定义在CAS个延时后在等待多少个HCLK时钟才读取数据
/* SdramTiming */
SdramTiming.LoadToActiveDelay = 2; // TMDR 加载模式寄存器到激活时间的延迟为2个时钟周期
SdramTiming.ExitSelfRefreshDelay = 6; // TXSR 退出自刷新延迟为x个时钟周期
SdramTiming.SelfRefreshTime = 4; // TRAS 自刷新时间为x个时钟周期
SdramTiming.RowCycleDelay = 6; // TRC 行循环延迟为x个时钟周期
SdramTiming.WriteRecoveryTime = 2; // TWR 恢复延迟为x个时钟周期
SdramTiming.RPDelay = 2; // TRP 行预充电延迟为x个时钟周期
SdramTiming.RCDDelay = 2; // TRCD 行到列延迟为x个时钟周期
if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
{
Error_Handler();
}
BSP_SDRAM_Initialization_Sequence( &hsdram1 );
}
#define SDRAM_TIMEOUT ((uint32_t)0xFFFF)
#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200)
// 执行外部存储器SDRAM的初始化序列
/**
* @brief Perform the SDRAM external memory initialization sequence
* @param hsdram: SDRAM handle
* @param Command: Pointer to SDRAM command structure
* @retval None
*/
void BSP_SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram )
{
FMC_SDRAM_CommandTypeDef Command;
__IO uint32_t tmpmrd =0;
/* Step 1: Configure a clock configuration enable command */
Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, &Command, 0x1000);
/* Step 2: Insert 100 us minimum delay */
/* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
HAL_Delay(100);
/* Step 3: Configure a PALL (precharge all) command */
Command.CommandMode = FMC_SDRAM_CMD_PALL;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, &Command, 0x1000);
HAL_Delay(100);
/* Step 4 : Configure a Auto-Refresh command */
Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 8;
Command.ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, &Command, 0x1000);
HAL_Delay(100);
/* Step 5: Program the external memory mode register */
tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
SDRAM_MODEREG_CAS_LATENCY_2 |
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = tmpmrd;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, &Command, 0x1000);
HAL_Delay(100);
/* Step 6: Set the refresh rate counter */
/* (15.62 us x Freq) - 20 */
/* Set the device refresh counter */
hsdram->Instance->SDRTR |= ((uint32_t)((1292)<< 1)); // 1292 这个1292是官网的,我目前也不知道这个数据是怎么来的 ?? 望指教啊 !!!
HAL_Delay(100);
} |
|