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);
}