DSP

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

2019-07-13 16:57发布

  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 ",pADDR); printf("data is %x ",i); *pADDR = 0xaa55; //把数据0xaa55赋给地址0x1234  i = *pADDR; //再把数据读回来 printf("addr is %x ",pADDR); printf("data is %x ",i); 以上为BF533 EBIU接口基于SDRAM设计的学习,仅供参考。。。   程序: #include
#include #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 ",pADDR);
    printf("data is %x ",i);
     *pADDR = 0xaa55;
    i = *pADDR;
    printf("addr is %x ",pADDR);
    printf("data is %x ",i);
      
 
    while(1); }