OpenEdv-开源电子网

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

两片 MT48LC32M16的SDRAM 操作读写问题 ?

[复制链接]

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2016-10-24 11:24:51 | 显示全部楼层 |阅读模式
8金钱
两片 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("\r\nSDRAM 测试 开始 ...");
    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("\r\nSDRAM 测试 开始读出数据进行校对 ......");
    for(ii=0;ii<0x2000000;ii++)  // 128MByte   1024*1024*32*4/1024/4
    {
      jj  = *ptrSdramAddr++;   

      if(jj != (SDRAM_BASE_ADDR +  (ii * 4) ) )
        printf("\r\nSDRAM 测试 读循环 出错");
      else
      {
        if(ii >= (0x2000000 - 1))
        {
          printf("\r\nSDRAM 测试 读循环次数 = 0x%X", ii + 1);
          printf("\r\nSDRAM 测试 读 地址 = 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("\r\nSDRAM 测试 开始读出数据进行校对 ......");
    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("\r\nSDRAM 测试 读循环 出错");
      else
      {
        if(ii >= (0x4000000 - 1))
        {
          printf("\r\nSDRAM 测试 读循环次数 = 0x%X", ii + 1);
          printf("\r\nSDRAM 测试 读 地址 = 0x%X", SDRAM_BASE_ADDR + (ii * 2) + 2);
        }
      }
      cc ++;
    }   
  }


有谁知道这是为何吗 ????

最佳答案

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

他奶奶的,终于搞定了啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2016-10-24 11:24:52 | 显示全部楼层
他奶奶的,终于搞定了啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-10-24 22:11:37 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-5-19
在线时间
9 小时
发表于 2017-5-26 14:31:43 | 显示全部楼层
hpdell 发表于 2016-10-28 07:22
他奶奶的,终于搞定了啊

想问下楼主是怎么搞定的,我最近也遇到过这个问题
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-27 11:26:01 | 显示全部楼层
lvlzh 发表于 2017-5-26 14:31
想问下楼主是怎么搞定的,我最近也遇到过这个问题

你的是什么型号的单片机,具体遇到什么问题 ??
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-5-19
在线时间
9 小时
发表于 2017-5-27 14:55:15 | 显示全部楼层
hpdell 发表于 2017-5-27 11:26
你的是什么型号的单片机,具体遇到什么问题 ??

STM32F4,我在读写的时候按照你上面给出来的
for(ii=0;ii<0x2000000;ii++)  // 128MByte   1024*1024*32*4/1024/4
    {
      *ptrSdramAddr  = ( __IO uint32_t )(SDRAM_BASE_ADDR + (ii * 4));  

      ptrSdramAddr ++;        // 每加一次表示是4个字节的地址数目
    }
不能实现读写。
我试了好久发现       
for(uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
        {
                                *(u32*)((Bank6_SDRAM_ADDR>>2)+ uwIndex) = aTxBuffer[uwIndex];
        }
                               
       
                for(uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
        {
                                //printf("uwIndex = %d\r\n",uwIndex);
                                aRxBuffer[uwIndex]=*(u32*)((Bank6_SDRAM_ADDR>>2) + uwIndex);
        }
倒是可以,但是就具体不知道什么原因,能向您请教下吗?
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-5-19
在线时间
9 小时
发表于 2017-5-27 14:58:10 | 显示全部楼层
lvlzh 发表于 2017-5-27 14:55
STM32F4,我在读写的时候按照你上面给出来的
for(ii=0;ii>2)+ uwIndex) = aTxBuffer;
        }

初始化以及硬件设置跟原子的开发板差不多,按照原子寄存器版本说的:当位宽为 16 位的时候, HADDR 右移一位同地址对其,但是 WriteAddr/ReadAddr 我们这里却没有加 2,而是加 1,是因为我们这里用的数据位宽是 8 位,通过FMC_NBL1 和 FMC_NBL0 来控制高低字节位,所以地址在这里是可以只加 1 的。代码如下
for(i=0;i<32*1024*1024;i+=16*1024)
{
*(vu32*)(Bank5_SDRAM_ADDR+i)=temp;
temp++;
}
也不能实现读写功能
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-28 17:24:41 | 显示全部楼层
lvlzh 发表于 2017-5-27 14:58
初始化以及硬件设置跟原子的开发板差不多,按照原子寄存器版本说的:当位宽为 16 位的时候, HADDR 右移 ...

你好,io口需要开启上啦电阻,算好 扫描 周期 时间就可以了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 22:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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