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