ADSP-BF533 EBIU接口如何实现SDRAM读写

 

ADSP-BF533要实现SDRAM读写,BF533要连接到SDRAM上,于是我查找了BF533上的相关管脚,如下为BF533上SDRAM接口信号及其相应的功能说明:

1. DATA[15:0] : 外部数据总线;

2. ADDR[19:18],ADDR[16:1] : 外部地址总线,连接到SDRAM的地址管脚。块地址选择输出在ADDR[19:18],而且必须连接到SDRAM上的BA[1:0]管脚;

3. SRAS : SDRAM行地址管脚,连接到SDRAM的RAS管脚;

4. SCAS : SDRAM列地址管脚,连接到SDRAM的CAS管脚;

5. SWE : SDRAM写使能管脚,连接到SDRAM的WE管脚;

6. ABE[1:0]/SDQM[1:0] : SDRAM数据封装管脚,连接到SDRAM的DQM管脚;

7. SMS : 外部存储块的选择管脚,连接到SDRAM的CS(Chip Select)管脚。低电平有效;

8. SA10 : SDRAM A10管脚,当CPU上的异步存储器控制器正在使用EBIU时,SDRAM接口使用这个管脚去更新芯片内部的数据。连接到SDRAM的A[10]管脚;

9. SCKE : SDRAM时钟使能管脚,连接到SDRAM的CKE管脚;

10. CLKOUT : SDRAM时钟使能管脚,该管脚连接到处理器的系统时钟,也连接到SDRAM的CLK管脚。

一般的SDRAM芯片都具备有以上管脚,电路原理图上只要把相应管脚连接到BF533上,然后再通过Visual DSP++进行程序设计就可以对SDRAM进行读写操作啦。以下是我学习过的一个例程,通过程序实例具体说一下如何进行SDRAM的读写。

先说一下SDRAM的时序初始化,程序如下:

void Init_SDRAM(void)

{

       *pEBIU_SDRRC = 0x00000817; 

       *pEBIU_SDBCTL = 0x00000013;

       *pEBIU_SDGCTL = 0x0091998d;      

       ssync();

}

SDRAM的时序初始化寄存器有三个:pEBIU_SDRRC,pEBIU_SDBCTL和pEBIU_SDGCTL。实际上,这三个控制寄存器的名字是通过头文件宏定义过的,在头文件cdefBF533.h中,包含了cdefBF532.h的头文件,打开cdefBF532的头文件,就可以看到以下定义:

/* SDRAM Controller */

#define pEBIU_SDGCTL     ((volatile unsigned long *)EBIU_SDGCTL)

#define pEBIU_SDBCTL     ((volatile unsigned short *)EBIU_SDBCTL)

#define pEBIU_SDRRC       ((volatile unsigned short *)EBIU_SDRRC)

所以实际上控制的是EBIU_SDGCTL,EBIU_SDBCTL和EBIU_SDRRC三个寄存器,于是对我对这三个寄存器进行详细的了解。首先是SDRRC,仍然是打开Visual DSP++软件中的Help进行查找,找到的寄存器内容如下图:

RDIV的值由以下计算公式得出:

具体的定义如下:

不同的SDRAM都有自己不同的相应时序,只要代入进行计算就行啦。

接着是SDBCTL寄存器,该寄存器是SDRAM存储块控制寄存器,用于控制外部存储块的参数编程。它允许软件去控制SDRAM的某些参数。SDBCTL寄存器的内容如下:

 

由上图我们可以知道,第0位为外部存储块使能,设置为1表示使能;1-2位为SDRAM的外部存储块大小设置,有四种存储块大小选择,分别为16M,32M,64M和128M BYTE,这两位由电路图中的SDRAM大小决定;4-5位为SDRAM的列地址宽度决定,分别为8位、9位、10位和11位。

最后是EBIU_SDGCTL寄存器,SDGCTL寄存器用于通过编程设置SDRAM的接口时序配置。如下图为SDGCTL寄存器各个位的功能定义:

具体的设置也要看SDRAM的DATASHEET说明。

对于以上三个寄存器的学习,感觉最重要的两点就是要熟悉SDRAM的时序参数和控制寄存器的功能定义。

当我们通过SDRAM初始化后,就能通过编程指定寄存器地址来对相应寄存器进行读写操作,这方面实际上很简单,如果你之前有学过单片机外部存储器的使用,那应该很容易就能理解。大概的过程如下:一般是定义一个变量A,然后指定其地址,读操作就是把变量A的值赋给我们需要的变量;而写操作则是把要写的数据赋给我们的变量A就行啦;只要是往SDRAM存储空间上取值或赋值,BF533芯片就会在硬件上自动实现所设置的SDRAM时序,从而实现读写操作。如下为具体的读写程序:

*pADDR = 0x1234; //定义一个变量指针地址为0x1234

i = *pADDR; //进行读操作,把地址为0x1234的内容赋给i

printf("addr is %x\n",pADDR);

printf("data is %x\n",i);

*pADDR = 0xaa55; //把数据0xaa55赋给地址0x1234

 i = *pADDR; //再把数据读回来

printf("addr is %x\n",pADDR);

printf("data is %x\n",i);

以上为BF533 EBIU接口基于SDRAM设计的学习,仅供参考。。。

 

程序:

#include <cdefBF533.h>
#include <sys\exception.h>

#define pADDR   (volatile unsigned short *)0x1000


EX_INTERRUPT_HANDLER(TIMER0_ISR);

void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
 unsigned int new_PLL_CTL; 
 *pPLL_DIV = pssel;
 asm("ssync;");
 new_PLL_CTL = (pmsel & 0x3f) << 9;  
 *pSIC_IWR |= 0xffffffff;
 if (new_PLL_CTL != *pPLL_CTL)
 {
  *pPLL_CTL = new_PLL_CTL;
  asm("ssync;");
  asm("idle;");
 }
}

void Init_EBIU(void)
{
 *pEBIU_AMBCTL0 = 0x7bb07bb0;
 *pEBIU_AMBCTL1 = 0xffc07bb0;
 *pEBIU_AMGCTL = 0x000f;
}

void Init_SDRAM(void)
{
 *pEBIU_SDRRC = 0x00000817; 
 *pEBIU_SDBCTL = 0x00000013;
 *pEBIU_SDGCTL = 0x0091998d; 
 ssync();
}

 

void main(void)

 int i;
 Set_PLL(16,3);
    Init_EBIU(); 
    Init_SDRAM();

    *pADDR = 0x1234;
    i = *pADDR;
    printf("addr is %x\n",pADDR);
    printf("data is %x\n",i);
     *pADDR = 0xaa55;
    i = *pADDR;
    printf("addr is %x\n",pADDR);
    printf("data is %x\n",i);
      
 
    while(1);

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值