📄 emif.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 + -