51之AT24C02

本文详细介绍了AT24C02作为非易失性存储器,如何通过I2C总线进行数据通信,涉及I2C接口的连接方式、电路规范、时序结构以及C语言编程示例,展示了如何在单片机上操作AT24C02进行数据读写。
摘要由CSDN通过智能技术生成

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的倍数。

        

  • 43
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值