|
本帖最后由 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, 杜汶泽)
|