AT24C02:
一个存储器件,保证数据掉电不丢失。使用E^2PROM当作存储介质,通讯接口为IIC总线,容量为256字节。
存储器常常为二者结合共同使用。RAM是掉电丢失,但速度快。ROM是掉电不丢失,但速度较慢。
接线图
I2C总线:
它由两根通信线构成SCL(时钟线)和SDA(数据线),是同步,半双工,带数据应答的一种“通信协议”。
I2C电路规范:
1、所有I2C设备的SCL连在一起,SDA连在一起。
2、所有设备的SCL和SDA均要配置成开漏输出模式,我们常见的IO口引脚常为弱上拉模式,当开关闭合时,直接连接Gnd,输出0,相反,他上面的电阻那边向源器件输入电流,电平为1.
开漏输出:比弱上拉少了一个上拉电阻,因此当开关闭合时,电平为0,原理同上,如果不闭合,由于没有接任何器件,所以极其不稳定,易受外界影响,此时为“浮空”状态,相当于引脚断开。
3、SCL和SDA需各自添加一个上拉电阻(一条线接一个),阻值一般为4.7kΩ左右。
4、开漏输出和上拉电阻是为了解决多机通信互相干扰的问题(因为当对其余设备输出高电平时,相当于线路断开,不会影响所需设备之间的通信)
I2C时序结构 :
时序:按时间顺序发生的电平变化,以及这些变化对通信的意义叫时序
起始条件:SCL高电平期间,SDA给个下降沿
终止条件:SCL高电平期间,SDA给个上升沿
数据有效性:(1)在时钟线为高电平时,SDA线上的数据必须保持稳定,只有当时钟线为低电平时,SDA电平才可以改变。SCL为高电平时表示有效数据,相反为无效数据,此时SDA会进行电平转换,为下次数据表示做准备。(2)在通信时,总线上传输的数据并不都是有效数据,正因为我们有效数据在SCL为高电平时SDA保持稳定,所以区分出开始和停止信号。
发送一个字节:在SCL低电平期间,主机将数据依次放到SDA线上(高位在前),然后拉高SCL,从机会在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环8次便可传送一个字节。
接受一个字节:和发送一样,但变成主机读取,从机发送。
应答:(ACK响应信号)在接收完一个字节后,主机会在下一个时钟发送以为数据,0表示应答,1表示非应答(低电平应答,高电平为应答)。(主机在接受从机发来的应答前,应释放SDA)
IIC.c
#include "regx51.h"
sbit SCL=P2^0;
sbit SDA=P2^1;
void I2C_Start(void)
{
//把他们都设置为高电平,保证无论前面是什么情况都可以让I2C设置开始
SCL=1;
SDA=1;
//设置开始活动
SDA=0;
SCL=0;
}
void I2C_Stop(void)
{
SDA=0;
SCL=1;
SDA=1;
}
void I2C_SendByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=Byte&(0x80>>i);
SCL=1;
SCL=0;
}
}
unsigned char I2C_ReceiveByte(void)
{
unsigned char i,Byte=0x00;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
if(SDA){Byte|=(0x80>>i)}
SCL=0;
}
return Byte;
}
void I2C_SendAck(unsigned char AckBit)
{
SDA=AckBit;
SCL=1;
SCL=0;
}
unsigned char I2C_ReceiveAck(void)
{
unsigned char AckBit=0;
SDA=1;
SCL=1;
AckBit=SDA;
SCL=0;
return AckBit;
}
#include <STC15F2K60S2.H>
#include "IIC.h"
#define AT24C02_ADDRESS 0xA0
void AT24C02_WriteByte(unsigned char Address,Data)
{
IIC_Start();
IIC_SendByte(AT24C02_ADDRESS);
IIC_ReceiveACK();
IIC_SendByte(Address);
IIC_ReceiveACK();
IIC_SendByte(Data);
IIC_ReceiveACK();
IIC_Stop();
}
unsigned char AT24C02_ReadByte(unsigned char Address)
{
unsigned char Data=0x00;
IIC_Start();
IIC_SendByte(0xA0);
IIC_ReceiveACK();
IIC_SendByte(Address);
IIC_ReceiveACK();
IIC_Start();
IIC_SendByte(0xA1);
IIC_ReceiveACK();
Data=IIC_ReceiveByte();
IIC_SendACK(1);
IIC_Stop();
return Data;
}
AT24C02.c
在该at24c02.c文件中,可以看到读数据进at24c02需要传入地址(数据存放在器件的哪个位置),以及要传入的数据。而读出数据需要传入地址即可。
我们先要给单片机传入at24c02的地址,0xA0是地址且是读入操作。而0xA1则是向该器件读出数据的操作符。在读取到传入的数据后,发送应答,结束传送。at24c02是8位存储器,1个地址可存8个字节,如果要存大量数据,建议使用数组传数据,并且每次数据地址为8的倍数。