新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2019-12-4
- 在线时间
- 25 小时
|
1金钱
我使用的是原子哥提供SDRAM驱动文件.配置和原子哥的一样,PCB板子是我自己做的.
- void SDRAM_Init(void)
- {
- uint32_t temp=0;
- FMC_SDRAM_TimingTypeDef SDRAM_Timing;
-
- SDRAM_Handler.Instance=FMC_SDRAM_DEVICE; //SDRAM在BANK5,6 FMC_Bank5_6
- SDRAM_Handler.Init.SDBank=FMC_SDRAM_BANK1; //SDRAM接在BANK5上
- SDRAM_Handler.Init.ColumnBitsNumber=FMC_SDRAM_COLUMN_BITS_NUM_9; //列数量
- SDRAM_Handler.Init.RowBitsNumber=FMC_SDRAM_ROW_BITS_NUM_13; //行数量
- SDRAM_Handler.Init.MemoryDataWidth=FMC_SDRAM_MEM_BUS_WIDTH_16; //数据宽度为16位
- SDRAM_Handler.Init.InternalBankNumber=FMC_SDRAM_INTERN_BANKS_NUM_4; //一共4个BANK
- SDRAM_Handler.Init.CASLatency=FMC_SDRAM_CAS_LATENCY_3; //CAS为3
- SDRAM_Handler.Init.WriteProtection=FMC_SDRAM_WRITE_PROTECTION_DISABLE;//失能写保护
- SDRAM_Handler.Init.SDClockPeriod=FMC_SDRAM_CLOCK_PERIOD_2; //SDRAM时钟为HCLK/2=180M/2=90M=11.1ns
- SDRAM_Handler.Init.ReadBurst=FMC_SDRAM_RBURST_ENABLE; //使能突发
- SDRAM_Handler.Init.ReadPipeDelay=FMC_SDRAM_RPIPE_DELAY_1; //读通道延时
-
- SDRAM_Timing.LoadToActiveDelay=2; //加载模式寄存器到激活时间的延迟为2个时钟周期
- SDRAM_Timing.ExitSelfRefreshDelay=8; //退出自刷新延迟为8个时钟周期
- SDRAM_Timing.SelfRefreshTime=6; //自刷新时间为6个时钟周期
- SDRAM_Timing.RowCycleDelay=6; //行循环延迟为6个时钟周期
- SDRAM_Timing.WriteRecoveryTime=2; //恢复延迟为2个时钟周期
- SDRAM_Timing.RPDelay=2; //行预充电延迟为2个时钟周期
- SDRAM_Timing.RCDDelay=2; //行到列延迟为2个时钟周期
- HAL_SDRAM_Init(&SDRAM_Handler,&SDRAM_Timing);
-
- //SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0); //时钟配置使能
- HAL_Delay(1); //至少延时200us
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_PALL,1,0); //对所有存储区预充电
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_AUTOREFRESH_MODE,8,0);//设置自刷新次数 8
- //配置模式寄存器,SDRAM的bit0~bit2为指定突发访问的长度,
- //bit3为指定突发访问的类型,bit4~bit6为CAS值,bit7和bit8为运行模式
- //bit9为指定的写突发模式,bit10和bit11位保留位
- temp=(uint32_t)SDRAM_MODEREG_BURST_LENGTH_4 | //设置突发长度:1(可以是1/2/4/8)
- SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | //设置突发类型:连续(可以是连续/交错)
- SDRAM_MODEREG_CAS_LATENCY_2 | //设置CAS值:3(可以是2/3)
- SDRAM_MODEREG_OPERATING_MODE_STANDARD | //设置操作模式:0,标准模式
- SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; //设置突发写模式:1,单点访问
- SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_LOAD_MODE,1,temp); //设置SDRAM的模式寄存器
-
- //刷新频率计数器(以SDCLK频率计数),计算方法:
- //COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
- //我们使用的SDRAM刷新周期为64ms,SDCLK=180/2=90Mhz,行数为8192(2^13).
- //所以,COUNT=64*1000*90/8192-20=683
- HAL_SDRAM_ProgramRefreshRate(&SDRAM_Handler,683);
- }
复制代码 下面是测试初使化代码- uint8_t aa = 100;
- FMC_SDRAM_WriteBuffer(&aa,0,1);
- uint8_t bb = 0 ;
- FMC_SDRAM_ReadBuffer(&bb,0,1);
- printf("Address:%p,Value:%d.\r\n",&bb,bb);
复制代码 下面是每两秒读取一次的代码
- void StartDefaultTask(void *argument)
- {
- /* USER CODE BEGIN 5 */
- /* Infinite loop */
- // uint16_t aa = 1000;
- for(;;)
- {
- HAL_GPIO_WritePin(GPIOI, GPIO_PIN_11, GPIO_PIN_RESET);
- osDelay(1000);
- uint8_t bb = 0 ;
-
- FMC_SDRAM_ReadBuffer(&bb,0,1);
- printf("Address:%p,Value:%d.\r\n",&bb,bb);
- HAL_GPIO_WritePin(GPIOI, GPIO_PIN_11, GPIO_PIN_SET);
- osDelay(1000);
- }
- /* USER CODE END 5 */
- }
复制代码 现在现象就是第一次写了立马读数据是100,正确的,2秒后再读数据就变成255了.
SDRAM硬件数据和地址线,我都等长走线了.
请问这样的数据无法保持问题是参数问题,还是硬件问题呢?
如果是参数问题,应该怎么配置呢?
谢谢
|
|