6447|3

76

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于IIC写入EEPROM的问题 [复制链接]

这段程序完成了利用IIC写入EEPROM的任务,先是写入IIC slave的地址,然后写入EEPROM的地址,最后写入data。但是,写入EEPROM的地址这段没看懂,照这样不能写入我要求写入的地址,实际运行中这段程序却是可以完成写入EEPROM的功能的,求大家指教下!代码如下:
void EEPROM_WRITE_WORD(Uint16 address, Uint16 data)
{
    Uint16 para_temp0, para_temp1, eeprom_waitcount;
        int romaddr=0;

    romaddr = MDB2ROMADDR(address);
    if(romaddr == -1) return;
    address = (Uint16)romaddr;
    eeprom_waitcount = 0;

    while(eeprom_waitcount < 20)
    {
        ServiceDog(); //KickDog();
        eeprom_waitcount++;

        STARTE2PROM();
        para_temp0 = 0x0a0; //;GET read ctrl byte 0xa0
        para_temp1 = EEPROM_WRITE_BYTE(para_temp0);
        if(para_temp1 == 0)
        {
            //;--->>---写地址字节
            para_temp0 = address >> 7;
            EEPROM_WRITE_BYTE(para_temp0 &0xff); //;Write Address to EEPROM

            para_temp0 = ((address << 1) &0xfe);
            EEPROM_WRITE_BYTE(para_temp0 &0xff); //;Write Address to EEPROM

            WRITEE2PROMAWORD(data); ////;Write DATA to EEPROM
            ENDE2PROM();
            gSysFaultMessage.bit.InvEEpromFault = 0;   //V1.07
            sub_ErrCode_delete(234);
            return ;

        }
    }
    gSysFaultMessage.bit.InvEEpromFault = 1; //V1.07
    error_code = ErrCode_EepromRWErr;
        EepromWriteErr++;
    //;--->>---写地址字节
    para_temp0 = address >> 7;
    EEPROM_WRITE_BYTE(para_temp0 &0xff); //;Write Address to EEPROM

    para_temp0 = ((address << 1) &0xfe);
    EEPROM_WRITE_BYTE(para_temp0 &0xff); //;Write Address to EEPROM
    WRITEE2PROMAWORD(data); //;Write DATA to EEPROM
    ENDE2PROM();
    return ;
}


Uint16 EEPROM_WRITE_BYTE(Uint16 data)
{
    Uint16 para_temp0, para_temp1, para_temp2, para_temp3;
    para_temp0 = (data << 8) &0xff00;

    for(para_temp2 = 0; para_temp2 < 1; para_temp2++)
    //;OUTER LOOP COUNTER
    {
        for(para_temp1 = 0; para_temp1 < 8; para_temp1++)
        //;INNER LOOP COUNTER
        {
            scl_low; //SCL=0
            DELAY_US(TLOW);

            if(para_temp0 &0x8000)
            {
                //;--->>---SDA=1 -------->>
                sda_high;
                EALLOW;
                GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; // GPIO32 = output
                EDIS;
                sda_high;
            }
            else
            {
                //;--->>---SDA=0 -------->>
                sda_low;
                EALLOW;
                GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; // GPIO32 = output
                EDIS;
                sda_low;
            }

            DELAY_US(2);

            scl_high; //SCL=1
            DELAY_US(THIGH);

            para_temp0 = para_temp0 << 1;
        }


        scl_low; //SCL=0
        DELAY_US(TFALL);

        EALLOW;
        GpioCtrlRegs.GPBDIR.bit.GPIO32 = 0; // GPIO32 = input
        EDIS;
        DELAY_US(TLOW);

        scl_high; //SCL=1
        DELAY_US(THIGH);

        para_temp3 = GpioDataRegs.GPBDAT.bit.GPIO32; //;ACK BACKUP

        scl_low; //SCL=0
        DELAY_US(TFALL);

        sda_high;
        EALLOW;
        GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; // GPIO32 = output
        EDIS;
        sda_high;
        DELAY_US(TLOW);
    }
    return (para_temp3);
}

最新回复

学习下  详情 回复 发表于 2018-4-28 16:48
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
没有人出来讨论下吗?
 
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
结贴,已经明白了
 
 
 

回复

182

帖子

0

TA的资源

禁止发言

4
 
学习下
个人签名嘉立创PCB打样  QQ800058452
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表