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.

求助关于6455的8位flash读写问题



我目的是,用flash做存启动程序;原理图如下

EMIF初始化部分寄存器配置 CE3CFG = 0x0ffffffc;

读写代码:

void WriteByte(unsigned int Addr, char Val)
{  //BaseAddr   0xb0000000

*(Uint8*)(BaseAddr + 0xaaa) = 0xaa;
*(Uint8*)(BaseAddr + 0x555) = 0x55;
*(Uint8*)(BaseAddr + 0xaaa )= 0xa0;
*((Uint8*)(BaseAddr ) + Addr) = Val;
}

Uint16 ReadByte(unsigned int Addr)
{
unsigned char Val=0;
Val=*((Uint8*)(BaseAddr ) + Addr);
}

读写实验:

for(i=0;i<256;i++)
{WriteByte(i*2 ,data[i]);
};
for(i=0;i<256;i++)
{
rd_data[i]=ReadByte(i*2 );
};

读出的值都是0xff;快崩溃了各种办法读写都试了就是读不出值。

norflash 的Device ID,号什么的都读出来了

现在遇到flash读写问题;原理图如下

  • 请问在ccs memory中可以看到数据写进flash了吗?

  • flash的BYTE#管脚是怎么拉的,确定是设为8bit模式了吗?

    flash是新的没写过吗?要是写过的话,要确保flash是擦除过的才能写。

    WriteByte函数不是很严谨,我记得有一个检查某一个线状态的过程,类似于:

    int Write_Byte(unsigned int Address, unsigned char data)
    {
    unsigned int timeout = 0;

    //Unlock command
    *(unsigned char *)(FlashBaseAddr+0xAAA) = 0xAA;
    *(unsigned char *)(FlashBaseAddr+0x555) = 0x55;

    //Setup command
    *(unsigned char *)(FlashBaseAddr+0xAAA) = 0xA0;

    //Write data to destination
    *(unsigned char *)Address = data;

    do timeout += 1;
    while((*(unsigned char *)Address) != data && timeout < 0xffff);

    if(timeout ==0xffff)
    return -1;
    else
    return 0;
    // flashnext++;

    }



  • 您能帮忙看一下我烧录的程序哪里有问题吗?用NORFLASH 8位的做boot

    fp = fopen(fileName, "rb");

    fseek(fp,0,SEEK_END);
    fileSize = ftell(fp);

    fread(&buf,1,fileSize,fp);
    printf("Programming Begin Start From 0xB0000000, Length = 0x%x; Please Wait Again......\n", fileSize );
    for(i=0;i<fileSize;i++)
    {
    if(Write_Byte(Address++, buf[i]) == -1)
    {
    printf("Write error at Address: 0x%x\n", Address-1);
    return;
    }
    }

    printf("Write Complete Flag\n");

    for (i= 0; i<4; i++)
    Write_Byte(Address++, 0); // Write complete flag;

    printf("Flash Burn End, Reset Flash to Normal Mode.\n");
    *(unsigned char *)FlashBaseAddr = 0xF0; // Reset Flash to Normal Mode;

    printf("Re-Power On the Board.\n");
    while(1);

    生成cmd 

    DSP_TP_C6455.out

    -a

    -memwidth 8

    -map post_hex.map

    -boot

    -bootorg 0xB0000400

    -bootsection .boot_load 0xB0000000

    ROMS

    {

    FLASH: org = 0xB0000000, len = 0x80000, romwidth = 8, files = {test_io.hex}

    }

  • 打开生成的 post_hex.map看看结果,内容格式跟下面这样,看产生的结果对不对先。

    顺便提一下,上面生成的是ASCII码,上面写flash的时候好像没有做转换成二进制。

  • 一、什么意思呢我直接用(fp=fopen("\\boot_hex.HEX","rb")))函数打开.HEX 文件写到FLASH中不可以吗?

    二、还有比如6748有一个AISgen的软件直接把.OUT生成.BIN。同样6455可以也用AISgen吗?

  • dajia li 说:
    一、什么意思呢

    把下面cmd文件中的绿色部分文字生成的文件打开看看,或者传上来。

    生成cmd 

    DSP_TP_C6455.out

    -a

    -memwidth 8

    -map post_hex.map

    -boot

    -bootorg 0xB0000400

    -bootsection .boot_load 0xB0000000

    ROMS

    {

    FLASH: org = 0xB0000000, len = 0x80000, romwidth = 8, files = {test_io.hex}

    }

    dajia li 说:
    二、还有比如6748有一个AISgen的软件直接把.OUT生成.BIN。同样6455可以也用AISgen吗?

    不能。不一样的。

  • I

    .HEX文件 可以用 fopen("\\boot_hex.HEX","rb")函数打开然后烧写到FLASH吗?

    (fp=fopen("\\boot_hex.HEX","rb")))

    fseek(fp,0,SEEK_END);
    fileSize = ftell(fp);

    fread(&buf,1,1024,fp);

    Flash_Writes(0xB0000000+i,buf[i]);

    下面是.MAP内容,

    NPUT FILE NAME: <DSP_TP_C6455.out>
    OUTPUT FORMAT: ASCII-Hex

    PHYSICAL MEMORY PARAMETERS
    Default data width : 8
    Default memory width : 8
    Default output width : 8

    BOOT LOADER PARAMETERS
    Table Address: 0xb0000400, PAGE 0
    Entry Point : 0x80ee60


    OUTPUT TRANSLATION MAP
    --------------------------------------------------------------------------------
    b0000000..b007ffff Page=0 Memory Width=8 ROM Width=8 "FLASH"
    --------------------------------------------------------------------------------
    OUTPUT FILES: test_io.hex [b0..b7]

    CONTENTS: b0000400..b001083f BOOT TABLE
    .text : btad=b000060c dest=00800000 size=0000f120
    .cinit : btad=b000f734 dest=00814a00 size=00000504
    .const : btad=b000fc40 dest=00813c10 size=00000a96
    .switch : btad=b00106e0 dest=008146a8 size=00000154

  • 从上面的map文件来看,没看到boot_load段的分配信息,跟我前面提供的图的分配不一样.

    将cmd文件改成类似下面这样试试。

    c:\iw6000\labs\lab14a\debug\lab.out

    -a         /*这里可以改成-b直接生成二进制文件,则不会需要在ASCII码与二进制之间转换了*/

    -image

    -zero

    -memwidth 8

    -map .\Debug\lab14hex.map

    -boot

    -bootorg 0xb0000400

    -bootsection .boot_load 0xb0000000

    ROMS

    {

     FLASH:   org = 0xb0000000,

       len = 0x0040000,

       romwidth = 8,

       files = {.\Debug\lab14.hex}

    }

    dajia li 说:
    .HEX文件 可以用 fopen("\\boot_hex.HEX","rb")函数打开然后烧写到FLASH吗?

    生成的是ASCII码的数据,不能直接写到flash,DSP不认的,你可以对比CCS download到内存中的数据,与生成的ASCII码的对应数据,是不一样的。