28335 XINTF基本特點
- 一共有三個外部存儲區域:區域0(Zone 0),區域6(Zone 6)和區域7(Zone 7).對應的
訪問地址為:Zone 0:0x0000_4000-0x0000_4fff,Zone 6:0x0010_0000-0x001f_ffff,
Zone 7:0x0020_0000-0x002f_ffff.當訪問對應的地址時,對應的外部片選信號(XZCS0,XZCS6,
XZCS7)會使能(保持低電平)。 - 所有區域都支持DMA訪問,且數據位寬16位和32位可選。
- 所有外部存儲器配置寄存器受ELLOW保護。
- 有一個可選的外部存儲器時鍾輸出引腳。
- 可獨立靈活配置的數據建立(Lead)、保持(Active)、追蹤(Trail)時間,且保持時間可根據外部設備的需求在此基礎上增加。
時鍾源
外部存儲器時鍾和系統時鍾的關系圖如下圖所示:

圖中共有三個時鍾:SYSCLKOUT,XTIMCLK和XCLKOUT。兩個寄存器:XINTCNF2和PCLKR3。
其中SYSCLKOUT為系統時鍾,一般為150Mhz。XTIMCLK為外部存儲器使用的時鍾,所有的時序實現都是基於這個時鍾,並且都是在其上升沿動作。XCLKOUT時鍾為可選的輸出時鍾,這個時鍾直接輸出到XCLKOUT引腳,如果不需要輸出時鍾的話,為了減少噪聲干擾最好將這個時鍾關閉。
XINTCNF2寄存器里面的位定義了時鍾的分頻情況和是否使能時鍾輸出。PCLKR3為外部存儲器外設時鍾的使能信號。在配置XINTF模塊任何寄存器之前必須要使能該時鍾。
關於外設這里多說幾句:我們看到很多嵌入式芯片的應用資料和說明手冊都會提到這個詞,實際上,這個詞有兩種不同的含義。一層意義是Peripheral,即CPU外圍設備,比如DSP28335中的ECAP,EPWM,ADC等都屬於Peripheral.另一層意思是External Devices,即DSP芯片之外的設備,比如這里XINTF外接的存儲器等。
信號引腳
| 引腳 | 類型 | 描述 |
|---|---|---|
| XD(31:0) | I/O/Z | 雙向32位數據總線,16位總線使用XD(15:0) |
| XA(31:1) | O/Z | 地址總線 |
| XA0/!(XWE1) | O/Z | 16位數據模式,此為地址線0(XA0),32位數據模式為寫選通1(!(XWE1)) |
| XCLKOUT | O/Z | 可選時鍾輸出引腳 |
| !(XWE0) | O/Z | 寫選通信號0 |
| !(XRD) | O/Z | 讀選通信號 |
| XR/!(W) | O/Z | 讀寫控制,高讀低寫。此信號一般不用,上面的讀寫選通更清楚 |
| !(XZCS0,6,7) | O | 片選信號 |
| XREADY | I | 可選的擴展信號,說明外設是否完成傳輸,DSP根據此信號增加額外的時間 |
| !(XHOLD) | I | 請求XINTF釋放外部總線 |
| !(XHOLDA) | O/Z | XINTF已經釋放的外部總線 |
ps: !(信號)表示這個信號為低電平有效,否則為高電平有效。
時序圖
通用時序圖
下圖中為外部存儲器讀寫的通用時序圖:

- XTIMCLK的時鍾頻率可以為SYSCLKOUT的不分頻和2分頻,這里選擇的是不分配。同樣,XCLKOUT的時鍾頻率可以是XTIMCLK的不分配和2分配,這里選擇2分配。
- 時序信號的動作和XCLKOUT無關,僅由XTIMCLK決定。這里設置的建立、保存、追蹤時間都是2.
- 兩次讀寫之間有一個空閑的Alignment Cycle時間。
讀取時序圖
下圖為XINTF的讀取時序圖:

- 讀取時序圖列出了大部分讀取時的信號時序,上面這些時序並不是都會產生的。比如第三個時序XCLKOUT(/1 Mode)和第四個時序XCLKOUT(/2 Mode)最多只會出現一個。但將這兩種可能都列出來了。
- XREADY是擴展信號,是外部設備通知其讀寫是否需要額外的時鍾給保持時間。有同步(synchronize)和非同步(asynchronize)兩種。一般不用,這里不詳細解釋,需要的話可以自己查看數據手冊。
- 建立、保持和拖尾時間的設定值分別為2,4,2(保持時間=設定值+1=5,時間配置不加倍的情況下)。
- 由圖可以看出外部設備必須要在!(XRD)上升沿之前將數據准備好,以便供DSP讀取。
寫入時序圖
下圖為XINTF的寫入時序圖:

寫時序圖和讀時序圖差不多,這里不再過多的介紹。對於寫時序圖由於數據總線為DSP驅動,其會在!(XWE0[1])的下降沿輸出數據,因此外部設備應該在其上升沿將數據讀出。
XINTF的配置
在了解時序圖之后,配置XINTF就比較輕松了。這里不討論DMA訪問和加入XREADY信號的情況。也不對各個模式下時序要求做過多說明。如果需要了解這方面的內容請查看具體的數據手冊。這里只對通常情況下的使用進行說明。假設我們將一個FPGA當作外部存儲器,並掛在了區域7上。
-
使能XINTF的時鍾:
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; -
將對應的IO配置為XINTF外設使用:
EALLOW;
GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 3; // 數據線0:XD0
...
GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 3; // 地址線1(這里使用16位數據位寬),XA0/XWE1n
...
GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 3; // XWE0 寫使能(讀使能不可復用不用配置)
GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 3; // XZCS7 片選
EDIS; -
配置XINTCNF2寄存器,這個寄存器的配置對所有的外部區域都有用。下面所有的寄存器都受EALLOW保護,因此配置之前需要使用EALLOW取消保護。
XintfRegs.XINTCNF2.bit.XTIMCLK = 0; //XTIMCLK等於SYSCLK
XintfRegs.XINTCNF2.bit.CLKOFF = 1; //禁止XCLKOUT時鍾輸出
XintfRegs.XINTCNF2.bit.WRBUFF = 0; //不使用寫緩沖 -
配置區域7的時序信號
XintfRegs.XTIMING7.bit.XWRLEAD = 1; //寫建立時間=1 XTIMCLK
XintfRegs.XTIMING7.bit.XWRACTIVE = 2; //寫保持時間=2+1 XTIMCLK
XintfRegs.XTIMING7.bit.XWRTRAIL = 1; //寫追蹤時間=1 XTIMCLK
XintfRegs.XTIMING7.bit.XRDLEAD = 1; //讀建立時間=1 XTIMCLK
XintfRegs.XTIMING7.bit.XRDACTIVE = 3; //讀保持時間=3+1 XTIMCLK
XintfRegs.XTIMING7.bit.XRDTRAIL = 0; //讀追蹤時間=0 XTIMCLK
XintfRegs.XTIMING7.bit.USEREADY = 0; //不適用XREADY信號
XintfRegs.XTIMING7.bit.READYMODE = 0;
XintfRegs.XTIMING7.bit.X2TIMING = 0; //配置時間不加倍
XintfRegs.XTIMING7.bit.XSIZE = 3; //16位位寬訪問 -
加入必要的等待時間,以保證配置完成。同時不要忘了使用EDIS加寫入保護
asm(" RPT #7 || NOP");
