外部寄存器接口原理
外部接口寄存器定義
28335的XINTF接口沒有中斷設置,初始化配置XINTF模塊就可直接使用,數據訪問地址格式爲Data=(^(volatile Uint16^)(0x4000+ 0x0000)),其中0x4000爲基地址,0x0000爲偏移地址,^爲指針符號*。由此總結xintf接口配置步驟爲:
1、設置GPIO爲xintf模塊。
2、開啓xintf時鐘。
3、設置xintf模塊配置
4、訪問或寫入xintf地址。
- 外部接口頭文件DSP2833x_Xintf.h程序如下
// TI File $Revision: /main/4 $
// Checkin $Date: July 27, 2009 13:57:25 $
//###########################################################################
//
// FILE: DSP2833x_Xintf.h
//
// TITLE: DSP2833x Device 外部接口寄存器定義.
//
//###########################################################################
// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
// $Release Date: August 4, 2009 $
//###########################################################################
#ifndef DSP2833x_XINTF_H
#define DSP2833x_XINTF_H
#ifdef __cplusplus
extern "C" {
#endif
// XINTF 時序寄存器位定義:
struct XTIMING_BITS { // bits 描述
Uint16 XWRTRAIL:2; // 1:0 寫訪問跟蹤時間
Uint16 XWRACTIVE:3; // 4:2 寫訪問有效時間
Uint16 XWRLEAD:2; // 6:5 寫訪問建立時間
Uint16 XRDTRAIL:2; // 8:7 讀訪問跟蹤時間
Uint16 XRDACTIVE:3; // 11:9 讀訪問有效時間
Uint16 XRDLEAD:2; // 13:12 讀訪問建立時間
Uint16 USEREADY:1; // 14 區域XREADY信號採樣使能
Uint16 READYMODE:1; // 15 採樣方式控制
Uint16 XSIZE:2; // 17:16 數據總線寬度設定
Uint16 rsvd1:4; // 21:18 保留
Uint16 X2TIMING:1; // 22 實際值與設定值比值
Uint16 rsvd3:9; // 31:23 保留
};
//時序寄存器
union XTIMING_REG {
Uint32 all;
struct XTIMING_BITS bit; //時序寄存器位定義
};
// XINTF 控制寄存器位定義:
struct XINTCNF2_BITS { // bits 描述
Uint16 WRBUFF:2; // 1:0 寫緩衝器深度控制位
Uint16 CLKMODE:1; // 2 XCLKOUT 時鐘頻率控制位
Uint16 CLKOFF:1; // 3 使能 XCLKOUT
Uint16 rsvd1:2; // 5:4 保留
Uint16 WLEVEL:2; // 7:6 寫緩衝寄存器數據個數
Uint16 rsvd2:1; // 8 保留
Uint16 HOLD:1; // 9 自動允許外部設備請求
Uint16 HOLDS:1; // 10 請求對總線訪問狀態
Uint16 HOLDAS:1; // 11 進行外部設備訪問狀態
Uint16 rsvd3:4; // 15:12 保留
Uint16 XTIMCLK:3; // 18:16 配置XTIMCLK
Uint16 rsvd4:13; // 31:19 保留
};
//配置寄存器
union XINTCNF2_REG {
Uint32 all;
struct XINTCNF2_BITS bit; //配置寄存器位定義
};
// XINTF 區域切換控制寄存器位定義:
struct XBANK_BITS { // bits 描述
Uint16 BANK:3; // 2:0 切換時的插入時間
Uint16 BCYC:3; // 5:3 指定區域
Uint16 rsvd:10; // 15:6 保留
};
//區域切換控制寄存器
union XBANK_REG {
Uint16 all;
struct XBANK_BITS bit; //區域切換控制寄存器位定義
};
//模塊復位寄存器位定義
struct XRESET_BITS {
Uint16 XHARDRESET:1;
Uint16 rsvd1:15;
};
//模塊復位寄存器
union XRESET_REG {
Uint16 all;
struct XRESET_BITS bit; //模塊復位寄存器位定義
};
//---------------------------------------------------------------------------
// XINTF 寄存器文件:
//
struct XINTF_REGS {
union XTIMING_REG XTIMING0; //區域0時序寄存器
Uint32 rsvd1[5]; //保留
union XTIMING_REG XTIMING6; //區域6時序寄存器
union XTIMING_REG XTIMING7; //區域7時序寄存器
Uint32 rsvd2[2]; //保留
union XINTCNF2_REG XINTCNF2; //配置寄存器
Uint32 rsvd3; //保留
union XBANK_REG XBANK; //區域切換控制寄存器
Uint16 rsvd4; //保留
Uint16 XREVISION; //版本修訂寄存器
Uint16 rsvd5[2]; //保留
union XRESET_REG XRESET; //模塊復位寄存器
};
//---------------------------------------------------------------------------
// XINTF 外部引用 & 函數聲明:
//
extern volatile struct XINTF_REGS XintfRegs;
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif // end of DSP2833x_XINTF_H definition
//===========================================================================
// No more.
//===========================================================================
- XINTF配置文件DSP2833x_Xintf.c程序如下
// TI File $Revision: /main/5 $
// Checkin $Date: August 16, 2007 11:06:26 $
//###########################################################################
//
// FILE: DSP2833x_Xintf.c
//
// TITLE: DSP2833x Device 外部接口初始化 & 支持函數.
//
// DESCRIPTION:
//
// Example initialization function for the external interface (XINTF).
// This example configures the XINTF to its default state. For an
// example of how this function being used refer to the
// examples/run_from_xintf project.
//
//###########################################################################
// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
// $Release Date: August 4, 2009 $
//###########################################################################
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
//---------------------------------------------------------------------------
// InitXINTF:
//---------------------------------------------------------------------------
// 改函數將外部接口初始化至默認的復位狀態.
//
// Do not modify the timings of the XINTF while running from the XINTF. Doing
// so can yield unpredictable results
void InitXintf(void)
{
// 這顯示瞭如何寫XINTF寄存器。
// 這裏使用了重置後的默認狀態值。
// 不同的硬件需要不同的配置。
// 爲INTF配置一個例子,在如下目錄
// F28335 eZdsp, refer to the examples/run_from_xintf project.
// 任何更改XINTF配置只能從XINTF擴展之外的區域運行代碼。
// 所有區域---------------------------------
// 所有區域的基準時間時鐘爲 XTIMCLK = 1/2 SYSCLKOUT
EALLOW;
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; //開啓XINTF時鐘信號
XintfRegs.XINTCNF2.bit.XTIMCLK = 1; //基準時鐘XTIMCLK = 1/2 SYSCLKOUT
XintfRegs.XINTCNF2.bit.WRBUFF = 0; //無寫緩衝寄存器
XintfRegs.XINTCNF2.bit.CLKOFF = 1; //禁止XCLKOUT
XintfRegs.XINTCNF2.bit.CLKMODE = 1; //XCLKOUT=XTIMCLK/2
XintfRegs.XTIMING0.bit.XWRLEAD = 2; //區域0寫建立時間爲11b,週期數爲6
XintfRegs.XTIMING0.bit.XWRACTIVE = 5; //有效時間爲111b,週期數爲14
XintfRegs.XTIMING0.bit.XWRTRAIL = 2; //跟蹤時間爲11b,週期數爲6
// Zone read timing
XintfRegs.XTIMING0.bit.XRDLEAD = 2; //區域0讀建立時間爲11b,週期數爲6
XintfRegs.XTIMING0.bit.XRDACTIVE = 5; //有效時間爲111b,週期數爲14
XintfRegs.XTIMING0.bit.XRDTRAIL = 2; //跟蹤時間爲11b,週期數爲6
// double all Zone read/write lead/active/trail timing
XintfRegs.XTIMING0.bit.X2TIMING = 1; //比值2:1
// Zone will sample XREADY signal
XintfRegs.XTIMING0.bit.USEREADY = 0; //XREADY信號採樣
XintfRegs.XTIMING0.bit.READYMODE = 1; //異步採樣
XintfRegs.XTIMING0.bit.XSIZE = 3; //數據總線寬度,16位
//*****************************************************************************//
//片外ram訪問
//****************************************************************************//
XintfRegs.XTIMING6.bit.XWRLEAD = 3; //區域6寫建立時間爲11b,週期數爲6
XintfRegs.XTIMING6.bit.XWRACTIVE = 7; //有效時間爲111b,週期數爲14
XintfRegs.XTIMING6.bit.XWRTRAIL = 3; //跟蹤時間爲11b,週期數爲6
// Zone read timing` `
XintfRegs.XTIMING6.bit.XRDLEAD = 3; //區域6讀建立時間爲11b,週期數爲6
XintfRegs.XTIMING6.bit.XRDACTIVE = 7; //有效時間爲111b,週期數爲14
XintfRegs.XTIMING6.bit.XRDTRAIL = 3; //跟蹤時間爲11b,週期數爲6
// double all Zone read/write lead/active/trail timing
XintfRegs.XTIMING6.bit.X2TIMING = 1; //比值
// Zone will sample XREADY signal
XintfRegs.XTIMING6.bit.USEREADY = 0; //不對ready信號採樣
XintfRegs.XTIMING6.bit.READYMODE = 1; //異步採樣
XintfRegs.XTIMING6.bit.XSIZE = 3; //數據總線寬度,16位
// Zone 7------------------------------------
XintfRegs.XTIMING7.bit.XWRLEAD = 3; //區域7寫建立時間爲11b,週期數爲6
XintfRegs.XTIMING7.bit.XWRACTIVE = 7; //有效時間爲111b,週期數爲14
XintfRegs.XTIMING7.bit.XWRTRAIL = 3; //跟蹤時間爲11b,週期數爲6
// Zone read timing
XintfRegs.XTIMING7.bit.XRDLEAD = 3; //區域7讀建立時間爲11b,週期數爲6
XintfRegs.XTIMING7.bit.XRDACTIVE = 7; //有效時間爲111b,週期數爲14
XintfRegs.XTIMING7.bit.XRDTRAIL = 3; //跟蹤時間爲11b,週期數爲6
// double all Zone read/write lead/active/trail timing
XintfRegs.XTIMING7.bit.X2TIMING = 1; //比值2:1
// Zone will sample XREADY signal
XintfRegs.XTIMING7.bit.USEREADY = 0; //XREADY信號採樣
XintfRegs.XTIMING7.bit.READYMODE = 1; //異步採樣
// Size must be either:
XintfRegs.XTIMING7.bit.XSIZE = 3; //數據總線寬度,16位
// Bank switching
XintfRegs.XBANK.bit.BANK = 0; //區域7被指定
XintfRegs.XBANK.bit.BCYC = 7; //區域切換的插入延時時間
EDIS;
//Force a pipeline flush to ensure that the write to
//the last register configured occurs before returning.
// InitXintf32Gpio();
// asm(" RPT #7 || NOP");
}
//===========================================================================
// No more.
//===========================================================================
- 參考資料
《手把手教你學DSP:基於TMS320F28335》
《TMS320F28335DSP原理與開發編程》
《28335接口擴展 (XINTF) 參考指南》