打印

EEPROM数据存储大量数据问题求解@50分相赠

[复制链接]
2969|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mei326|  楼主 | 2012-5-10 17:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
typedef struct STORA{
    volatile  U8  gnumb[5];   
    volatile  U16 gprice;     
    volatile  U8  gcapas;   
    volatile  U8  gsurps;     
    volatile  U32 sellsum;   
    volatile  U32 sellnum;           
   volatile U8 egroup;                                                                                               
}storge;
struct STORA STORAGE[128];

如上,一个结构体数组,现在要把这个结构体的所有成员数据保存到24LC64中,要能实现整体读写(写入24LC64再读回来),单个成员读写,所以元素的某一成员读写。

请问各位大虾有什么好的办法实现!

我现在的问题是出现某个元素读取回来的全部为0xFF    疑惑~~~~~~期待

相关帖子

沙发
mei326|  楼主 | 2012-5-10 23:01 | 只看该作者
void IIC_send_str(U8 deviceaddr,U16 wordaddr, void *dataddr,U16 size)
{
        U8 i;
    unsigned  char *paddr;
//       
        paddr = dataddr;       
       
        WP_EEP = 0;
        StartIIC();
        WriteByte(deviceaddr);
        ACK_IIC();
        if(deviceaddr != RTC_ADDR){
            WriteByte(wordaddr >> 8);
            ACK_IIC();       
        }
        WriteByte(wordaddr);
        ACK_IIC();
        for (i=0; i<size; i++)
        {
                WriteByte(*paddr);
            paddr++;
                ACK_IIC();
        }
        StopIIC();
        WP_EEP = 1;
}

void IIC_seqreceive_str(U8 deviceaddr,U16 wordaddr, void *rcvaddr,U16 size)
{
        U8 i;
    unsigned char *pdr;
       
        pdr = rcvaddr;
       
        StartIIC();
        WriteByte(deviceaddr); //发送器件地址,即DEVICE ADDRESS。
        ACK_IIC();
        if(deviceaddr != RTC_ADDR){
            WriteByte(wordaddr >> 8); //发送字地址hige,即WORD ADDRESS。
            ACK_IIC();       
    }
        WriteByte(wordaddr); //发送字地址low,即WORD ADDRESS。
        ACK_IIC();
        StartIIC(); //重新启动总线。
        WriteByte(deviceaddr + 1); //发送读命令和器件地址DEVICE ADDRESS。
        ACK_IIC();
        for (i=0; i<size-1; i++)
        {
                *pdr = Readbyte();
            pdr ++;
                ACK_IIC();
                SDA_IIC=1;
        }
        *pdr = Readbyte();
        NOACK_IIC();
        StopIIC();
}

void WriEpStorageInf(U8 mode)
{
    U8 i,leng=0;
   
    for (i=0; i<STORAGE_NUM; i++)
    {
        if(mode==S_ALL){            
            IIC_send_str(EEP1_ADDR,(STORAGE_PAGE+i)*32,
                &STORAGE[i],sizeof(STORAGE[i]));
        }               
    }
}
void RdEpStorageInf(void)
{
    U8 i;
    U8 bbf[32]={0};
    for (i=0; i<128; i++)
    {                       
        IIC_seqreceive_str(EEP1_ADDR,(STORAGE_PAGE+i)*32,
            &STORAGE[i],sizeof(STORAGE[i]));    }
}

自己顶!!!!!!!!!!!!!附上自己的代码~供大伙拍砖@@@
感觉思路没问题!不过实际调试出现若干数据有误!纳闷~~~~~~~~~
不知是否指针访问的方式有漏洞还是~~~~~~

使用特权

评论回复
板凳
forgot| | 2012-5-11 08:35 | 只看该作者
这....

使用特权

评论回复
地板
yewuyi| | 2012-5-11 09:40 | 只看该作者
这有啥疑惑的,最简单的做法,再定义一个无符号单字节数组,数组的长度等于这个结构体变量的总长度,然后把这个数组和这个结构体构成联合体,然后想整体读写EEPROM的时候,直接用数组来操作即可。

单个结构体成员的读写,你只要按照上面的办法都搞成联合,再弄对地址,何难之有?

使用特权

评论回复
5
yewuyi| | 2012-5-11 09:40 | 只看该作者
要打两下屁股了,这可是基本的C语言知识。

使用特权

评论回复
6
mei326|  楼主 | 2012-5-11 10:00 | 只看该作者
ye的方法着实可行~不过我使用void指针直接操作结构体,何必再开辟一个数组呢?这一个结构数组就占了2K+的RAM了。我单片机总共才4K不到的RAM~

使用特权

评论回复
7
yewuyi| | 2012-5-11 14:03 | 只看该作者
ye的方法着实可行~不过我使用void指针直接操作结构体,何必再开辟一个数组呢?这一个结构数组就占了2K+的RAM了。我单片机总共才4K不到的RAM~
mei326 发表于 2012-5-11 10:00


你理解错了吧,这个数组和你的结构体组成的是联合体,空间是完全重叠的,不会多占用RAM的,你可要弄明白了哦。

使用特权

评论回复
8
yewuyi| | 2012-5-11 14:05 | 只看该作者
ye的方法着实可行~不过我使用void指针直接操作结构体,何必再开辟一个数组呢?这一个结构数组就占了2K+的RAM了。我单片机总共才4K不到的RAM~
mei326 发表于 2012-5-11 10:00


用结构体和数组形成的联合,好处就是清晰明了,偏于移植,不容易犯错,但用强制类型转换的话,则。。。

所以,俺是明确建议使用联合体解决此类问题。

使用特权

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

本版积分规则

个人签名:与其等待机会,不如主动出击...

117

主题

764

帖子

2

粉丝