BF533的SDRAM控制器最大支持128M bytes的SDRAM空間;總線寬度能夠配置爲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_SDRRC:SDRAM刷新率控制器;code
RDIV = (135*10^6*0.064)/8192-(6+3)=0x415;blog
b.配置SDBCTL:存儲體控制寄存器it
c.配置SDGCTL:SDRAM全局控制器class
TWR位:存儲器手冊上要求1clk+7.5ns,因此須要3個clk;其它位的計算相同;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; }