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.

C6455_EMIFA



刚学用 EMIFA 不过C6455的库给的例子试跑和调试看映射到板子的内容对不对!不过看例子根本没进行读写。调试后:Sync Read Write is NOT Successful
    Reason:Error in data read.[status = 0x1]
查一下:
    tempData = 0xdeadbeef;
    for (index = 0; index < DATA_CNT; index++) {
        pAsyncData[index] = tempData;
    }


    tempData = 0x55550000;
    for (index = 0; index < DATA_CNT; index++) {
        pAsyncData[index] = tempData + index;
    }
 

根本没有给存储器地址:0xB0000000 赋值。(再说也不懂为什么里面讲前者是无效,后者是有效。————好奇怪)
    /* Verify that the data was indeed written */
    result = DATA_MATCH_SUCCESS;
    for (index = 0; index < DATA_CNT; index++) {
        if (pAsyncData[index] != (tempData + index)) {
            result = DATA_MATCH_FAIL;                     
            break ;
        }
    }——————这语句也就跑了一次  index=0 后就不跑了!说明没进行写好?搞不出是什么原因!

请求帮助!谢谢!
(有待程序文件)

  • 你好,你用的CSL中的EMIFA的例子,前面的Asynchronous Read Write is Successful是否成功了呢?

  • 都没成功!内存没有变化!当 读出来检查也不对:

     for (index = 0; index < DATA_CNT; index++) {
            if (pAsyncData[index] != (tempData + index)) {
                result = DATA_MATCH_FAIL;                     
                break ;

    就进行了一次  index=0 就弹出来了!

    和这段一直搞不懂为什么:一个有效一个无效

     /* Write 'invalid' values into EMIFA CS2 area. This is to overwrite the
         * previous valid values.
         */
        tempData = 0xdeadbeef;
        for (index = 0; index < DATA_CNT; index++) {
            pAsyncData[index] = tempData;
        }

        /* Write **valid** values into CS2 area. */
        tempData = 0x55550000;
        for (index = 0; index < DATA_CNT; index++) {
            pAsyncData[index] = tempData + index;
        }

    本来 tempData 只是一个变量,设为多少是多少。。。怎么跟有效和无效有关呢?

    谢谢!

  • 你好,我检查了一下,这个CSL的EMIFA的例子和evm板不匹配,在EVM上只有EMIFA的CE3上连接了一个异步器件,这个例子操作的CE2,CE4所以并不能正确的对FLASH操作。

  • 无效数据0xdeadbeef,只是一个标示,当你读到这个数据的时候,知道这个数据表示 的以前存在的数据而已。

  • 哦!你这样说那么现在我把配置给了像下面:

    hwSetup.asyncWait = &asyncWait;
        hwSetup.ceCfg[0] = NULL;   
        hwSetup.ceCfg[1] = &asyncVal;
        hwSetup.ceCfg[2] = NULL;
        hwSetup.ceCfg[3] = NULL; 

    那么按理说该是对了啊!但是还是不行的???结果还没写好?你能不能说一下解决方案啊?我用的是C6455DSK板子!很谢谢了!

  • 你好,如果数据写不进CE3,你可以实际的查看一下CE3的寄存器状态,是否已经处于异步读、写都使能的状态了。

    我这个以前是自己配置的寄存器,很容易配的,没用CSL的EMIF库,可以正确的读写FLASH的。

  • 好的!谢谢你!我在试试看!

  • 哦!你说的那个CE3的寄存器状态应该是这个吧:

    那么根据CE3 配置,它被赋值了!我也是换成CE2还可以这样赋值。所以你将CE2和CE4不匹配我不太懂。要是按同步方法的话:SSEL=1 那么CE3 的值是 0x80000000  .

    还有你以前自己配置寄存的是怎么做的!能给我发个程序吗?太麻烦你了!

    (是不是按这样设置:EMIFA_Config MyConfigB = { gblctl , cectl0,cectl1, cectl2 , cectl3 , sdctl ,sdtim, sdext ,  cesec0 ,  cesec1 , cesec2, cesec3 };…EMIFA_config(&MyConfigA);  ???)!!!

  • 你好,和evm板的flash配套的读写测试程序,在\c6455 evm\dsk6455_v2\boards\dsk6455_v2\examples\test

    在这个工程中有TEST_execute(TEST_flash,         3, 0);

    其中TEST_flash就是,你可以试试这个程序。

  • 哦!以前也看过这个!不过太长也没留意过!今天看你说跑过!也看了!运行正常!和 TEST_flash 运行时看了下内存!读写是正常的!那么上面说的EMIFA到底是什么问题呢?暂时我还想不到!请你指点指点!或者你有以前跑好的程序给我参考一下可以吗!谢谢!

  • 对照flash的数据手册,看看flash的Byte Program命令,你编写的正确吗?

  • 上面说的EMIFA出现的问题,并不在于EMIFA的配置上,

    而在于FLASH的操作上,要根据flahs的Byte Program时序来控制flash的:

    /* Write data to a data range in Flash */
    void DSK6455_FLASH_write(Uint32 src, Uint32 dst, Uint32 length)
    {
    Uint8 *psrc, *pdst;
    Uint32 i;

    /* Establish source and destination */
    psrc = (Uint8 *)src;
    pdst = (Uint8 *)dst;
    for (i = 0; i < length; i++)
    {
    // Program one 8-bit word
    *((Uint8 *)DSK6455_FLASH_BASE) = 0xaa;
    *((Uint8 *)DSK6455_FLASH_BASE) = 0x55;
    *((Uint8 *)DSK6455_FLASH_BASE) = 0xa0;
    *pdst = *psrc;

    // Wait for operation to complete
    while(1)
    if (*pdst == *psrc)
    break;

    pdst++;
    psrc++;
    }

    /* Put back in read mode */
    *((Uint16 *)DSK6455_FLASH_BASE) = 0xf0;
    }

  • 添加上BSL的头文件和库文件,下面就是最简单代码,可以成功的。

    typedef unsigned int Uint32;
    typedef unsigned char Uint8;
    typedef unsigned short Uint16;

    #define DSK6455_FLASH_BASE 0xb0000000

    int main(void) {
    Uint32 i;
    Uint16 buffer[256];

    for(i=0;i<256;i++){
    buffer[i] = i;
    }

    (*(volatile Uint32*)((0x70000000) + 0x00000084)) = 0x00240120; /* 8-bit async, 10 cycle read/write strobe */

    DSK6455_FLASH_erase(DSK6455_FLASH_BASE,0x10000);
    DSK6455_FLASH_write((Uint32)buffer,DSK6455_FLASH_BASE,100);

    return 0;
    }

  • 首先要谢谢您的详细指导!
    今天下午折磨了一番!也是过有多次!编译都成功!不过内存地址:0xB0000000 还是没赋值队!
    按你那方法!不知道怎样但我个人觉得好像那只是用flash进行简单的烧写程序啊!内存里面就是显示 buffer数组里面存的值!没有实现这段:
     tempData = 0x55550000;
        for (index = 0; index < DATA_CNT; index++) {
            pAsyncData[index] = tempData + index;
     
    所以 Asynchronous Read Write is NOT Successful 啊!
    我是刚入门!悟性不太好!希望你能谅解!多多指教!

  •  tempData = 0x55550000;
        for (index = 0; index < DATA_CNT; index++) {
            pAsyncData[index] = tempData + index;}

    你好,上面这段程序如果操作DRAM是没问题的,但是针对EVM板的FLASH,需要一定的时序命令,就是每写一个字节的数据,需要0xaa 0xaa 0xa0 时序先写入数据总线

    // Program one 8-bit word
    *((Uint8 *)DSK6455_FLASH_BASE) = 0xaa;
    *((Uint8 *)DSK6455_FLASH_BASE) = 0xaa;
    *((Uint8 *)DSK6455_FLASH_BASE) = 0xa0;
    *pdst = *psrc;

    你需要符合这个规则啊,你可以在pAsyncData[index] = tempData + index;之前,加入这部分内容,但需要注意EVM板的FLASH每次只写入一个字节。

  • 这个工程打不开啊