搜索
bottom↓
回复: 5

lpc1788 读写sdram H57V2562GTR 老是通不过

[复制链接]

出0入0汤圆

发表于 2017-5-3 17:06:58 | 显示全部楼层 |阅读模式
初始化如下,只用一片的16bit 32M Bytes的H57V2562,读写测试写一字节,差不多在写0x500000次单字节就会出错,每次出错的字节数不是固定,若是每次按2字节写,差不多在写0x35000次后就出问题,也不是固定次数,若是按4字节写,倒是固定在0x800次后就出错。配置几个关键地方试了不同配置还是不行,不知道还有哪些需要注意。
void SDRAM_32M_16BIT_Init( void )
{
    volatile uint32_t i;
    volatile unsigned long Dummy;
  // Init SDRAM controller
    LPC_SC->PCONP       |= 0x00000800;//使能emc模块

    PINSEL_ConfigPin(2,16,1);      /* P2.16 - /EMC_CAS */
    PINSEL_ConfigPin(2,17,1);      /* P2.17 - /EMC_RAS */
    PINSEL_ConfigPin(2,18,1);      /* P2.18 - EMC_CLK[0] */
    PINSEL_ConfigPin(2,20,1);      /* P2.20 - EMC_DYCS0 */
    PINSEL_ConfigPin(2,24,1);      /* P2.24 - EMC_CKE0 */
    PINSEL_ConfigPin(2,28,1);      /* P2.28 - EMC_DQM0 */
    PINSEL_ConfigPin(2,29,1);      /* P2.29 - EMC_DQM1 */
    PINSEL_ConfigPin(4,25,1);      /* P4.25 - /EMC_WE */

    for(i = 0; i < 16; i++)
    {
        PINSEL_ConfigPin(3,i,1);   /* P3.0-P3.15 - EMC_D[0-15] */
    }

    for(i = 0; i < 15; i++)
    {
        PINSEL_ConfigPin(4,i,1);   /* P4.0-P4.14 - EMC_A[0-14] */
    }

   
  
//设置命令延迟时间 芯片数据手册上有标准
    LPC_SC->EMCDLYCTL |= (8<<0);
   //设置输入数据采样延迟
    LPC_SC->EMCDLYCTL |=(8<<8);
    //设置时钟输出延迟
    LPC_SC->EMCDLYCTL |= (0x08 <<16);
   LPC_SC->EMCDLYCTL=0x4|(0x4<<8)|(0x4<<16)|(0x4<<24);
   //使能emc 正常地址映射 正常模式非低功耗模式
    LPC_EMC->Control =1;
     //读取配置设置为命令延迟策略
    LPC_EMC->DynamicReadConfig = 1;
       //设置ras延时为3个clk cas延时为3 以下设置都需要根据SDRAM数据手册来设置
    LPC_EMC->DynamicRasCas0 = 0;
    LPC_EMC->DynamicRasCas0 |=(3<<8);
    LPC_EMC->DynamicRasCas0 |= (3<<0);
   
    LPC_EMC->DynamicRP = P2C(SDRAM_TRP);
    LPC_EMC->DynamicRAS = P2C(SDRAM_TRAS);
    LPC_EMC->DynamicSREX = P2C(SDRAM_TXSR);
    LPC_EMC->DynamicAPR = SDRAM_TAPR;
    LPC_EMC->DynamicDAL = SDRAM_TDAL+P2C(SDRAM_TRP);
    LPC_EMC->DynamicWR = SDRAM_TWR;
    LPC_EMC->DynamicRC = P2C(SDRAM_TRC);
    LPC_EMC->DynamicRFC = P2C(SDRAM_TRFC);
    LPC_EMC->DynamicXSR =P2C(SDRAM_TXSR);
    LPC_EMC->DynamicRRD = P2C(SDRAM_TRRD);
    LPC_EMC->DynamicMRD = SDRAM_TMRD;

    //选择cs0的配置
    /*
    16bit  256 Mb (16Mx16), 4 banks, row length = 13, column length = 9*/
    LPC_EMC->DynamicConfig0 = 0x0000680;

    //时钟受高电平驱动,clkout持续运行  发出nop命令
    LPC_EMC->DynamicControl = 0x0183;
    //等待一段时间让sdram启动
    for(i= 200*40; i;i--);
    //发布pall指令,预充电
    LPC_EMC->DynamicControl = 0x0103;

    //首先设置动态刷新周期为32个clk
    LPC_EMC->DynamicRefresh = 2;
    //等待至少128个clk
    for(i= 256; i; --i); // > 128 clk
    //设置新的动态刷新周期
    LPC_EMC->DynamicRefresh = P2C(SDRAM_REFRESH) >> 4;

    //发布mode指令
    LPC_EMC->DynamicControl    = 0x00000083;
    //进行一次伪读取
    Dummy = *((volatile uint32_t  *)(SDRAM_BASE_ADDR | (0x33<<12)));

    // 进入normal模式 自刷新时钟禁止 空闲时钟禁止 正常操作非掉电
    LPC_EMC->DynamicControl = 0x0000;
    //使能芯片缓冲
    LPC_EMC->DynamicConfig0 |=(1<<19);
    for(i = 100000; i;i--);

  

}
#endif

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入10汤圆

发表于 2017-5-3 18:47:33 | 显示全部楼层
看描述好像是地址线的问题。

出0入0汤圆

 楼主| 发表于 2017-5-4 08:22:07 | 显示全部楼层
地址线每根也都单独测试信号,也都有

出0入0汤圆

 楼主| 发表于 2017-5-4 13:23:16 | 显示全部楼层
怀疑是硬件地址有问题,我把地址从0xA0000000改为0xA0400000,照样差不多到0x5xxxx个字节就会读出来有问题,按32bit来写,固定是写0x800次就出错

出0入0汤圆

 楼主| 发表于 2017-5-5 16:35:38 | 显示全部楼层
好了,焊接问题

出0入8汤圆

发表于 2017-5-5 17:50:58 | 显示全部楼层

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 11:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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