OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3994|回复: 21

STM32F429SDRAM数据无法保持问题

[复制链接]

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
发表于 2020-3-4 09:05:22 | 显示全部楼层 |阅读模式
1金钱
我使用的是原子哥提供SDRAM驱动文件.配置和原子哥的一样,PCB板子是我自己做的.
  1. void SDRAM_Init(void)
  2. {
  3.     uint32_t temp=0;
  4.     FMC_SDRAM_TimingTypeDef SDRAM_Timing;
  5.                                                      
  6.     SDRAM_Handler.Instance=FMC_SDRAM_DEVICE;                                  //SDRAM在BANK5,6 FMC_Bank5_6
  7.     SDRAM_Handler.Init.SDBank=FMC_SDRAM_BANK1;                           //SDRAM接在BANK5上
  8.     SDRAM_Handler.Init.ColumnBitsNumber=FMC_SDRAM_COLUMN_BITS_NUM_9;     //列数量
  9.     SDRAM_Handler.Init.RowBitsNumber=FMC_SDRAM_ROW_BITS_NUM_13;          //行数量
  10.     SDRAM_Handler.Init.MemoryDataWidth=FMC_SDRAM_MEM_BUS_WIDTH_16;       //数据宽度为16位
  11.     SDRAM_Handler.Init.InternalBankNumber=FMC_SDRAM_INTERN_BANKS_NUM_4;  //一共4个BANK
  12.     SDRAM_Handler.Init.CASLatency=FMC_SDRAM_CAS_LATENCY_3;               //CAS为3
  13.     SDRAM_Handler.Init.WriteProtection=FMC_SDRAM_WRITE_PROTECTION_DISABLE;//失能写保护
  14.     SDRAM_Handler.Init.SDClockPeriod=FMC_SDRAM_CLOCK_PERIOD_2;           //SDRAM时钟为HCLK/2=180M/2=90M=11.1ns
  15.     SDRAM_Handler.Init.ReadBurst=FMC_SDRAM_RBURST_ENABLE;                //使能突发
  16.     SDRAM_Handler.Init.ReadPipeDelay=FMC_SDRAM_RPIPE_DELAY_1;            //读通道延时
  17.    
  18.     SDRAM_Timing.LoadToActiveDelay=2;                                   //加载模式寄存器到激活时间的延迟为2个时钟周期
  19.     SDRAM_Timing.ExitSelfRefreshDelay=8;                                //退出自刷新延迟为8个时钟周期
  20.     SDRAM_Timing.SelfRefreshTime=6;                                     //自刷新时间为6个时钟周期                                 
  21.     SDRAM_Timing.RowCycleDelay=6;                                       //行循环延迟为6个时钟周期
  22.     SDRAM_Timing.WriteRecoveryTime=2;                                   //恢复延迟为2个时钟周期
  23.     SDRAM_Timing.RPDelay=2;                                             //行预充电延迟为2个时钟周期
  24.     SDRAM_Timing.RCDDelay=2;                                            //行到列延迟为2个时钟周期
  25.     HAL_SDRAM_Init(&SDRAM_Handler,&SDRAM_Timing);  
  26.    
  27.     //SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM
  28.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_CLK_ENABLE,1,0); //时钟配置使能
  29.     HAL_Delay(1);                                  //至少延时200us
  30.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_PALL,1,0);       //对所有存储区预充电
  31.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_AUTOREFRESH_MODE,8,0);//设置自刷新次数 8
  32.     //配置模式寄存器,SDRAM的bit0~bit2为指定突发访问的长度,
  33.         //bit3为指定突发访问的类型,bit4~bit6为CAS值,bit7和bit8为运行模式
  34.         //bit9为指定的写突发模式,bit10和bit11位保留位
  35.         temp=(uint32_t)SDRAM_MODEREG_BURST_LENGTH_4          |        //设置突发长度:1(可以是1/2/4/8)
  36.               SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |        //设置突发类型:连续(可以是连续/交错)
  37.               SDRAM_MODEREG_CAS_LATENCY_2           |        //设置CAS值:3(可以是2/3)
  38.               SDRAM_MODEREG_OPERATING_MODE_STANDARD |   //设置操作模式:0,标准模式
  39.               SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;     //设置突发写模式:1,单点访问
  40.     SDRAM_Send_Cmd(0,FMC_SDRAM_CMD_LOAD_MODE,1,temp);   //设置SDRAM的模式寄存器
  41.    
  42.     //刷新频率计数器(以SDCLK频率计数),计算方法:
  43.         //COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
  44.     //我们使用的SDRAM刷新周期为64ms,SDCLK=180/2=90Mhz,行数为8192(2^13).
  45.         //所以,COUNT=64*1000*90/8192-20=683
  46.         HAL_SDRAM_ProgramRefreshRate(&SDRAM_Handler,683);
  47. }
复制代码
下面是测试初使化代码
  1. uint8_t aa  = 100;
  2.   FMC_SDRAM_WriteBuffer(&aa,0,1);
  3.   uint8_t bb = 0 ;
  4.     FMC_SDRAM_ReadBuffer(&bb,0,1);
  5.     printf("Address:%p,Value:%d.\r\n",&bb,bb);
复制代码
下面是每两秒读取一次的代码

  1. void StartDefaultTask(void *argument)
  2. {
  3.   /* USER CODE BEGIN 5 */
  4.   /* Infinite loop */
  5. // uint16_t aa = 1000;
  6.   for(;;)
  7.   {
  8.     HAL_GPIO_WritePin(GPIOI, GPIO_PIN_11, GPIO_PIN_RESET);
  9.     osDelay(1000);
  10.     uint8_t bb = 0 ;
  11.    
  12.     FMC_SDRAM_ReadBuffer(&bb,0,1);
  13.     printf("Address:%p,Value:%d.\r\n",&bb,bb);
  14.     HAL_GPIO_WritePin(GPIOI, GPIO_PIN_11, GPIO_PIN_SET);
  15.     osDelay(1000);
  16.   }
  17.   /* USER CODE END 5 */
  18. }
复制代码
现在现象就是第一次写了立马读数据是100,正确的,2秒后再读数据就变成255了.
SDRAMtest.png
SDRAM硬件数据和地址线,我都等长走线了.
请问这样的数据无法保持问题是参数问题,还是硬件问题呢?
如果是参数问题,应该怎么配置呢?
谢谢

最佳答案

查看完整内容[请看2#楼]

那这个差距是不会有问题才对的。 看下各个信号是否正常 吧, 只能慢慢调试了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-4 09:05:23 | 显示全部楼层
nczywqq 发表于 2020-3-26 09:35
2000mil 不是50MM吗,
刚仔细看了下线长,数据线是2600mil = 66MM,地址线是3100Mil = 78MM.

那这个差距是不会有问题才对的。
看下各个信号是否正常 吧, 只能慢慢调试了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-4 14:10:07 | 显示全部楼层
有没有大佬,帮帮忙呀
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10566
金钱
10566
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-3-4 15:16:53 | 显示全部楼层
没有遇到过这种问题你,帮顶~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-5 01:01:57 | 显示全部楼层
示波器看看各个信号是否正常,另外建议先测试下SDRAM容量和读写是否正常。
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-5 19:30:09 | 显示全部楼层
正点原子 发表于 2020-3-5 01:01
示波器看看各个信号是否正常,另外建议先测试下SDRAM容量和读写是否正常。

读写测试了,正常的,最后一张截图,就是,只是数据会消失,请问原子哥,示波器,看哪些信号线的波形呢.刚买了个逻辑分析仪器
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-6 01:08:19 | 显示全部楼层
nczywqq 发表于 2020-3-5 19:30
读写测试了,正常的,最后一张截图,就是,只是数据会消失,请问原子哥,示波器,看哪些信号线的波形呢.刚买了个 ...

读写测试都能通过,不可能会丢失数据啊
你定义u32数组,从0写到容量结束,然后重新读取,看是否正确
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-10 12:27:06 | 显示全部楼层
正点原子 发表于 2020-3-6 01:08
读写测试都能通过,不可能会丢失数据啊
你定义u32数组,从0写到容量结束,然后重新读取,看是否正确

我用逻辑分析仪测了波形,数据线读的时候没有变化,写数据时,数据线有些有变化 ,有些没有变化 ,应该是硬件问题,至于,为什么第一次写了,马上读是正确的,我也不知道原因
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-13 16:30:19 | 显示全部楼层
正点原子 发表于 2020-3-6 01:08
读写测试都能通过,不可能会丢失数据啊
你定义u32数组,从0写到容量结束,然后重新读取,看是否正确

原子哥,我把硬件上SDRAM上所有线都用万用表测量过了,通的,也是正确的,我应该从哪方面来查原因呢.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-14 00:52:47 | 显示全部楼层
nczywqq 发表于 2020-3-10 12:27
我用逻辑分析仪测了波形,数据线读的时候没有变化,写数据时,数据线有些有变化 ,有些没有变化 ,应该是硬件 ...

读写 sdram, 结果是怎么样的 ?

从0 写到32M
然后从0读取到32M,数据是啥样的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-14 20:09:00 | 显示全部楼层
正点原子 发表于 2020-3-14 00:52
读写 sdram, 结果是怎么样的 ?

从0 写到32M

读出来,全是255,读的时候数据线没有任何电平变化.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-15 00:43:04 | 显示全部楼层
nczywqq 发表于 2020-3-14 20:09
读出来,全是255,读的时候数据线没有任何电平变化.

那说明根本就没写进去过。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-18 15:48:52 | 显示全部楼层
正点原子 发表于 2020-3-15 00:43
那说明根本就没写进去过。。。

就是不知道,到底是没写进去,还是数据没有保持住.头疼
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-19 01:01:02 | 显示全部楼层
nczywqq 发表于 2020-3-18 15:48
就是不知道,到底是没写进去,还是数据没有保持住.头疼

比如写100个数据,读取100个数据出来,看正常不?
如果不正常,找硬件问题先。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-19 16:57:16 | 显示全部楼层
正点原子 发表于 2020-3-19 01:01
比如写100个数据,读取100个数据出来,看正常不?
如果不正常,找硬件问题先。

我把SDRAM都拆了,和没焊SDRAM一样,证明还是硬件问题,我在从重做板子了,感谢原子哥
回复

使用道具 举报

2

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2020-3-13
在线时间
24 小时
发表于 2020-3-19 22:18:18 | 显示全部楼层
明显自刷新周期过长嘛,或者你压根没设置自刷新,SDRAM需要隔一断时间刷新一次,不然数据会消失的
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-25 08:51:54 | 显示全部楼层
for人生 发表于 2020-3-19 22:18
明显自刷新周期过长嘛,或者你压根没设置自刷新,SDRAM需要隔一断时间刷新一次,不然数据会消失的

设置了,用的原子哥一样的代码,估计是布线有问题
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-25 09:30:44 | 显示全部楼层
nczywqq 发表于 2020-3-19 16:57
我把SDRAM都拆了,和没焊SDRAM一样,证明还是硬件问题,我在从重做板子了,感谢原子哥

布线.png 原子哥,我上次板子我看了下布线长度已经到2000Mil了,SDRAM的地址、数据、时钟。有没有要求必须要等长呢。我现在把SDRAM放在MCU背面,等长后,最长还是有要求在1023Mil.
还请原子哥,指点一下。



回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-26 01:06:14 | 显示全部楼层
nczywqq 发表于 2020-3-25 09:30
原子哥,我上次板子我看了下布线长度已经到2000Mil了,SDRAM的地址、数据、时钟。有没有要求必须要等长 ...

50cm????
你这是怎么走的线啊。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-3-26 09:35:18 | 显示全部楼层
正点原子 发表于 2020-3-26 01:06
50cm????
你这是怎么走的线啊。。。。

2000mil 不是50MM吗,
刚仔细看了下线长,数据线是2600mil = 66MM,地址线是3100Mil = 78MM.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-27 01:18:43 | 显示全部楼层
nczywqq 发表于 2020-3-26 09:35
2000mil 不是50MM吗,
刚仔细看了下线长,数据线是2600mil = 66MM,地址线是3100Mil = 78MM.

额,我算错了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-12-4
在线时间
25 小时
 楼主| 发表于 2020-4-25 21:03:15 | 显示全部楼层
正点原子 发表于 2020-3-27 01:19
那这个差距是不会有问题才对的。
看下各个信号是否正常 吧, 只能慢慢调试了。

新硬件做回来了,可以用了,信号我这次没有严格等长,以前那个实在是调不出来.
想再问下原子哥,ST的IIC库函数,在STM32D429上还是不好用吗?
  1. HAL_I2C_Mem_Write(&hi2c2,0xA0,255,I2C_MEMADD_SIZE_8BIT,&b,1,1000);
复制代码

我写多个字节,写不进,多字节读没问题.难道只能自己用IO口来模拟读写吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-2 09:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表