Blackfin DSP(四):BF533 EBIU之SDRAM

  BF533的SDRAM控制器最大支持128M bytesSDRAM空間;總線寬度能夠配置爲4位、8位、16位。處理器與SDRAM的連線包括數據總線D[0:15]、地址總線A[1:19]SDRAM刷新專用信號SA10,時鐘信號SCLK、時鐘使能信號SCKE、行鎖存信號SRAS#,列鎖存信號SCAS#,寫使能信號SWE#,片選信號SMS#和總線屏蔽信號ABE[1:0].函數

SDRAM的起始地址爲0x0000 0000,尾地址爲0x03ff ffff,共64MB;若爲32MB SDRAM,則尾地址爲0x01ff ffff;
測試

1.如何配置EBIU的寄存器ui

  首先,在所使用的SDRAM的手冊中,找到時序參數,以下圖所示:
spa

假設SCLK=135M,7.4ns:3d

a.配置EBIU_SDRRCSDRAM刷新率控制器;code

  •    fsclk=135M=135*10^6 Hz----------系統總線頻率;
  •     查上表得,tREF=64 ms= 0.064 s;-------SDRAM行刷新時間;
  •     NRArefresh cyclesNRA=8192----行數
  •     tRAS=從存儲體激活到預充電之間的時間,以時鐘週期爲單位:44 /7.4=6;
  •     tRP=存儲體從預充電到再次被激活之間的最小時間,以時鐘週期爲單位:20/7.4=3

       RDIV =  (135*10^6*0.064)/8192-(6+3)=0x415;blog

b.配置SDBCTL:存儲體控制寄存器it

 

c.配置SDGCTLSDRAM全局控制器class

  TWR:存儲器手冊上要求1clk+7.5ns,因此須要3clk;其它位的計算相同;sed

 

最後,獲得的各個寄存器的值以下:

void Init_SDRAM(void)
{
    *pEBIU_SDRRC = 0x00000415; 

 //    *pEBIU_SDBCTL = 0x0025; //64 MB,10bit width
     *pEBIU_SDBCTL = 0x0013;    //32 MB,9bit width

    *pEBIU_SDGCTL = 0x0099998d;   // 0x0091998d;
    ssync();
}

 

爲了對SDRAM進行測試,能夠用下面的函數對其進行遍歷,具體的使用方法以下:

 

#define pADDR   (volatile unsigned short *)0x1000
#define SDRAM_START  0x00000000    // start address of SDRAM
//#define SDRAM_SIZE     0x04000000    // 64 MB
#define SDRAM_SIZE     0x02000000    // 32 MB

void ezTurnOnLED(uint16_t led);
int TEST_SDRAM(void);
void main(void)
{
    int i;

    Set_PLL(22,5); //cclk = 27*22=594M,sclk=594/5=118M
    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);


    if( 0 == TEST_SDRAM())
    {
        printf("Test Failed!\r\n");
    }
    else printf("Test Successed!\r\n");


    while(1);

}

/*************************************************************************
*函數功能:測試SDRAM;
*入口參數:無;
*出口參數: 測試正常,返回1,不然返回0
*注意:根據SDRAM的位寬修改nIndex和pDst的類型;
************************************************************************/
int TEST_SDRAM(void)
{
    volatile unsigned short  *pDst;
    unsigned short nIndex = 0xFFFF;  //16位位寬
    int bPass = 1;     // returning 1 indicates a pass, anything else is a fail

    // write all FFFF's
    for(pDst = (unsigned short *)SDRAM_START; pDst < (unsigned short *)(SDRAM_START + SDRAM_SIZE); pDst++ )
    {
        *pDst = nIndex;
    }

    // verify all FFFF's
    for(pDst = (unsigned short *)SDRAM_START; pDst < (unsigned short *)(SDRAM_START + SDRAM_SIZE); pDst++ )
    {
        if( nIndex != (*pDst) )
        {
            bPass = 0;
            return false;
        }
    }

    // write all AAAAAA's
    for(nIndex = 0xAAAA, pDst = (unsigned short *)SDRAM_START; pDst < (unsigned short *)(SDRAM_START + SDRAM_SIZE); pDst++ )
    {
        *pDst = nIndex;
    }

    // verify all AAAAA's
    for(nIndex = 0xAAAA, pDst = (unsigned short *)SDRAM_START; pDst < (unsigned short *)(SDRAM_START + SDRAM_SIZE); pDst++ )
    {
        if( nIndex != *pDst )
        {
            bPass = 0;
            return false;
        }
    }

    // write all 555555's
    for(nIndex = 0x5555, pDst = (unsigned short *)SDRAM_START; pDst < (unsigned short *)(SDRAM_START + SDRAM_SIZE); pDst++ )
    {
        *pDst = nIndex;
    }

    // verify all 55555's
    for(nIndex = 0x5555, pDst = (unsigned short *)SDRAM_START; pDst < (unsigned short *)(SDRAM_START + SDRAM_SIZE); pDst++ )
    {
        if( nIndex != *pDst )
        {
            bPass = 0;
            return false;
        }
    }

    return true;
}
相關文章
相關標籤/搜索