• IIC AT24C02读写数据的一点小体会


    一、写数据

    unsigned char I2CWriteByte(unsigned int mem_addr,unsigned char*DDATAp,unsigned int count)
    { 
     
        u8 i = 0;unsigned int Timer_1ms;
        
        for(i=0;i<count;i++)
        {
                I2cStart2();
                I2cSend2(0xA0); //发送写命令
                WaitAck2();
                I2cSend2(mem_addr+i); //发送写入的地址
                WaitAck2();
          I2cSend2(DDATAp[i]);
          WaitAck2(); 
                I2cStop2(); //发送停止信号
                Timer_1ms=0xFFFF;
           while(Timer_1ms--)
                {
                    __NOP();
        
                }
        }
    }

     

    以上是IIC写数据命令,注意,如果count超过8个,每次写一个字节都需要从I2cStart2()开始,如果从写Address开始循环,数据会出错,因为AT24C02每页有8个字节;

    写数据代码技巧,这是看一个开发板的例子

    const unsigned char cucBit2[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

    void
    I2cSend2(unsigned char ucData2) { unsigned char IIC_i; SDA_Out();//设置为输出 CLR_SCL2(); for (IIC_i=0;IIC_i<8;IIC_i++) { if ( (ucData2 & cucBit2[IIC_i]) != 0) { SET_SDA2(); } else { CLR_SDA2(); } DelayIntr2(2); SET_SCL2(); DelayIntr2(2); CLR_SCL2(); DelayIntr2(2); }; }

    注意ucData2 & cucBit2[IIC_i]一行,这种方式可以代替移位。

    二、读数据

    需要注意,需要两个START信号
    参考http://www.eefocus.com/stm3222/blog/16-10/393817_4e6f0.html

     关于应答与非应答

    非应答就是SDA为高电平.
    i2c传输的要点就是: 传输一个字节 后面必然紧跟一个"响应"信号.这个响应信号可能来自主机,或者是从机,具体是谁,就要看传输方向。
    下文中按照我的个人习惯称呼为 "无应答":传输方向分两种情况(每种情况又有两种可能: A无应答和 B有应答): 1.主机->从机,主机对从机发一个字节之后,主机要读取从机的响应信号(主机读SDA线) A) 主机读SDA为高电平,说明从机无应答
    B) 主机读SDA为低电平,说明从机有应答。2.从机->主机, 主机读取从机一个字节之后,主机要向从机发送一个响应信号(主机写SDA线) A) 主机写SDA为高电平,从机收到主机的无应答信号之后,从机停止传输,等待主机的停止信号。
    B) 主机写SDA为低电平,从机收到主机的应答信号之后,从机继续输出下一字节。
  • 相关阅读:
    我所认识的JavaScript
    谈如何边做事,边提高
    对JavaScript开发中困扰的思考
    Soundex语音算法
    Perl分割字符串的一个精妙的写法
    Perl深拷贝
    Git diff hash顺序的问题
    perl命令行批量修改文件内容
    IOS写文件
    删除Linux乱码文件
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8496367.html
Copyright © 2020-2023  润新知