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