首先,EMIFA模塊引腳圖如下:
上圖中,ACE3,ACE2,ACE1,ACE0爲片選信號,即存儲空間使能信號,每個空間的大小爲256MB。
CE0: 0X8000 0000 ~ 0X8FFF FFFF
CE1: 0X9000 0000 ~ 0X9FFF FFFF
CE2: 0XA000 0000 ~ 0XAFFF FFFF
CE3: 0XB000 0000 ~ 0XBFFF FFFF
大概先說這麼多,看下實際編程時的寄存器設置:
EMIFA模塊共需要設置12個寄存器,按順序如下:
- EMIFA全局控制寄存器 GBLCTL
- CE0存儲空間控制寄存器 CECTL0
- CE1存儲空間控制寄存器 CECTL1
- CE2存儲空間控制寄存器 CECTL2
- CE3存儲空間控制寄存器 CECTL3
- SDRAM控制寄存器 SDCTL
- SDRAM時序寄存器 SDTIM
- SDRAM擴展寄存器 SDEXT
- CE0次級控制寄存器 CESEC0
- CE1次級控制寄存器 CESEC1
- CE2次級控制寄存器 CESEC2
- CE3次級控制寄存器 CESEC3
其中比較重要的是1,2,3
GBLCTL我設置的值爲0x52078,實現以下配置:
- 使能ECLKOUT2,設置ECLKOUT2(見上圖)的頻率爲1/2 EMIF輸入時鐘頻率(EMIF輸入時鐘頻率可以是 ECLKIN,1/4CPU時鐘,1/6CPU時鐘
- 使能ECLKOU1
- 使能CLKOUT4,,該管腳與GP1混用
- 使能CLKOUT6,該管腳與GP2混用
CECTLx寄存器組比較重要的是字段 MTYPE [7:4]
對於C64x系列DSP:
MTYPE字段如下(該字段用於設置對應存儲空間的模式)
0000b | 8位寬異步接口 |
0001b | 16位寬異步接口 |
0010b | 32位寬異步接口 |
0011b | 32位寬SDRAM |
0100b | 32位寬可編程同步存儲器 |
1000b | 8位寬SDRAM |
1001b | 16位寬SDRAM |
1010b | 8位寬可編程同步存儲器 |
1011b | 16位寬可編程同步存儲器 |
1100b | 64位寬異步接口 |
1101b | 64位寬SDRAM |
1110b | 64位寬可編程同步存儲器 |
由於VPM642開發板的CE0對應的是64位SDRAM,故CECTL0設置爲 0xFFFF FFD3
而由於串口使用的是8位異步模式,故將cectl1[7:4]設置爲0,其他字段是用於指定地址形狀以及訪問該空間的控制信號,這部分比較複雜具體可見:《TMS320C6000系列的CPU與外設》
SDCTL,SDTIM以及SDEXT寄存器用於設置SDRAM空間的刷新,時序以及尋址特性,具體可見上面的參考書。
實際的設置代碼如下:
1.初始化
/*SEEDDM642的emifa的設置結構*/
EMIFA_Config Seeddm642ConfigA ={
0x00052078,/*gblctl EMIFA(B)global control register value */
/*將CLK6、4、1使能;將MRMODE置1;使能EK2EN,EK2RATE*/
0xffffffd3,/*cectl0 CE0 space control register value*/
/*將CE0空間設爲SDRAM*/
0x73a28e01,/*cectl1 CE1 space control register value*/
/*Read hold: 1 clock;
MTYPE : 0000,選擇8位的異步接口
Read strobe :001110;14個clock寬度
TA:2 clock; Read setup 2 clock;
Write hold :2 clock; Write strobe: 14 clock
Write setup :7 clock
-- ---------------
\ 14c /1c
\----------------/ */
0x22a28a22, /*cectl2 CE2 space control register value*/
0x22a28a42, /*cectl3 CE3 space control register value*/
0x57115000, /*sdctl SDRAM control register value*/
0x0000081b, /*sdtim SDRAM timing register value*/
0x001faf4d, /*sdext SDRAM extension register value*/
0x00000002, /*cesec0 CE0 space secondary control register value*/
0x00000002, /*cesec1 CE1 space secondary control register value*/
0x00000002, /*cesec2 CE2 space secondary control register value*/
0x00000073 /*cesec3 CE3 space secondary control register value*/
};
EMIFA_Config Seeddm642ConfigA ={
0x00052078,/*gblctl EMIFA(B)global control register value */
/*將CLK6、4、1使能;將MRMODE置1;使能EK2EN,EK2RATE*/
0xffffffd3,/*cectl0 CE0 space control register value*/
/*將CE0空間設爲SDRAM*/
0x73a28e01,/*cectl1 CE1 space control register value*/
/*Read hold: 1 clock;
MTYPE : 0000,選擇8位的異步接口
Read strobe :001110;14個clock寬度
TA:2 clock; Read setup 2 clock;
Write hold :2 clock; Write strobe: 14 clock
Write setup :7 clock
-- ---------------
\ 14c /1c
\----------------/ */
0x22a28a22, /*cectl2 CE2 space control register value*/
0x22a28a42, /*cectl3 CE3 space control register value*/
0x57115000, /*sdctl SDRAM control register value*/
0x0000081b, /*sdtim SDRAM timing register value*/
0x001faf4d, /*sdext SDRAM extension register value*/
0x00000002, /*cesec0 CE0 space secondary control register value*/
0x00000002, /*cesec1 CE1 space secondary control register value*/
0x00000002, /*cesec2 CE2 space secondary control register value*/
0x00000073 /*cesec3 CE3 space secondary control register value*/
};
2.設置:
/*EMIFA的初始化,將CE0設爲SDRAM空間,CE1設爲異步空間
注,DM642支持的是EMIFA,而非EMIF*/
EMIFA_config(&Seeddm642ConfigA);
注,DM642支持的是EMIFA,而非EMIF*/
EMIFA_config(&Seeddm642ConfigA);
再貼一張DM642與SDRAM的接線示意圖
SDRAS:SDRAM行地址開關
SDCAS:SDRAM列地址開關
SDWE:可寫
SDCKE:SDRAM 時鐘使能信號
CEn :片選