zoukankan      html  css  js  c++  java
  • 【项目】----RTC DS1307 I2C

    看见一个不错的帖子

    Copy过来

    1、协议简介(SCL由主机提供)

    开始信号(START):在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,时钟线(SCL)置低

    停止信号(STOP):在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,时钟线(SCL)置低

    收从机应答:将数据线(SDA)置高,时钟线(SCL)变低-->变高-->变低,判断数据线(SDA)的电平:低为有应答,高位无应答

    主机发应答(ACK):将数据线(SDA)置低,时钟线(SCL)变低-->变高-->变低,将SDA置高

    主机发不应答(NACK):将数据线(SDA)置高,时钟线(SCL)变低-->变高-->变低

    注:以上每个步骤操作完都需确保时钟线(SCL)为低电平(STOP除外)

        另外在数据操作过程中,时钟线(SCL)为高电平时间不允许数据线(SDA)有改变,否则会被认为是START或STOP

    在时钟线(SCL)的上升沿读数据(每8bit为一组,高位在前)

    在时钟线(SCL)的下降沿写数据(每8bit为一组,高位在前)

    2、24系列EEPROM简介

    24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit

    工作电压(VCC):

       24CXX:    4.5V-5.5V

       24CXX-W: 2.5V-5.5V

       24CXX-R: 1.8V-5.5V

    输入电平定义(VIH,VIL):

       VIH:0.7VCC-VCC+1

       VIL:-0.45V-0.3VCC

    地址脚:

       24C01/24C02 三个地址脚(E0,E1,E2)都有效,24C04只有E2,E1有效,24C08只有E2有效,24C16三个地址脚都无效,如下图所示,所谓地址脚无 效是指不需要接入电路中(NC ,not connected),其对应的地址位要用来表示要操作的字节的高位地址。

      24C32/24C64三个地址脚都有效;

      24C128/24C256/24C512的地址脚E1和E0有效,其余为NC;

      24C1024的地址脚E1有效,其余为NC

    器件地址:

       当总线上连接多个I2C器件时,需要对器件进行寻址。器件地址如下表所示,其中E2,E1,E0是指三个引脚的状态,取决于是接地还是接高电平,R/W为1则为读操作,为0则为写操作。A8,A9,A10,A16指的是所要操作的字节地址的高位,后面会提到。

       芯片              bit7  bit6  bit5  bit4  bit3  bit2  bit1   bit0

       24C01/02            1     0     1     0     E2    E1   E0    R/W

       24C04               1     0     1     0     E2    E1   A8    R/W

       24C08               1     0     1     0     E2    A9   A8    R/W

       24C16               1     0     1     0     A10   A9   A8    R/W

       24C32/64            1     0     1     0     E2    E1   E0    R/W

       24C128/256/512      1     0     1     0     0     E1   E0    R/W

       24C1024             1     0     1     0     0     E1   A16   R/W

    字节地址:

       在对芯片内的某一字节或一连续地址进行读写操作时,需要制定其地址或首字节的地址,不同芯片地址有不同的表示方式,如下表所示,其中有些芯片的地址位的高位存储在器件地址中。

      芯片                地址位数                 地址范围

      24C01               bit7-bit0                0x00-0x7F

      24C02               bit7-bit0                0x00-0xFF

      24C04               A8,bit7-bit0             0x00-0x1FF

      24C08               A9,A8,bit7-bit0          0x00-0x3FF

      24C16               A10,A9,A8,bit7-bit0      0x00-0x7FF

      24C32               bit15-bit8,bit7-bit0    0x00-0xFFF

      24C64               bit15-bit8,bit7-bit0    0x00-0x1FFF

      24C128              bit15-bit8,bit7-bit0    0x00-0x3FFF

      24C256              bit15-bit8,bit7-bit0    0x00-0x7FFF

      24C512              bit15-bit8,bit7-bit0    0x00-0xFFFF

      24C1024             A16,bit15-bit8,bit7-bit0 0x00-0x1FFFF

    3、读写操作流程(具体可参见这两款芯片的datasheet)

    24C02:


    随机读1个字节:START-->发送器件地址(写)-->收ACK-->发需读取数据的地址-->收ACK-->START-->
                              发送器件地址(读)-->ACK-->接收数据-->发NACK-->STOP

    当前地址读一个字节:START-->发送器件地址(读)-->ACK-->接收数据-->发NACK-->STOP

    随机写一个字节:START-->发送器件地址(写)-->收ACK-->发需写数据的地址-->收ACK-->写数据-->
                                收ACK-->STOP

    页写:START-->发送器件地址(写)-->收ACK-->发需写数据的地址-->收ACK-->写数据-->收ACK-->
              写数据-->收ACK-->......-->写数据-->收ACK-->STOP
           (注:24C02一次只能页写1~8个字节,且页写首地址必须为页的首地址;

                      另外随机写或页写完都需查询器件是否空闲,才能进行下面的操作)

    连续读:START-->发送器件地址(写)-->收ACK-->发需读取数据的地址-->收ACK-->START-->
                  发送器件地址(读)-->收ACK-->接收数据-->发ACK-->接收数据-->发ACK-->......-->
                 接收数据-->发NACK-->STOP

              (注:连续读不受字节数限制,但地址越界会返回到00地址,并重新累加)

    24C512:

    随机读1个字节:START-->发送器件地址(写)-->收ACK-->发需读取数据的地址高字节-->收ACK-->

                             发需读取数据的地址低字节-->收ACK-->START-->发送器件地址(读)-->ACK-->接收数据

                             -->发NACK-->STOP

    当前地址读一个字节:START-->发送器件地址(读)-->ACK-->接收数据-->发NACK-->STOP

    随机写一个字节:START-->发送器件地址(写)-->收ACK-->发需写数据的地址高字节-->收ACK

                               -->发需读取数据的地址低字节-->收ACK-->写数据-->收ACK-->STOP

    页写:START-->发送器件地址(写)-->收ACK-->发需写数据的首地址高字节-->收ACK-->发需写数据的地址低字节-->收ACK

              -->写数据-->收ACK-->写数据-->收ACK-->......-->写数据-->收ACK-->STOP
           (注:24C02一次只能页写1~64个字节,且页写首地址必须为页的首地址;

                      另外随机写或页写完都需查询器件是否空闲,才能进行下面的操作)

    连续读:START-->发送器件地址(写)-->收ACK-->发需读取数据的首地址高字节-->收ACK

                 -->发需读取数据的首地址低字节-->收ACK-->START-->发送器件地址(读)-->收ACK

                 -->接收数据-->发ACK-->接收数据-->发ACK-->......-->接收数据-->发NACK-->STOP

              (注:连续读不受字节数限制,但地址越界会返回到00地址,并重新累加)

    4、硬件操作说明

    51单片机:

             P0口:外面需加10K~100K上拉电阻;

                       对端口置1输出高;

                       对端口置0输出低;

                       读取时先将数据端口置高,再读取。

             其它口:不用加上拉电阻,操作同上

    其它带方向选择I/O的单片机:

            不带上拉电阻的I/O:外接10K~100K上拉,将端口锁存器置0;

                                            将端口设置为输入口就可以输出高(由于上拉电阻作用);
                                            将端口设置为输出口就可以输出低;

                                            读取时,先将数据端口设为输入口再读取。

             带上拉电阻的I/O:不用上拉电阻,操作同上

  • 相关阅读:
    03014_properties配置文件
    Python 文件I/O
    Python面向对象
    Python CGI编程
    Python正则表达式
    Python使用SMTP发送邮件
    python操作mysql数据库
    Python多线程
    python XML解析
    给傻瓜用的SP2010开发--第一部分--理解SP开发平台--第一章节--理解SP促销讨论(2)--追踪SP源头
  • 原文地址:https://www.cnblogs.com/wangyuezhuiyi/p/3286606.html
Copyright © 2011-2022 走看看