ADSP-BF533 EBIU介面如何?SDRAM讀寫

來源:互聯網
上載者:User

 

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

}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.