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.

C5515/5517读写EEPROM的问题

你好!

我在项目中使用了C5517处理器,这个DSP芯片内部没有可擦写的存储空间,使用外接EEPROM器件,来保存程序参数。

在我的程序中,参照EVM5517评估板的例子,使用i2crom_write()向eeprom写入整块数据都是正常,甚至能用程序通过写eeprom的方式,把另一段程序当作数据烧写进入eeprom,并能让烧写进去的程序在芯片上电后自动运行起来。

但是,如果我用i2crom_write()往EEPROM中写入带类型的变量,再用i2crom_read()方法读出来,则会出错。

比如下面这段代码:

    Uint16  testVal = 375;


    i2crom_write((Uint32) &testVal, 65408, 2);   //65408为数据在eeprom中的写入位置,Uint16占2个字节,因此写入2个字节

    testVal = 0;

    i2crom_read(65408, (Uint32) &testVal, 2);

    printf("testVal=%d\n", testVal);

我使用容量64K的eeprom,页大小为128,地址65408为最后一页,不会跨页。

此段代码的运行结果如下:

将一个Uint16类型的变量testVal初始化为375;然后写入EEPROM,写入长度2个字节;

写入操作发生了作用,因为我把整个页读出来,头两个字节确实变了,为(0x77、0xF6);

但是十进制的375应该是(0x177),按照理解写入的头两个字节应该是(0x77、0x01)或者(0x01、0x77)才对;

同时,从EPROM相同位置读2个字节,打印结果却为:testVal=119

即0x77被读出,0xF6没有读出来。

这是什么原因?

EEPROM除了按字节(Uint8)顺序读写外,难道不能以其他数据类型按void* 的方式读写?

哪里有用不同数据类型读写EEPROM的例子?

谢谢!

  • 这个问题的本质是:

    在C5517中,数据类型一个byte有16 bits,而EEPROM一个byte只有8 bits;按字节写入EEPROM时,所有超过8bits的部分都会丢失。

    如果把16个bits写入EEPROM,必须转化成两个独立8 bits依序写。

    然而,一句C5517编译器文档,最小数据类型都为16bits,哪怕是一个char,也是16bits;

    我即使定义了这样的union,写入读取仍然会丢弃高出的8bits:

    union  E2ROM_TEST {
        Uint16  testVal1;
        Uint32  testVal2;
        Uint8  pad[4];
    }  a;

    因为一个类型为Uint8的pad[0]就能代表类型为Uint16的testVal1;当写入一个Uint8时,其高出的8个bits已经丢失了。

    尊敬的TI工程师们,可有好的办法解决这个问题?

    EEPROM读写应该是非常常见的应用啊!!!

  • 我也是用的c5517刚遇到这个问题, 我的qq:598097085   我们一起讨论下

  • 这个论坛越来越水了。TI的工程师们都在睡大觉么!!!我问的两个问题都没能在这里找到正确答案,只能靠自己摸索解决。

    关于C5517读写EEPROM的问题,我用如下方法解决了:

    首先,整片数据读写,如果是char(unsigned char)数组,可以直接写入/读出,这个没有问题;

    虽然C5515/5517的一个char为16bits,写EEPROM只写入低8bits(读出也一样);因为数据当char用也只需要8bits,故而没有问题。

    其他类型(如Uint16、Uint32、float等),必须自己做底层转换成char数组,然后将数组写入EEPROM;读出的时候再从char数组恢复成原类型的值。

    比如Uint16, 需要用char[2]保存、Uint32用char[4]保存;代码示例如下:

    Uint16 val = 375;

    char  pad[2];

    pad[0] = val; //保存val的低8bits

    pad[1] = val>>8;  //保存val的高8bits

    然后可以将pad[2]作为2个字节写入EEPROM。

    从EEPROM读出pad[2]之后,需要反向操作:

    val = pad[0];  //取得val的低8bits

    val += pad[1]<<8;  //取得val的高8bits。

    对于Uint32可以采用类似方法来实现。

    比较麻烦的是float类型,因为无法转换类型。

    我是使用union搞定的,具体如下:

    union f2int32_t {
        float f;
        Uint32 v;
    } fui;

    float fVal = 123.456;

    fui.f = fVal; //把要保存的float值赋给union中的float类型

    然后对union中的Uint32类型做类似操作写入EEPROM;

    读出的时候反向操作,先恢复Uint32的值,并赋给union中的Uint32,然后使用其float成员。