⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emif.c

📁 对于DSP自引导程序的一个实例
💻 C
字号:
#ifndef _EMIF_H_
#include "emif.h"
#endif

void EMIF_INI();
void DECVFG_INI();
void SDRAM_SETUP();

#if 0
/*----------------------------------------------------------------------------*/
void SRAM_WWrite(short int * BeginData,short int BeginAddress,short int WordNumber);
void SRAM_DWIWrite( int *BeginData,int BeginAddress,int DWordNumber);
void SRAM_DWFWrite( float *BeginData,int BeginAddress,int DWordNumber);
void SRAM_QWDWrite( double *BeginData,int BeginAddress,int QWordNumber);
void SRAM_WRead(short int *BeginData,int BeginAddress,int WordNumber);
void SRAM_DWIRead( int *BeginData,int BeginAddress,int DWordNumber);
void SRAM_DWFRead( float *BeginData,int BeginAddress,int DWordNumber);
void SRAM_QWDRead( double *BeginData,int BeginAddress,int QWordNumber);
/*----------------------------------------------------------------------------*/
#endif
/*----------------------------------------------------------------------------*/
/* EMIF_INI() -- DSP EMIF initianization:Set the parametre of CE0,CE1,CE2 
                 TMS320C6713总共有4 EMIF CEx 空间,我们现在总共用了3个即:  
                 CE0  -- Asyncronize ROM(FPGA地址映射区)16-bit-wide 
                 CE1  -- Asyncronize Flash ROM 8-bit-wide
                 CE2  -- SDRAM(16M) 16-bit-wide
                 EMIF 口的工作时钟有两个来源:SYSCLK3(系统内部时钟)和 ECLKIN(
                      外部输入的时钟),这个时钟源的选择在寄存器DEVCFG中设置
                      
                      当前的时钟为:SYSCLK3 = 100MHz                              */               
/*-----------------------------------------------------------------------------*/
void EMIF_INI()
//总共又4个CEx控制寄存器 ,此处只用了3个
{
	*(unsigned volatile int *)EMIF_GBLCTL = 0x37f8 ;	//0x98
// Reserved  BUSREQ  ARDY   HOLD  HOLDA  NOHOLD   Reserved   CLK1EN   CLK2EN   Reserved
// 31 - 12     11     10     9      8      7       6 - 5 	4       3       2 - 0
//              R      R     R      R      RW                   RW      RW
//  000         0      1     1      1      1         11          1       1        000
//HOLD :Disenable 
//NOHOLD: Hold disabled    
//CLK1EN : Enable , CLKOUT1 enabled to clock
//CLK2EN : Enable ,CLKOUT2 enabled to clock

        *(unsigned volatile int *)EMIF_CE0CTL = 0x14e1e012;    //Used for FPGA in master DSP	
//Wtitesetup  Writestrobe  Wtitehold  Readsetup   TA     Readstrobe  MTYPE  WriteholdMSB   Readhold
//31 - 28      27 - 22     21 - 20    19 - 16   15 - 14    13 - 8    7 - 4        3         2 - 0
//  0001       010011        10         0001      11        100000    0001        0           010
//MTYPE : 0001b 16-bit-wide asynchronous interface                         
                                                                          
        *(unsigned volatile int *)EMIF_CE1CTL = 0x1161ca02;    //Used for FLASH ROM
//Wtitesetup  Writestrobe  Wtitehold  Readsetup   TA     Readstrobe  MTYPE  WriteholdMSB   Readhold
//31 - 28      27 - 22     21 - 20    19 - 16   15 - 14    13 - 8    7 - 4        3         2 - 0
//  0001       000101        10         0001      11        001010    0000        0           010	                                                              0001                               
//  MTYPE=0000 (8-bit-wide asynchronous memory) 

        *(unsigned volatile int *)EMIF_CE2CTL = 0xffffff93;    //Used for SDRAM
//Wtitesetup  Writestrobe  Wtitehold  Readsetup   TA     Readstrobe  MTYPE  WriteholdMSB   Readhold
//31 - 28      27 - 22     21 - 20    19 - 16   15 - 14    13 - 8    7 - 4        3         2 - 0
//   0            0           0          0          0         0       1001        0           0
//MTYPE : 1001b 16-bit-wide SDRAM interface
}

/*-----------------------------------------------------------------------------*/
void DECVFG_INI()
{	
    *(unsigned volatile int *)DEVCFG  = 0x00;
// Reserved    EKSRC  TOUT1SEL  TOUT0SEL  MCBSP0DIS  MCBSP1DIS
// 31 - 5        4       3         2           1        0
//  0000         0       0         0           0        0
//EKSRC:EMIF input clock source is SYSCLK3(100MHz)(default)
//TOUT1SEL:Output pin(Tout1) as a Timer1 output(default)
//TOUT0SEL:Output pin(Tout0) as a Timer0 output(default)
//MCBSP0DIS:McBSP0 peripheral pins are enable,McASP0 peripheral pins are disable(default)
//MCBSP1DIS:McBSP1 peripheral pins are enable,McASP1 peripheral pins are disable(default)
}	

/******************************************************************************
* SDRAM MT48LC4M16A2-7 devices (16-bit x 4 banks x 1024K) parts = 8MB Parameter
*******************************************************************************/
void SDRAM_SETUP()
{
	*(unsigned volatile int *)EMIF_SDCTL = 0x57116000 ;	//0x07227000
//Rsv    SDBSZ      SDRSZ     SDCSZ    RFEN   INIT    TRCD     TRP      TRC      Reserved    	
//31      30       29 - 28   27 - 26    25     24    23 - 20  19 - 16  15 - 12    11 - 0
//0	   0         00         01       1      1     0010     0010     0111         0

//external memory interface (EMIF) at 100MHz
//Tcyc = 9.53ns
//TRC = 0111	70/9.53 - 1 = 6.35 < 0111
//TRP = 0010	20/9.53 - 1 = 1.1 <0010
//TRCD = 0010	20/9.53 - 1 = 1.1 <0010
//INIT = 1,	initialize SDRAM in each CE space configured for SDRAM. 
//RFEN = 1,	SDRAM refresh enabled
//SDCSZ = 01, 8 column address pins (256 elements per row)		
//SDRSZ = 00, 11 row address pins (2048 rows per bank)
//SDBSZ	= 0,  one bank-select pin
	
	*(unsigned volatile int *)EMIF_SDTIM = 0x61a ;	//0x200061a
//Reserved        XRFR        COUNTER         PERIOD
//31 - 26       25 - 24       23 - 12         11 - 0
//  R              RW            R              RW  
// 0               10            0           110 0001 1010

// PERIOD = 110 0001 1010,   Refresh period in EMIF clock cycles
//0x61a * 9.53 / 1000 = 14.9 ms < 64ms (max refresh peroid)	

	*(unsigned volatile int *)EMIF_SDEXT = 0x54529 ;
//Rsvd    WR2RD   WR2DEAC  WR2WR   R2WDQM    RD2WR    RD2DEAC   RD2RD   THZP   TWR    TRRD    TRAS   TCL
//31-21    20	  19 - 18    17   16 - 15   14 - 12   11 - 10     9    8 - 7  6 - 5     4     3 - 1   0
// 0       0         01      0       10       100        01       0      10     01      0      100    1

//101 0100 0101 0010 1001
//TCL = 1, CAS latency = 3 ECLKOUT cycles
//TRAS = 100, 44(min)/ 9.53 -1 = 3.62 < 100
//TRRD = 0, then Trrd = 2 ECLKOUT cycles
//Trrd = 2 * 9.53 > 15 ns (min)
//TWR = 01, (9.53 + 7.5)(min)/9.53 -1 < 01 
//THZP = 10, 3 * 9.53 / 9.53 -1 = 10
//RD2RD = 0, READ to READ = 1 ECLKOUT cycle, C6000 doc Recommended Values for cl = 3
//RD2DEAC = 01, C6000 doc Recommended Values for cl = 3
//RD2WR = 100,同上
//R2WDQM = 10,同上
//WR2WR = 0,同上
//WR2DEAC = 01,同上
//WR2RD = 0,同上
}

#if 0

/**********************************************************************
SRAM 的读写函数
***********************************************************************/
void SRAM_WWrite(short int * BeginData,short int BeginAddress,short int WordNumber)
/**********************************************************************
W--16 bit 整形数据的写入,DSP每次写入的数据宽度为16位(short int 型数据)
本函数实现的是向Mem(包括SDRAM和FLASH)写入WordNumber个16位的数据
函数参数说明:
BeginData :待写入数据的指针,指向写入的数据块(数据宽带为16bit)
BeginAddress:写入数据起始地址(偏移地址),该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
WordNumber:待写入数据的数目
注意:该函数只能写入地址是连续的数据块
**********************************************************************/
{
	short int i;
	short int j=0;
	short int * AddrPointer =0 ;
	
	//AddrPointer = (short int *)(BeginAddress + SDRAM_START_ADR) ;
	//AddrPointer =(short int *)(BeginAddress +SDRAM_START_ADR);
	AddrPointer = (short int *)0xa0000700;
	*AddrPointer = 5 ;
	for(i=0;i<WordNumber;i++)
	{
	    j= *(BeginData + i);
	    *(AddrPointer+i) = j;
	  //  m = *(AddrPointer+i);
	//	*(AddrPointer+i) = *(BeginData + i);
	}	
}
/**********************************************************************/

void SRAM_DWIWrite( int *BeginData,int BeginAddress,int DWordNumber)
/**********************************************************************
DWI--32 bit 整形数据的写入,DSP每次写入的数据宽度为32位( int型 数据)
本函数实现的是向Mem(包括SDRAM和FLASH)写入DWordNumber个32位的数据
函数参数说明:
BeginData :待写入数据的指针,指向写入的数据块(32bit的整型数据)
BeginAddress:写入数据起始地址,该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
DWordNumber:待写入数据的数目
注意:该函数只能写入地址是连续的数据块
**********************************************************************/
{
	int i;
	int *AddrPointer;
	AddrPointer = ( int *)(BeginAddress + SDRAM_START_ADR);
	for(i=0;i<DWordNumber;i++)
	{
		*(AddrPointer+i) = *(BeginData + i);
	}
}

void SRAM_DWFWrite( float *BeginData,int BeginAddress,int DWordNumber)
/**********************************************************************
DWF--32 bit float型数据的写入,DSP每次写入的数据宽度为32位( float型 数据)
本函数实现的是向Mem(包括SDRAM和FLASH)写入DWordNumber个32位的数据
函数参数说明:
BeginData :待写入数据的指针,指向写入的数据块(32bit的float型数据)
BeginAddress:写入数据起始地址,该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
DWordNumber:待写入数据的数目
注意:该函数只能写入地址是连续的数据块
**********************************************************************/
{
	int i;
	float *AddrPointer;
	AddrPointer = ( float *)(BeginAddress + SDRAM_START_ADR);
	for(i=0;i<DWordNumber;i++)
	{
		*(AddrPointer+i) = *(BeginData + i);
	}
}


void SRAM_QWDWrite( double *BeginData,int BeginAddress,int QWordNumber)
/**********************************************************************
DWD--64 bit double型数据的写入,DSP每次写入的数据宽度为64位(double型数据)
本函数实现的是向Mem(包括SDRAM和FLASH)写入QWordNumber个64位double型的数据
函数参数说明:
BeginData :待写入数据的指针,指向写入的数据块(64bit的double型数据)
BeginAddress:写入数据起始地址,该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
QWordNumber:待写入数据的数目
注意:该函数只能写入地址是连续的数据块
**********************************************************************/
{
	int i;
	double *AddrPointer;
	AddrPointer = ( double *)(BeginAddress + SDRAM_START_ADR) ;
	for(i=0;i<QWordNumber;i++)
	{
		*(AddrPointer+i) = *(BeginData + i);
	}
}

/*SDRAM的读出函数*/

void SRAM_WRead(short int *BeginData,int BeginAddress,int WordNumber)
/**********************************************************************
W--16 bit 整形数据的读出,DSP每次读入的数据宽度为16位(short int 型数据)
本函数实现的是从Mem(包括SDRAM和FLASH)读入WordNumber个16位的数据
函数参数说明:
BeginData :用作装载读入数据的指针,指向读入的数据块(数据宽带为16bit)
BeginAddress:读入数据起始地址,该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
WordNumber:待读入数据的数目
注意:该函数只能读入地址是连续的数据块
**********************************************************************/
{
	int i;
	short int *AddrPointer;
	AddrPointer = (short int *)(BeginAddress + SDRAM_START_ADR);
	for(i=0;i<WordNumber;i++)
	{
		*(BeginData + i) = *(AddrPointer+i);
	}	
}


void SRAM_DWIRead( int *BeginData,int BeginAddress,int DWordNumber)
/**********************************************************************
DW--32 bit 整形数据的读出,DSP每次读入的数据宽度为32位( int 型数据)
本函数实现的是从Mem(包括SDRAM和FLASH)读入DWordNumber个32位的数据
函数参数说明:
BeginData :用作装载读入数据的指针,指向读入的数据块(数据宽带为32bit)
BeginAddress:读入数据起始地址,该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
DWordNumber:待读入数据的数目
注意:该函数只能读入地址是连续的数据块
**********************************************************************/
{
	int i;
	int *AddrPointer;
	AddrPointer = ( int *)(BeginAddress + SDRAM_START_ADR);
	for(i=0;i<DWordNumber;i++)
	{
		*(BeginData + i) = *(AddrPointer+i);
	}	
}


void SRAM_DWFRead( float *BeginData,int BeginAddress,int DWordNumber)
/**********************************************************************
DWF--32 bit Float型数据的读出,DSP每次读入的数据宽度为32位( float 型数据)
本函数实现的是从SDRAM读入DWordNumber个32位的数据
函数参数说明:
BeginData :用作装载读入数据的指针,指向读入的数据块(数据宽带为32bit)
BeginAddress:读入数据起始地址,该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
DWordNumber:待读入数据的数目
注意:该函数只能读入地址是连续的数据块
**********************************************************************/
{
	int i;
	float *AddrPointer;
	AddrPointer = ( float *)(BeginAddress + SDRAM_START_ADR);
	for(i=0;i<DWordNumber;i++)
	{
		*(BeginData + i) = *(AddrPointer+i);
	}	
}

void SRAM_QWDRead( double *BeginData,int BeginAddress,int QWordNumber)
/**********************************************************************
DWD--64 bit double型数据的读出,DSP每次读入的数据宽度为64位( double 型数据)
本函数实现的是从SDRAM读入DWordNumber个32位的数据
函数参数说明:
BeginData :用作装载读入数据的指针,指向读入的数据块(数据宽带为32bit)
BeginAddress:读入数据起始地址,该地址是一个相对于SRAM的起始位置的相对地址
             所以实际访问地址应该加上SDRAM 的起始地址
DWordNumber:待读入数据的数目
注意:该函数只能读入地址是连续的数据块
**********************************************************************/
{
	int i;
	double *AddrPointer;
	AddrPointer = ( double *)(BeginAddress + SDRAM_START_ADR) ;
	for(i=0;i<QWordNumber;i++)
	{
		*(BeginData + i) = *(AddrPointer+i);
	}
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -