wangyeqing333 发表于 2013-7-15 11:00:34

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

本帖最后由 wangyeqing333 于 2013-7-15 16:40 编辑

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

BL=8,位宽为16bit

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

写入后读取出的数据buf = {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();       
}


请大家帮忙找找问题

gzfslt 发表于 2013-7-15 11:20:30

用的是哪款SDRAM芯片?可能要看看DATASHEET.

wangyeqing333 发表于 2013-7-15 11:45:29

gzfslt 发表于 2013-7-15 11:20 static/image/common/back.gif
用的是哪款SDRAM芯片?可能要看看DATASHEET.

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

wye11083 发表于 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一直为高,{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}

wangyeqing333 发表于 2013-7-15 13:21:00

wye11083 发表于 2013-7-15 12:04 static/image/common/back.gif
for(j=0;j

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

wangyeqing333 发表于 2013-7-15 14:55:37

还出现个问题,我把对sdram的刷新函数屏蔽掉,就是不刷新,数据只在启动是写入一次,之后不再写入且每隔3秒读取一次,怎么还能读出正确数据呢?并没像想象那样丢失啊?什么情况?

wye11083 发表于 2013-7-15 15:37:39

wangyeqing333 发表于 2013-7-15 13:21 static/image/common/back.gif
这个是调试的时候弄的,前面clock_L被屏蔽掉了额,之前没有屏蔽的时候也不行, ...

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

wangyeqing333 发表于 2013-7-15 16:11:29

wye11083 发表于 2013-7-15 15:37 static/image/common/back.gif
我怎么就不信邪呢?你必然是CLOCK不正常!你在写CLK_H之前延点时间,有可能MCU的IO速度不够。我用FPGA读 ...

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

wangyeqing333 发表于 2013-7-15 16:41:20

加到10个莫元了,希望各位高手多来指点啊
页: [1]
查看完整版本: 【求助】SDRAM突发写操作写不对的问题