【项目】----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:不用上拉电阻,操作同上

posted @ 2013-08-28 10:16  望月追忆  阅读(1946)  评论(0编辑  收藏  举报