打印

求助,在5502中SDRAM的写入过程要用210ns,如何提升速度

[复制链接]
3677|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljtianya|  楼主 | 2008-7-10 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在TMS320VC5502中,对SDRAM写操作,居然要210ns,简直无法干活,请教前辈,怎样解决这个问题?我对EMIF的相关寄存器进行设置,如WRITE SETUP 、WRITE STROBE 、WRITE HOLD ,对写操作消耗时间一点都没变化,很郁闷呀,在论坛上有说这是5502本身问题,在操作EMIF时自动插入了很多时钟周期,而且不能改它,请教前辈如何解决这个问题,有否可能在50~80ns完成?我看过有资料说5502只支持最高为100MHZ的EMIF频率,SDRAM频率再高也上不去吗,是否是这样?很急呀,请指点!谢谢!

相关帖子

沙发
ljtianya|  楼主 | 2008-7-11 11:04 | 只看该作者

请各位前辈帮帮忙

这样的描述应该清楚了吧,请指点。谢谢!

使用特权

评论回复
板凳
ljtianya|  楼主 | 2008-7-14 13:47 | 只看该作者

自己顶下

100MHZ的EMIF速度,为何要200多ns才完成一次SDRAM操作?

使用特权

评论回复
地板
luhuaren| | 2008-7-14 14:08 | 只看该作者

re

要看你配置的外部总线的速度

使用特权

评论回复
5
ljtianya|  楼主 | 2008-7-14 15:39 | 只看该作者

补充点

这个系统的一些参数是这样的:SDRAM 时钟100MHZ ,EMIF时钟 100MHZ,设置如下程序的,希望得到前辈们的指点。

把程序代码也贴出来:这是合众达的5502开发板的测试例程,因为在我的程序里SDRAM消耗太多时间,所以单独用这个来测试SDRAM操作速度。

#include <csl.h>
#include <csl_pll.h>
#include <csl_emif.h>
#include <csl_chip.h>
#include <csl_emifBhal.h>
#include <stdio.h>

#define  GPIODIR      (*(volatile ioport Uint16*)(0x3400))
#define  GPIODATA     (*(volatile ioport Uint16*)(0x3401))

#define DataLength 1000
Uint16 i;

#pragma DATA_SECTION (SourData,".sourdata")                   
Uint32    SourData[DataLength];

/*SDRAM的EMIF设置*/
EMIF_Config MyEmifConfig = {
EMIF_GBLCTL1_RMK(                    // EMIF Global Control Register 1
  EMIF_GBLCTL1_NOHOLD_HOLD_ENABLED,    // Hold enable
  EMIF_GBLCTL1_EK1HZ_EK1EN,            // High-Z control
  EMIF_GBLCTL1_EK1EN_ENABLED        // ECLKOUT1 Enable
  ),
EMIF_GBLCTL2_RMK(                    // EMIF Global Control Register 2
  EMIF_GBLCTL2_EK2RATE_4XCLK,        // ECLKOUT2 Rate
  EMIF_GBLCTL2_EK2HZ_EK2EN,            // EK2HZ = 0, ECLKOUT2 is driven with value specified by EKnEN during
  EMIF_GBLCTL2_EK2EN_ENABLED        // ECLKOUT2 Enable (enabled by default)
  ), 
EMIF_CE1CTL1_RMK(                    // CE1 Space Control Register 1
  EMIF_CE1CTL1_TA_DEFAULT,
  EMIF_CE1CTL1_READ_STROBE_DEFAULT,
  EMIF_CE1CTL1_MTYPE_DEFAULT,
  EMIF_CE1CTL1_WRITE_HOLD_MSB_DEFAULT,
  EMIF_CE1CTL1_READ_HOLD_DEFAULT
  ),
EMIF_CE1CTL2_RMK(                    // CE1 Space Control Register 2
  EMIF_CE1CTL2_WRITE_SETUP_DEFAULT,
  EMIF_CE1CTL2_WRITE_STROBE_DEFAULT,
  EMIF_CE1CTL2_WRITE_HOLD_DEFAULT,
  EMIF_CE1CTL2_READ_SETUP_DEFAULT
  ),
EMIF_CE0CTL1_RMK(                    // CE0 Space Control Register 1
  EMIF_CE0CTL1_TA_DEFAULT,
  EMIF_CE0CTL1_READ_STROBE_OF(2),
  EMIF_CE0CTL1_MTYPE_32BIT_SBSRAM,
  EMIF_CE0CTL1_WRITE_HOLD_MSB_DEFAULT,
  EMIF_CE0CTL1_READ_HOLD_OF(2)
  ),
EMIF_CE0CTL2_RMK(                    // CE0 Space Control Register 2
  EMIF_CE0CTL2_WRITE_SETUP_OF(2),
  EMIF_CE0CTL2_WRITE_STROBE_OF(2),
  EMIF_CE0CTL2_WRITE_HOLD_OF(2),
  EMIF_CE0CTL2_READ_SETUP_OF(2)
  ),
EMIF_CE2CTL1_RMK(                    // CE2 Space Control Register 1
  EMIF_CE2CTL1_TA_DEFAULT,            // Not use for SDRAM (asynchronous memory types only)
  EMIF_CE2CTL1_READ_STROBE_DEFAULT,    // Read strobe width
  EMIF_CE2CTL1_MTYPE_32BIT_SDRAM,    // 32-bit-wide SDRAM
  EMIF_CE2CTL1_WRITE_HOLD_DEFAULT,    // Write hold width
  EMIF_CE2CTL1_READ_HOLD_DEFAULT    // Read hold width
  ),
EMIF_CE2CTL2_RMK(                    // CE2 Space Control Register 2
  EMIF_CE2CTL2_WRITE_SETUP_OF(5),    // Write setup width
  EMIF_CE2CTL2_WRITE_STROBE_OF(1),    // Write strobe width
  EMIF_CE2CTL2_WRITE_HOLD_OF(5),    // Write hold width
  EMIF_CE2CTL2_READ_SETUP_DEFAULT    // Read setup width
  ),
EMIF_CE3CTL1_RMK(                    // CE3 Space Control Register 1
  EMIF_CE3CTL1_TA_DEFAULT,            // Not use for SDRAM (asynchronous memory types only)
  EMIF_CE3CTL1_READ_STROBE_DEFAULT,    // Read strobe width
  EMIF_CE2CTL1_MTYPE_32BIT_SDRAM,    // 32-bit-wide SDRAM
  EMIF_CE3CTL1_WRITE_HOLD_DEFAULT,    // Write hold width
  EMIF_CE3CTL1_READ_HOLD_DEFAULT    // Read hold width
  ),
EMIF_CE3CTL2_RMK(                    // CE3 Space Control Register 2
  EMIF_CE3CTL2_WRITE_SETUP_DEFAULT,    // Write setup width
  EMIF_CE3CTL2_WRITE_STROBE_DEFAULT,    // Write strobe width
  EMIF_CE3CTL2_WRITE_HOLD_DEFAULT,    // Write hold width
  EMIF_CE3CTL2_READ_SETUP_DEFAULT    // Read setup width
  ),
EMIF_SDCTL1_RMK(                    // SDRAM Control Register 1
  EMIF_SDCTL1_TRC_OF(5),            // Specifies tRC value of the SDRAM in EMIF clock cycles.
  EMIF_SDCTL1_SLFRFR_DISABLED        // Auto-refresh mode 
  ),
EMIF_SDCTL2_RMK(                    // SDRAM Control Register 2
  0x11,                                // 4 banks,11 row address, 8 column address
  EMIF_SDCTL2_RFEN_ENABLED,            // Refresh enabled
  EMIF_SDCTL2_INIT_INIT_SDRAM,
  EMIF_SDCTL2_TRCD_OF(1),            // Specifies tRCD value of the SDRAM in EMIF clock cycles
  EMIF_SDCTL2_TRP_OF(1)                // Specifies tRP value of the SDRAM in EMIF clock cycles
  ),
0x61B,                                // SDRAM Refresh Control Register 1
0x0100,                                // SDRAM Refresh Control Register 2
EMIF_SDEXT1_RMK(                    // SDRAM Extension Register 1
  EMIF_SDEXT1_R2WDQM_1CYCLE,
  EMIF_SDEXT1_RD2WR_3CYCLES,
  EMIF_SDEXT1_RD2DEAC_1CYCLE,
  EMIF_SDEXT1_RD2RD_1CYCLE,
  EMIF_SDEXT1_THZP_OF(1),            // tPROZ2=2
  EMIF_SDEXT1_TWR_OF(1),            //
  EMIF_SDEXT1_TRRD_2CYCLES,
  EMIF_SDEXT1_TRAS_OF(4),
  EMIF_SDEXT1_TCL_3CYCLES
  ),
EMIF_SDEXT2_RMK(                    // SDRAM Extension Register 2
  EMIF_SDEXT2_WR2RD_0CYCLES,
  EMIF_SDEXT2_WR2DEAC_1CYCLE,
  0,
  EMIF_SDEXT2_R2WDQM_1CYCLE
  ),
EMIF_CE1SEC1_DEFAULT,                // CE1 Secondary Control Register 1
EMIF_CE0SEC1_DEFAULT,                // CE0 Secondary Control Register 1
EMIF_CE2SEC1_DEFAULT,                // CE2 Secondary Control Register 1
EMIF_CE3SEC1_DEFAULT,                // CE3 Secondary Control Register 1
EMIF_CESCR_DEFAULT                    // CE Size Control Register                                
  };

main()
{
    Uint16 Errcount = 0;
    
    /* 初始化CSL库 */    
    CSL_init();
    
    /* EMIF为全EMIF接口*/
    CHIP_RSET(XBSR,0x0001);
    
    /* 设置系统的运行速度为300MHz */
    PLL_setFreq(1, 0xF, 0, 1, 3, 2, 0);
    
    /* 初始化DSP的外部SDRAM */
    EMIF_config(&MyEmifConfig);
    
    /* 向SDRAM中写入数据 */
    for(i=0;i<DataLength;i++)
    {
         SourData = i;
    }
   
       Errcount = 0;
    /* 读出SDRAM中的数据,并判断是否成功 */
    for(i=0;i<DataLength;i++)
    {
         if(i != SourData)
         Errcount++;
    }
    
    if(Errcount != 0)
    printf("SEED_DEC5502 SDRAM 操作失败 ");
    else
    printf("SEED_DEC5502 SDRAM 操作成功 ");
    
GPIODIR=0xff;

while(1)
    {
    GPIODATA=0x10;
    SourData[10]= 0x05;            这个操作用了210ns,太长了
    GPIODATA=0x00;
    }
}

使用特权

评论回复
6
lianshumou| | 2008-7-15 08:49 | 只看该作者

几点需要注意

1.SDRAM的随机操作本来就不快! 
2.如果在赶上刷新周期那就更慢了! 
3.你的程序是在SDRAM里的吧, 如果你的程序代码和你要操作的地址不在一个bank,那bank切换又是很耗时的一个操作!

使用特权

评论回复
7
ljtianya|  楼主 | 2008-7-15 11:02 | 只看该作者

程序是BOOT到片上RAM运行的

程序是BOOT到片上RAM运行的,我测试过程序10个NOP运行时间是33 ns,应该证明5502是运行在300MHZ的内核速度。

在程序中有个错误:
 /* 设置系统的运行速度为300MHz */
    PLL_setFreq(1, 0xF, 0, 1, 3, 2, 0);

改成这个:
 /* 设置系统的运行速度为300MHz */
    PLL_setFreq(1, 0xF, 0, 1, 3, 1, 0);
或者这个:
 /* 设置系统的运行速度为300MHz */
    PLL_setFreq(1, 0xF, 0, 1, 3, 0, 0);

SourData[10]= 0x05;
运行时间就变成170ns,难道SYSCLK3对EMIF有影响?SDRAM的时钟用的是外部输入时钟。

如果SDRAM速度上不去,换SBSRAM是否可行?

这个系统是用来做500万像素的摄像头芯片图象数据采集的,因为这个速度太慢了,做不下去。说明点,只是采集图象数据,不用去显示。

是否真的是5502的本身速度无法满足这么快,这个方案无法实现?真的谢谢大家!

使用特权

评论回复
8
renpingjun| | 2008-7-15 17:56 | 只看该作者

???

搞不懂,我的5502的EMIF 执行一个赋值才CLOCK=2,是不是很低了??怎么和上面说的相差那么多?我还200M主频,也就10ns的事情,你的怎么这样呢?
我们都是从一个地方搞的源代码,你看看我的
extern void EMIF_init(void)
{
/*SDRAM的EMIF设置*/
    EMIF_Config MyEmifConfig = {
        EMIF_GBLCTL1_RMK(                    // EMIF Global Control Register 1
            EMIF_GBLCTL1_NOHOLD_HOLD_DISABLED,    // Hold enable
            EMIF_GBLCTL1_EK1HZ_EK1EN,            // High-Z control
            EMIF_GBLCTL1_EK1EN_ENABLED        // ECLKOUT1 Enable
            ),
        EMIF_GBLCTL2_RMK(                    // EMIF Global Control Register 2
            EMIF_GBLCTL2_EK2RATE_1XCLK,        // ECLKOUT2 Rate
            EMIF_GBLCTL2_EK2HZ_EK2EN,            // EK2HZ = 0, ECLKOUT2 is driven with value specified by EKnEN during
            EMIF_GBLCTL2_EK2EN_ENABLED        // ECLKOUT2 Enable (enabled by default)
            ), 
        EMIF_CE1CTL1_RMK(                    // CE1 Space Control Register 1
            EMIF_CE1CTL1_TA_DEFAULT,
            EMIF_CE1CTL1_READ_STROBE_DEFAULT,
            EMIF_CE1CTL1_MTYPE_16BIT_ASYNC,
            EMIF_CE1CTL1_WRITE_HOLD_MSB_DEFAULT,
            EMIF_CE1CTL1_READ_HOLD_DEFAULT
            ),
        EMIF_CE1CTL2_RMK(                    // CE1 Space Control Register 2
            EMIF_CE1CTL2_WRITE_SETUP_DEFAULT,
            EMIF_CE1CTL2_WRITE_STROBE_DEFAULT,
            EMIF_CE1CTL2_WRITE_HOLD_DEFAULT,
            EMIF_CE1CTL2_READ_SETUP_DEFAULT
            ),
        EMIF_CE0CTL1_RMK(                    // CE0 Space Control Register 1
            EMIF_CE0CTL1_TA_DEFAULT,
            EMIF_CE0CTL1_READ_STROBE_DEFAULT,
            EMIF_CE1CTL1_MTYPE_16BIT_SDRAM,
            EMIF_CE0CTL1_WRITE_HOLD_MSB_DEFAULT,
            EMIF_CE0CTL1_READ_HOLD_DEFAULT
            ),
        EMIF_CE0CTL2_RMK(                    // CE0 Space Control Register 2
            EMIF_CE0CTL2_WRITE_SETUP_DEFAULT,
            EMIF_CE0CTL2_WRITE_STROBE_DEFAULT,
            EMIF_CE0CTL2_WRITE_HOLD_DEFAULT,
            EMIF_CE0CTL2_READ_SETUP_DEFAULT
            ),
        EMIF_CE2CTL1_RMK(                    // CE2 Space Control Register 1
            EMIF_CE2CTL1_TA_DEFAULT,            // Not use for SDRAM (asynchronous memory types only)
            EMIF_CE2CTL1_READ_STROBE_DEFAULT,    // Read strobe width
            EMIF_CE2CTL1_MTYPE_32BIT_SDRAM,    // 32-bit-wide SDRAM
            EMIF_CE2CTL1_WRITE_HOLD_DEFAULT,    // Write hold width
            EMIF_CE2CTL1_READ_HOLD_DEFAULT    // Read hold width
            ),
        EMIF_CE2CTL2_RMK(                    // CE2 Space Control Register 2
            EMIF_CE2CTL2_WRITE_SETUP_DEFAULT,    // Write setup width
            EMIF_CE2CTL2_WRITE_STROBE_DEFAULT,// Write strobe width
            EMIF_CE2CTL2_WRITE_HOLD_DEFAULT,    // Write hold width
            EMIF_CE2CTL2_READ_SETUP_DEFAULT    // Read setup width
            ),
        EMIF_CE3CTL1_RMK(                    // CE3 Space Control Register 1
            EMIF_CE3CTL1_TA_DEFAULT,            // Not use for SDRAM (asynchronous memory types only)
            EMIF_CE3CTL1_READ_STROBE_DEFAULT,    // Read strobe width
            EMIF_CE2CTL1_MTYPE_32BIT_SDRAM,    // 32-bit-wide SDRAM
            EMIF_CE3CTL1_WRITE_HOLD_DEFAULT,    // Write hold width
            EMIF_CE3CTL1_READ_HOLD_DEFAULT    // Read hold width
            ),
        EMIF_CE3CTL2_RMK(                    // CE3 Space Control Register 2
            EMIF_CE3CTL2_WRITE_SETUP_DEFAULT,    // Write setup width
            EMIF_CE3CTL2_WRITE_STROBE_DEFAULT,// Write strobe width
            EMIF_CE3CTL2_WRITE_HOLD_DEFAULT,    // Write hold width
            EMIF_CE3CTL2_READ_SETUP_DEFAULT    // Read setup width
            ),
        EMIF_SDCTL1_RMK(                    // SDRAM Control Register 1
            EMIF_SDCTL1_TRC_OF(6),            // Specifies tRC value of the SDRAM in EMIF clock cycles.
            EMIF_SDCTL1_SLFRFR_DISABLED        // Auto-refresh mode
            ),
        EMIF_SDCTL2_RMK(                    // SDRAM Control Register 2
            0x15,                                // 4 banks,12 row address, 8 column address by rpj 080709
            EMIF_SDCTL2_RFEN_ENABLED,            // Refresh enabled
            EMIF_SDCTL2_INIT_INIT_SDRAM,
            EMIF_SDCTL2_TRCD_OF(1),            // 1 Specifies tRCD value of the SDRAM in EMIF clock cycles
            EMIF_SDCTL2_TRP_OF(1)                //1 Specifies tRP value of the SDRAM in EMIF clock cycles
            ),
        0x61B,                                // SDRAM Refresh Control Register 1
        0x0300,                                // SDRAM Refresh Control Register 2
        EMIF_SDEXT1_RMK(                    // SDRAM Extension Register 1
            EMIF_SDEXT1_R2WDQM_1CYCLE,
            EMIF_SDEXT1_RD2WR_3CYCLES,
            EMIF_SDEXT1_RD2DEAC_1CYCLE,
            EMIF_SDEXT1_RD2RD_1CYCLE,
            EMIF_SDEXT1_THZP_OF(1),            // tPROZ2=2
            EMIF_SDEXT1_TWR_OF(0),            //
            EMIF_SDEXT1_TRRD_2CYCLES,
            EMIF_SDEXT1_TRAS_OF(4),
            EMIF_SDEXT1_TCL_2CYCLES
            ),
        EMIF_SDEXT2_RMK(                    // SDRAM Extension Register 2
            EMIF_SDEXT2_WR2RD_0CYCLES,
            EMIF_SDEXT2_WR2DEAC_1CYCLE,
            0,
            EMIF_SDEXT2_R2WDQM_1CYCLE
            ),
        EMIF_CE1SEC1_DEFAULT,                // CE1 Secondary Control Register 1
        EMIF_CE0SEC1_DEFAULT,                // CE0 Secondary Control Register 1
        EMIF_CE2SEC1_DEFAULT,                // CE2 Secondary Control Register 1
        EMIF_CE3SEC1_DEFAULT,                // CE3 Secondary Control Register 1
        EMIF_CESCR_DEFAULT                    // CE Size Control Register                                
    };
    
    /*配置系统的EMIF接口*/
    EMIF_config(&MyEmifConfig);
}


//EMIF SYSCLK3 GROUP
    PLLDIV3 = 0x8000;            //Divider 3 enabled, EMIF=SYSCLK3=PLLOUT  
    PLLDIV3 |= 0x0001;            //Divide by 2(200M /2=100M)=10ns

使用特权

评论回复
9
ljtianya|  楼主 | 2008-7-15 20:02 | 只看该作者

按照renpingjun的设置,效果还是一样,真郁闷

问下renpingjun大哥,我照足你的方式,效果还是一样,170ns,请问下您的SDRAM  CLK是从SYSCLK3给出的吗?我的是ECLKIN 100MHZ给的,难道还有其他相关的寄存器没设置到?

我把CMD文件也贴完出来:
MEMORY
{
    PAGE 0:

        MMR     : origin = 0000000h, length = 00000c0h 
        SPRAM   : origin = 00000c0h, length = 0000040
        VECS    : origin = 0000100h, length = 0000100h
        DARAM0  : origin = 0000200h, length = 0007E00h
        DARAM1  : origin = 0008000h, length = 0008000h
        
        CE0     : origin = 0010000h, length = 03f0000h     /* 对应ZBTRAM空间 */
        FLASH   : origin = 0400000h, length = 0100000h    /* Flash 空间 */
        EXTEND    : origin = 0500000h, length = 0300000h    /* 状态/控制寄存器、UARTA、UARTB、USB、和扩展总线所对应的空间 */
        CE2     : origin = 0800000h, length = 0400000h    /* SDRAM 空间*/
        CE3     : origin = 0c00000h, length = 03f8000h    /* SDRAM 空间*/

        PDROM   : origin = 0ff8000h, length = 07f00h    /* 片上ROM空间 */
        
        RESET_VECS  : origin = 0ffff00h, length = 00100h  /* reset vector */
}       

 
SECTIONS
{
        .vectors  : {} > VECS  PAGE 0         /* interrupt vector table */
        .cinit   : {} > DARAM1 PAGE 0
        .text    : {} > DARAM1 PAGE 0
        
        .sourdata :   {} > CE2   PAGE 0
        .RD5620dat :  {} > CE0   PAGE 0

        .stack   : {} > DARAM0 PAGE 0
        .sysstack: {} > DARAM0 PAGE 0
        .sysmem  : {} > DARAM0 PAGE 0
        .cio     : {} > DARAM1 PAGE 0
        .data    : {} > DARAM1 PAGE 0
        .bss     : {} > DARAM1 PAGE 0
        .const   : {} > DARAM1 PAGE 0

        .csldata:  {} > DARAM0   PAGE 0 
        dmaMem:   {} > DARAM0 PAGE 0
}

使用特权

评论回复
10
ljtianya|  楼主 | 2008-7-16 10:25 | 只看该作者

补充点

我用的是合众达的开发板:SEED-DEC5502 v1.0 7.820.071  200701 这是版本信息。
SDRAM的型号是:StarRam 4MX32T2 没找着这个芯片的手册,合众达也没给过。
DSP型号:
TMS   300
320VC5502PGF
CA-6CA3CDW

同样的板,同样的程序,不同样的结果,真是邪门了。

使用特权

评论回复
11
renpingjun| | 2008-7-16 17:15 | 只看该作者

我们硬件不一样

我是直接使用SYSCLK3进行EMIF配置时钟输出的,在ECLKOUT1上输出的。

20M-200M------SYSCLK1(HIGHT PERIPH)
        ---/4-SYSCLK2(LOW PERIPH)
        ---/2-SYSCLK3(EMIF)(需要通过选择EMIFCLKS=0选择输出)
        ------CORECLK

使用特权

评论回复
12
ljtianya|  楼主 | 2008-7-16 17:36 | 只看该作者

寄存器设置都一样了

除了外围硬件不同,寄存器设置都一样,那它至少能跑出这样的速度才行呀,难道这款开发板只能是这样了?5502的系统寄存器也没见哪个影响EMIF速度的呀。试试改用SYSCLK3作为SDRAM的CLK看看。非常感谢renpingjun!

使用特权

评论回复
13
ljtianya|  楼主 | 2008-8-25 17:00 | 只看该作者

有哪位大哥测试过

有哪位大哥测试过:
单独运行:
while(1)
{
GPIODATA=0x01;
GPIODATA=0x00;
}
就一个拉高拉低输出,用示波器测量得到的波形,高电平部分竟然用时33ns;
一个检测输入IO状态
while(1)
{
if((GPIODATA & 0x01)==0x01)
breka;
}
(相当于while((GPIODATA & 0x01)==0x00);但我一般用上面那个写法,从汇编看,后面的用法要多两条汇编指令)
完成这个用了79ns,怎么会用这么长时间?
不知道这些用时是不是正常的,因为SDRAM操作速度跟不上,我做很不少速度上的测试,就发现了这些。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

76

帖子

1

粉丝