搜索
bottom↓
回复: 18

求助:LPC1788驱动SDRAM遇到问题

[复制链接]

出0入0汤圆

发表于 2012-5-8 16:10:24 | 显示全部楼层 |阅读模式
好几天了,愁啊……
我做了一块板子LPC1788,SDRAM是HY57V641620F,简单测试的时候发现一个奇怪现象:往SDRAM里写32个16位的数据,没问题。可当超过32个数据时,内存数据竟然变化了。见下图
脱离仿真器我也试了,也是出错(通过串口调试出来);速度改为60MHz也不行;线都量了一遍,都通的;每个时序都对过很多次了,不行,用sk开发板上的历程也不行;把flash拆了,也不行(flash是可以读写的);我真不知道是什么原因了,现在主要怀疑布线的问题,或者是SDRAM是次品,准备再买点别的品牌的了。各位网友有什么好的建议吗,谢谢了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-8 16:11:32 | 显示全部楼层
你用什么命令写的哈?

出0入0汤圆

发表于 2012-5-8 16:17:14 | 显示全部楼层
LZ可以使用JLINK直接写》64字节的SDRAM,看看其他地方是否有变化!

出0入0汤圆

 楼主| 发表于 2012-5-8 16:31:22 | 显示全部楼层
microcreat 发表于 2012-5-8 16:11
你用什么命令写的哈?

第二张图片就是用下面来写的,把64改为32就是写第一张图片了
    wr_ptr = (uint32_t *)SDRAM_BASE_ADDR;
    char_wr_ptr = (uint8_t *)(wr_ptr);
    short_wr_ptr = (uint16_t *)wr_ptr;
    for ( i= 0; i < SDRAM_SIZE/4; i++ )
    {
          *wr_ptr++ = 0;
    }
        for(i=0;i<0x0000ffff;i++);          为了模拟断点 我还故意加了一些延时   
        for(i=0;i<0x0000ffff;i++);
        for(i=0;i<0x0000ffff;i++);
        for(i=0;i<0x0000ffff;i++);
    for (i=0; i<64; i++)        
     *short_wr_ptr++=i;

出0入0汤圆

发表于 2012-5-8 18:37:59 | 显示全部楼层
你的i是什么类型的哈!

出0入0汤圆

 楼主| 发表于 2012-5-9 11:30:29 | 显示全部楼层
microcreat 发表于 2012-5-8 18:37
你的i是什么类型的哈!

static u32 i;

出0入0汤圆

发表于 2012-5-10 09:46:01 | 显示全部楼层
这个错误看起来很有规律啊,而且遭殃的只是被16除余数大于等于8的地址。像是硬件的问题,看起来像是A3,A5地址线或者SDRAM芯片的问题吧。
读取SDRAM不会有问题吧?
另外,SDRAM的初始化程序贴出来给大家看一下。
LPC177x_8x的EMC有一个EMCDLYCTL寄存器也很重要,是编程延迟时间的,这个数值也得实验地获取,你可以试试不同的值。

出0入0汤圆

发表于 2012-5-10 17:53:47 | 显示全部楼层
顶楼上,比较业啊。
一般来讲SDRAM访问不正常(EMC NAND正常),都是SDRAM时序的问题。
官方的代码包是32B的SDRAM吧,你的板是16B,初化代码有改吗?

出0入0汤圆

 楼主| 发表于 2012-5-12 16:08:27 | 显示全部楼层
WWC 发表于 2012-5-10 17:53
顶楼上,比较业啊。
一般来讲SDRAM访问不正常(EMC NAND正常),都是SDRAM时序的问题。
官方的代码 ...

void Delay_ms(u32 dat)
{
        TIM_Waitms(dat);
}

void EMC_GPIO_Init (void)
{
    LPC_IOCON->P3_0 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D0 @ P3.0 */
    LPC_IOCON->P3_1 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D1 @ P3.1 */
    LPC_IOCON->P3_2 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D2 @ P3.2 */
    LPC_IOCON->P3_3 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D3 @ P3.3 */

    LPC_IOCON->P3_4 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D4 @ P3.4 */
    LPC_IOCON->P3_5 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D5 @ P3.5 */
    LPC_IOCON->P3_6 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D6 @ P3.6 */
    LPC_IOCON->P3_7 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D7 @ P3.7 */

    LPC_IOCON->P3_8 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D8 @ P3.8 */
    LPC_IOCON->P3_9 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D9 @ P3.9 */
    LPC_IOCON->P3_10 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D10 @ P3.10 */
    LPC_IOCON->P3_11 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D11 @ P3.11 */

    LPC_IOCON->P3_12 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D12 @ P3.12 */
    LPC_IOCON->P3_13 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D13 @ P3.13 */
    LPC_IOCON->P3_14 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D14 @ P3.14 */
    LPC_IOCON->P3_15 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D15 @ P3.15 */

   // LPC_IOCON->P3_16 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* D16 @ P3.16 */


    LPC_IOCON->P4_0 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A0 @ P4.0 */
    LPC_IOCON->P4_1 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A1 @ P4.1 */
    LPC_IOCON->P4_2 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A2 @ P4.2 */
    LPC_IOCON->P4_3 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A3 @ P4.3 */

    LPC_IOCON->P4_4 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A4 @ P4.4 */
    LPC_IOCON->P4_5 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A5 @ P4.5 */
    LPC_IOCON->P4_6 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A6 @ P4.6 */
    LPC_IOCON->P4_7 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A7 @ P4.7 */

    LPC_IOCON->P4_8 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A8 @ P4.8 */
    LPC_IOCON->P4_9 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A9 @ P4.9 */
    LPC_IOCON->P4_10 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A10 @ P4.10 */
    LPC_IOCON->P4_11 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A11 @ P4.11 */

    LPC_IOCON->P4_12 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A12 @ P4.12 */
    LPC_IOCON->P4_13 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A13 @ P4.13 */
    LPC_IOCON->P4_14 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A14 @ P4.14 */
    LPC_IOCON->P4_15 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A15 @ P4.15 */

    LPC_IOCON->P4_16 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A16 @ P4.16 */
    LPC_IOCON->P4_17 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A17 @ P4.17 */
    LPC_IOCON->P4_18 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A18 @ P4.18 */
    LPC_IOCON->P4_19 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A19 @ P4.19 */

    LPC_IOCON->P4_20 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A20 @ P4.20 */
    LPC_IOCON->P4_21 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* A21 @ P4.21 */
    //LPC_IOCON->P4_22 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A22 @ P4.22 */
   // LPC_IOCON->P4_23 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A23 @ P4.23 */

    LPC_IOCON->P4_25 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* WEN @ P4.25 */

#if 1
    LPC_IOCON->P4_24 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* OEN @ P4.24 */

   // LPC_IOCON->P4_26 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* BLSN[0] @ P4.26 */
   // LPC_IOCON->P4_27 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* BLSN[1] @ P4.27 */

   // LPC_IOCON->P4_28 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* BLSN[2] @ P4.28 */
   // LPC_IOCON->P4_29 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* BLSN[3] @ P4.29 */
    LPC_IOCON->P4_30 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* CSN[0] @ P4.30 */
  //  LPC_IOCON->P4_31 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* CSN[1] @ P4.31 */

    //LPC_IOCON->P2_14 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* CSN[2] @ P2.14 */
  //  LPC_IOCON->P2_15 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* CSN[3] @ P2.15 */
#endif

#if 1
    LPC_IOCON->P2_16 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* CASN @ P2.16 */
    LPC_IOCON->P2_17 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* RASN @ P2.17 */
    LPC_IOCON->P2_18 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* CLK[0] @ P2.18 */
  //  LPC_IOCON->P2_19 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* CLK[1] @ P2.19 */

    LPC_IOCON->P2_20 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* DYCSN[0] @ P2.20 */
  //  LPC_IOCON->P2_21 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* DYCSN[1] @ P2.21 */
  //  LPC_IOCON->P2_22 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* DYCSN[2] @ P2.22 */
  //  LPC_IOCON->P2_23 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* DYCSN[3] @ P2.23 */

    LPC_IOCON->P2_24 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* CKE[0] @ P2.24 */

//  LPC_IOCON->P2_25 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* CKE[1] @ P2.25 */
  //  LPC_IOCON->P2_26 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* CKE[2] @ P2.26 */
  //  LPC_IOCON->P2_27 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* CKE[3] @ P2.27 */

    LPC_IOCON->P2_28 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* DQM[0] @ P2.28 */
    LPC_IOCON->P2_29 = (1<<0 | 1<<3 | 0<<5 | 1<<9); /* DQM[1] @ P2.29 */
  //  LPC_IOCON->P2_30 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* DQM[2] @ P2.30 */
  //  LPC_IOCON->P2_31 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* DQM[3] @ P2.31 */
#endif
}

void EMCInit(void)
{
        EMC_GPIO_Init();
       
          LPC_SC->PCONP           |= 0x00000800;
          LPC_SC->EMCDLYCTL   = 0x00080806;
          LPC_EMC->Control         = 0x00000001;
          LPC_EMC->Config          = 0x00000000;
}
void SDRAMInit( void )
{
        TIM_TIMERCFG_Type TIM_ConfigStruct;
        static u16 i, dwtemp;
        uint32_t mhz, nsPerClk;
        uint16_t wtemp = wtemp;
        u32  k;

        /**************************************************************************
        * Initialize EMC for NOR FLASH
        **************************************************************************/
        EMCInit();
        Delay_ms(100);
       
        mhz = SystemCoreClock / 1000000;
        if (LPC_SC->EMCCLKSEL)
                mhz >>= 1;
        nsPerClk = 1000 / mhz;
    LPC_EMC->DynamicRP         = EMC_NS2CLK(20, nsPerClk); /* 20ns,  */
    LPC_EMC->DynamicRAS        = EMC_NS2CLK(42, nsPerClk);//*/ 15; /* 42ns to 100K ns,  */
    LPC_EMC->DynamicSREX       = 2 - 1; /* tSRE, 1clk, */
    LPC_EMC->DynamicAPR        = 2 - 1; /* Not found!!! Estimated as 2clk, */  
    LPC_EMC->DynamicDAL        = EMC_NS2CLK(20, nsPerClk) + 2; /* tDAL = tRP + tDPL = 20ns + 2clk  */
    LPC_EMC->DynamicWR         = 2 - 1; /* 2CLK,  */
    LPC_EMC->DynamicRC         = EMC_NS2CLK(63, nsPerClk); /* H57V2562GTR-75C tRC=63ns(min)*/
    LPC_EMC->DynamicRFC        = EMC_NS2CLK(63, nsPerClk); /* H57V2562GTR-75C tRFC=tRC */
    LPC_EMC->DynamicXSR        = EMC_NS2CLK(80, nsPerClk);//0x0000000F; /* exit self-refresh to active, 不知道,设为最久  */
    LPC_EMC->DynamicRRD        = EMC_NS2CLK(15, nsPerClk); /* 3clk, tRRD=15ns(min) */
    LPC_EMC->DynamicMRD        = 2 - 1; /* 2clk, tMRD=2clk(min) */               

    LPC_EMC->DynamicReadConfig = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */
    LPC_EMC->DynamicRasCas0    = MDKCFG_RASCAS0VAL;

        //Configure memory layout, but MUST DISABLE BUFFERs during configuration
        LPC_EMC->DynamicConfig0    = 0x00001280;
        Delay_ms(100);                                                   /* wait 100ms */
        LPC_EMC->DynamicControl    = 0x00000183; /* Issue NOP command */
        Delay_ms(200);                                                           /* wait 200ms */
        LPC_EMC->DynamicControl    = 0x00000103; /* Issue PALL command */
        LPC_EMC->DynamicRefresh    = 4; /* ( n * 16 ) -> 32 clock cycles */

        Delay_ms(200);                  /* wait 128 AHB clock cycles */
    /* 64ms/4096=15.625us, nx16x8.33ns<15.625us, n<117.2*/
        wtemp = 64000000 / (1 << 12);
        wtemp -= 16;
        wtemp >>= 4;
        wtemp = wtemp * mhz / 1000;
    LPC_EMC->DynamicRefresh    = wtemp;
       
       
        Delay_ms(200);       
        LPC_EMC->DynamicControl    = 0x00000083; /* Issue MODE command */
        //Timing for 48/60/72MHZ Bus
        dwtemp = *((volatile uint16_t *)(SDRAM_BASE_ADDR | (0x33<<12))); /* 4 burst, 2 CAS latency */
        Delay_ms(20);
        LPC_EMC->DynamicControl    = 0x00000000; /* Issue NORMAL command */
        //[re]enable buffers
        LPC_EMC->DynamicConfig0   |= 0x00080000;
        Delay_ms(100);        (100);
          return;
}

出0入0汤圆

发表于 2012-8-9 14:28:52 | 显示全部楼层
也碰到类似问题,往sdram写0x44332211,读出来有些数据变成44322211或者44332210之类的了

楼主的问题搞定没?

出0入0汤圆

发表于 2013-10-27 16:20:00 | 显示全部楼层
您好!
LPC1788驱动SDRAM遇到问题   你是怎么解决的,我也遇到了同样的问题,初始化都参考网络上的,延时测试用AA,55 之类的,测试也能通过,找到中间值为0x11,可就是具体写数据时,会出现某一会或几位为常0或常1.
谢谢!

出0入0汤圆

发表于 2013-10-28 10:24:12 | 显示全部楼层
qchwu 发表于 2013-10-27 16:20
您好!
LPC1788驱动SDRAM遇到问题   你是怎么解决的,我也遇到了同样的问题,初始化都参考网络上的,延时测 ...

先排除焊接的虚焊问题。

出0入0汤圆

发表于 2013-11-7 22:55:58 | 显示全部楼层
焊接肯定没有问题,可就不能正常读写。到现在也搞不定。

出0入0汤圆

发表于 2013-11-7 22:57:32 | 显示全部楼层
网上看了,好像LPC1788的SDRAM想用起来还真不容易。烦!

出0入0汤圆

发表于 2014-2-2 13:39:25 | 显示全部楼层
qchwu 发表于 2013-11-7 22:57
网上看了,好像LPC1788的SDRAM想用起来还真不容易。烦!

把LCD关掉测试SDRAM

出0入0汤圆

发表于 2014-2-20 19:33:26 | 显示全部楼层
没有使用LCD呢

出0入0汤圆

 楼主| 发表于 2014-2-27 11:50:01 | 显示全部楼层
后来发现 我用的sdram是8M的  参考程序是256M的  因此配置上错了。 还好1788用着不错

出0入0汤圆

发表于 2014-4-19 12:09:39 | 显示全部楼层
SDRAM初始化的问题,模式寄存器没配好

出0入0汤圆

发表于 2014-4-19 12:11:53 | 显示全部楼层
看不见 发表于 2014-4-19 12:09
SDRAM初始化的问题,模式寄存器没配好

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

本版积分规则

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

GMT+8, 2024-4-20 04:13

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

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