搜索
bottom↓
回复: 8

【求助】SDRAM突发写操作写不对的问题

[复制链接]

出0入0汤圆

发表于 2013-7-15 11:00:34 | 显示全部楼层 |阅读模式
本帖最后由 wangyeqing333 于 2013-7-15 16:40 编辑

因项目需要用stc单片机做sdram驱动,单片机频率24M,现在测试的读写一个单元没有问题,突发读8个单元(BL=8)也没问题,就是突发写不行,8个地址中总是写入同意的数据(数据为要写入数据的最后一个单元的数据),下面详细说明:

BL=8,位宽为16bit

要突发写入的数据:Buf[16] = {0x00,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};

写入后读取出的数据buf[16] = {0x0E,0x0F,0x0E,0x0F,0x0E,0x0F,0x0E,0x0F,0x0E,0x0F,0x0E,0x0F,0x0E,0x0F,0x0E,0x0F,};

看了时序 也没感觉到哪有问题,下面是突发写入的代码:(我的地址线和数据线是公用的,中间用573锁存,所以在发命令和数据间要做切换)

void SDRAM2_BurstWrite_Eight(UINT8 Bank,UINT16 RowAdd,UINT16 ColumnAdd,UINT8 *Data)  //没有调好
{
    UINT8 j = 0;
    UINT8 *writedata;

    RAM_UDQM = 0; //一次传输一个ram位宽
    RAM_LDQM = 0;
    writedata = Data;
    ENABLE_RAM2_ADD();                  //使能地址总线
    RAM_ALE = 1;                        //取消地址锁存
    Bank_Active(Bank, RowAdd);          //选中bank和行
    No_Operation();
    No_Operation();
    //tRCD;
    CLOCK_L;//clock low
    Write_With_Prechage(Bank,ColumnAdd);   //写命令,同时给出列地址 test
    CLOCK_H;
    RAM_ALE = 0;                        //锁存地址
    Data_Bus_Dir = 1;                   //数据总线方向 写入
    ENABLE_RAM2_DATA();                 //使能数据总线

    for(j=0;j<8;j++)                    //突发写入8个单元 16 Byte
        {
            CLOCK_L;//clock low
            ADDH = *(writedata+j*2);
            ADDL = *(writedata+j*2+1);          //数据总线给出要写入数据低字节
            //writedata = writedata+2;            //指针后移两位
            CLOCK_H;
            //_nop_();_nop_();
            //delay_9cycles();//test
            //delay_9cycles();
            //delay_9cycles();

        }

    //Delay_1cycle;                       //数据要保持至少一个周期
   
    ENABLE_RAM2_ADD();                  //使能地址总线

    //Delay_1cycle;  
    //Delay_1cycle;//test
   
    No_Operation();       
    RAM_ALE = 1;                        //取消地址锁存       
    //Prechage();
    No_Operation();       
}


请大家帮忙找找问题

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-7-15 11:20:30 | 显示全部楼层
用的是哪款SDRAM芯片?可能要看看DATASHEET.

出0入0汤圆

 楼主| 发表于 2013-7-15 11:45:29 | 显示全部楼层
gzfslt 发表于 2013-7-15 11:20
用的是哪款SDRAM芯片?可能要看看DATASHEET.

芯片用的HY57V561620FTP-H 手册都快看烂了,我的时序跟手册给的时序看上去也没什么出入,不知道是不是什么地方没注意到

出0入442汤圆

发表于 2013-7-15 12:04:14 | 显示全部楼层
for(j=0;j<8;j++)                    //突发写入8个单元 16 Byte
        {
            //CLOCK_L;//clock low
            ADDH = *(writedata+j*2);
            ADDL = *(writedata+j*2+1);          //数据总线给出要写入数据低字节
            //writedata = writedata+2;            //指针后移两位
            CLOCK_H;
            //_nop_();_nop_();
            //delay_9cycles();//test
            //delay_9cycles();
            //delay_9cycles();

        }
我只看到你让CLK一直为高,

出0入0汤圆

 楼主| 发表于 2013-7-15 13:21:00 | 显示全部楼层
wye11083 发表于 2013-7-15 12:04
for(j=0;j

这个是调试的时候弄的,前面clock_L被屏蔽掉了额,之前没有屏蔽的时候也不行,

出0入0汤圆

 楼主| 发表于 2013-7-15 14:55:37 | 显示全部楼层
还出现个问题,我把对sdram的刷新函数屏蔽掉,就是不刷新,数据只在启动是写入一次,之后不再写入且每隔3秒读取一次,怎么还能读出正确数据呢?并没像想象那样丢失啊?什么情况?

出0入442汤圆

发表于 2013-7-15 15:37:39 | 显示全部楼层
wangyeqing333 发表于 2013-7-15 13:21
这个是调试的时候弄的,前面clock_L被屏蔽掉了额,之前没有屏蔽的时候也不行, ...

我怎么就不信邪呢?你必然是CLOCK不正常!你在写CLK_H之前延点时间,有可能MCU的IO速度不够。我用FPGA读写过SDRAM,DDR一代,也没出现过你那种情况。
至于不刷新,确实能用,但是数据会慢慢损坏。毕竟,电容器你不给它充电,它会慢慢漏电!

出0入0汤圆

 楼主| 发表于 2013-7-15 16:11:29 | 显示全部楼层
wye11083 发表于 2013-7-15 15:37
我怎么就不信邪呢?你必然是CLOCK不正常!你在写CLK_H之前延点时间,有可能MCU的IO速度不够。我用FPGA读 ...

加延时也试过了,跟没加之前没什么变化
下面是测试的现象,上面一行是要写入的数据,下面一行是读出来的数据,读取的代码已经测试过了没啥问题、

本帖子中包含更多资源

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

x

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 05:17

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

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