【求助】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();
}
请大家帮忙找找问题
用的是哪款SDRAM芯片?可能要看看DATASHEET. gzfslt 发表于 2013-7-15 11:20 static/image/common/back.gif
用的是哪款SDRAM芯片?可能要看看DATASHEET.
芯片用的HY57V561620FTP-H 手册都快看烂了,我的时序跟手册给的时序看上去也没什么出入,不知道是不是什么地方没注意到 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:} wye11083 发表于 2013-7-15 12:04 static/image/common/back.gif
for(j=0;j
这个是调试的时候弄的,前面clock_L被屏蔽掉了额,之前没有屏蔽的时候也不行, 还出现个问题,我把对sdram的刷新函数屏蔽掉,就是不刷新,数据只在启动是写入一次,之后不再写入且每隔3秒读取一次,怎么还能读出正确数据呢?并没像想象那样丢失啊?什么情况? wangyeqing333 发表于 2013-7-15 13:21 static/image/common/back.gif
这个是调试的时候弄的,前面clock_L被屏蔽掉了额,之前没有屏蔽的时候也不行, ...
我怎么就不信邪呢?你必然是CLOCK不正常!你在写CLK_H之前延点时间,有可能MCU的IO速度不够。我用FPGA读写过SDRAM,DDR一代,也没出现过你那种情况。
至于不刷新,确实能用,但是数据会慢慢损坏。毕竟,电容器你不给它充电,它会慢慢漏电! wye11083 发表于 2013-7-15 15:37 static/image/common/back.gif
我怎么就不信邪呢?你必然是CLOCK不正常!你在写CLK_H之前延点时间,有可能MCU的IO速度不够。我用FPGA读 ...
加延时也试过了,跟没加之前没什么变化
下面是测试的现象,上面一行是要写入的数据,下面一行是读出来的数据,读取的代码已经测试过了没啥问题、
加到10个莫元了,希望各位高手多来指点啊
页:
[1]