两片MT48LC32M16的SDRAM按照16位的读写不正常

2019-07-14 14:07发布

两片 MT48LC32M16的SDRAM 操作读写问题 ??? 描述如下:

#define SDRAM_BASE_ADDR            ((uint32_t)0xC0000000)     // CS0

1、按照 32位的读写,完全正常,

  {   // sdram 读写,按照32位进行测试, 使用指针进行操作 ok
    uint32_t  *ptrSdramAddr;
    ptrSdramAddr = (uint32_t *)SDRAM_BASE_ADDR;   //   吧地址转换为指针

    printf(" SDRAM 测试 开始 ...");
    for(ii=0;ii<0x2000000;ii++)  // 128MByte   1024*1024*32*4/1024/4
    {
      *ptrSdramAddr  = ( __IO uint32_t )(SDRAM_BASE_ADDR + (ii * 4));  

      ptrSdramAddr ++;        // 每加一次表示是4个字节的地址数目
    }

    ptrSdramAddr = (uint32_t *)SDRAM_BASE_ADDR;   //   吧地址转换为指针
    printf(" SDRAM 测试 开始读出数据进行校对 ......");
    for(ii=0;ii<0x2000000;ii++)  // 128MByte   1024*1024*32*4/1024/4
    {
      jj  = *ptrSdramAddr++;   

      if(jj != (SDRAM_BASE_ADDR +  (ii * 4) ) )
        printf(" SDRAM 测试 读循环 出错");
      else
      {
        if(ii >= (0x2000000 - 1))
        {
          printf(" SDRAM 测试 读循环次数 = 0x%X", ii + 1);
          printf(" SDRAM 测试 读 地址 = 0x%X", SDRAM_BASE_ADDR + (ii * 4) + 4);
        }
      }
    }   
  }

2、按照 16位的读写,不正常

  {   // sdram 读写,按照16位进行测试, 使用指针进行操作
    uint16_t  *ptrSdramAddr;
    uint32_t  dattt;
    uint16_t  cc=0;
    ptrSdramAddr = (uint16_t *)SDRAM_BASE_ADDR;   //   吧地址转换为指针

    for(ii=0;ii<0x4000000;ii++)  // 128MByte   1024*1024*32*4/1024/4
    {
      *ptrSdramAddr  = cc;  

      ptrSdramAddr ++;        // 每加一次表示是2个字节的地址数目
      cc ++;
    }

    printf(" SDRAM 测试 开始读出数据进行校对 ......");
    ptrSdramAddr = (uint16_t *)SDRAM_BASE_ADDR;   //   吧地址转换为指针

    cc = 0;
    for(ii=0;ii<0x4000000;ii++)  // 128MByte   1024*1024*32*4/1024/4
    {
      dattt  = *ptrSdramAddr;
      ptrSdramAddr ++;
      if(dattt != cc )
        printf(" SDRAM 测试 读循环 出错");
      else
      {
        if(ii >= (0x4000000 - 1))
        {
          printf(" SDRAM 测试 读循环次数 = 0x%X", ii + 1);
          printf(" SDRAM 测试 读 地址 = 0x%X", SDRAM_BASE_ADDR + (ii * 2) + 2);
        }
      }
      cc ++;
    }   
  }


有谁知道这是为何吗 ????
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。