This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28379D emif_dc_flash例程求助

Other Parts Discussed in Thread: C2000WARE

自己制作的处理板,使用DSP为28379D,emif外扩电路参考的是C2000Ware_2_00_00_02\boards\TIDesigns\F28379D_EMIF_DC中的电路设计,Flash选用的型号与参考设计一致,均为S29AL016J70TFI020。flash与dsp的所有电路链接都与emif_dc中的设计一致。

但使用c2000Ware提供的emif_dc_flash例程时(C:\ti\c2000\C2000Ware_2_00_00_02\device_support\f2837xd\examples\cpu1\emif_dc_flash)发现一些问题:

  • 1.原始代码无法实现对flash的读写控制,运行到进入CFI代码处时就会有错误,变量error加一。
    errors = 0;

    EMIF_DC_enterCS2FlashCFI(EMIF_NUM);//进入CFI,向0x55(Flash地址)上写数据0x98

    if( (dataBuffer[16] != 0x51) ||
        (dataBuffer[17] != 0x52) ||
        (dataBuffer[18] != 0x59) )
    {
        errors++;
        ESTOP0;
    }

我也根据自己的GPIO分配,将 #define EMIF_DC_F2837X_LAUNCHPAD_V1   修改为 0。

后来将函数EMIF_DC_initCS2(EMIF_NUM, EMIF_DC_FLASH);中的寄存器值进行修改(//后的值为原始代码):

    if( CS2Mem == EMIF_DC_FLASH ) {
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.SS       = 0;//0
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.EW       = 0;//0
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.W_SETUP  = 15;//0
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.W_STROBE = 0x3f;//4
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.W_HOLD   = 7;//0
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.R_SETUP  = 15;//3
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.R_STROBE = 0xf;//5
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.R_HOLD   = 7;//0
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.TA       = 3;//2
        EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.ASIZE    = 1;//1
    }

就实现了对flash的CFI序列读写。

请问各位老师,这些寄存器的值原始例程中是如何计算得到的呢?我又该如何根据flash的datasheet来修改配置?

  • 2.只能对flash的低8bit进行读写操作

在后续程序 擦除flash内容代码:


    //
    // Erase flash and verify buffer contents
    //
    EMIF_DC_eraseCS2Flash(EMIF_NUM);

    for(word=0; word<BUFFER_WORDS; word++)
    {
        if(dataBuffer[word] != 0xFFFF)
        {
            errors++;
            ESTOP0;
            break;
        }
    }

我发现,EMIF_DC_eraseCS2Flash(EMIF_NUM);执行完后所有数据是0xFF而非0xFFFF。

后面对flash数据进行写操作也会出现同样的只能对低8bit操作的问题(例如,对某一地址写入0x0101,但该地址内实际对应的值为0x0001):

    //
    // Program dataBuffer contents
    //
    for(word=0; word<BUFFER_WORDS; word++)
    {
        EMIF_DC_programCS2Flash(EMIF_NUM, (Uint32)&dataBuffer[word], word);
    }

    //
    // Verify dataBuffer contents
    //
    for(word=0; word<BUFFER_WORDS; word++)
    {
        if(dataBuffer[word] !=( word))
        {
            errors++;
            ESTOP0;
            break;
        }
    }

经过查看原理图,TI给出的F28379D_EMIF_DC.pdf原理图中,flash的BYTE#与WP#两个管脚(下图中圈出来的地方),我认为是被悬空未连接的,在自己的设计中将他们悬空,不知是否是这个原因导致BYTE#将flash配置为byte状态而只能对8bit数据进行操作?请问这两个管脚设计时的连接状态应该是怎样的?

但为何进入CFI模式和擦除命令,我都按照Word模式的命令进行操作,能够有响应;而将代码修改

EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.ASIZE    = 0

即flash配置为byte,按照byte进行命令操作,CFI都读取不正确呢?

希望各位老师能够给予指导!万分感激!

  • 1、flash和f2837x的datasheet包括正确操作的时间要求。EMIF定时寄存器的编程应确保两个设备的设置和保持时间都满足要求。这些值通常是手动计算的。
    为了方便起见,参考设计目录(\c200ware\boards\tidesigns\f28379d_emif_dc)中包含一个配置电子表格工具,用于计算合理的起点值。
    还有一个“emif_dc flash”的例程,其时间值在参考设计中起作用。(\C2000Ware\device_support\f2837xd\examples\cpu1\emif_dc_flash)。
    这个EMIF appnote描述了附录中的配置工具:www.ti.com/.../sprac96a.pdf
    2、可以参考这个帖子的回复:e2e.ti.com/.../3141669