EEPROM(51单片机)

原理图和数据手册

86327c71b6b047dbb9abdd266afad52c.png

三根线:

  • GND地线
  • SCL为时钟线
  • SDA为数据线

        串行、电平式

        总线式结构:一对多、一个主设备,总线上可以挂上百个器件,用从地址来区分

        主从式:由主设备发起信号,从设备被动响应

        通信速率一般(kbps级别),不适合语音、视频等信息类型

 

at24c02低层时序

e549fb1eb48048308aed3ac583ecba54.png

717df133ccd04173b059f5e9cd983524.png

 

 

START开始信号

        SCL高电平期间,SDA要发生下降沿

//起始信号
void I2C_start()
{
	I2C_SDA = 1;
	I2C_Delay10us();
	I2C_SCL = 1;
	I2C_Delay10us();
	I2C_SDA = 0;//下降沿
	I2C_Delay10us();
	I2C_SCL = 0;
	I2C_Delay10us();
}

STOP停止信号

        SCL高电平期间,SDA要发生上升沿

//结束信号
void I2C_stop()
{
	I2C_SDA = 0;
	I2C_Delay10us();
	I2C_SCL = 1;
	I2C_Delay10us();
	I2C_SDA = 1;//上升沿
	I2C_Delay10us();
	I2C_SCL = 0;
	I2C_Delay10us();
}

传输“0”或应答位(A)

        SCL高电平期间,SDA为“0”

        I2C是从高位开始发送、接收的

        应答:SDA要提前拉高,当cpu在第9个时钟周期读取的时候,发现at24c02给拉低了,就会判断是应答了2178a2710ff74efda7891733e8d010a0.png

//向从设备发送一个字节  ack=1 开启应答, 0关闭应答
unsigned char I2C_sendbyte(unsigned char dat,unsigned char ack)
{
	unsigned char a = 0, b = 0;
	I2C_SCL = 0;
	for(a = 0; a<8; a ++)
	{
		I2C_SDA = dat>>7;
		dat<<=1;
		I2C_Delay10us();
		I2C_SCL = 1;
		I2C_Delay10us();
		I2C_SCL = 0;
		I2C_Delay10us();
	}
	
	I2C_SDA = 1;
	I2C_Delay10us();
	I2C_SCL = 1;
	while(I2C_SDA && (ack == 1))
	{
		b++;
		if(b > 200)//超过200us没有应答
		{
			I2C_SCL = 0;
			I2C_Delay10us();
		}
		return 0;//失败
	}
	I2C_SCL = 0;
	I2C_Delay10us();
	return 1;//成功
}

 

传输“1”或非应答位(/A)

        SCL高电平期间,SDA为“1”

        非应答:SDA要提前置“1”,当cpu在第9个时钟周期读取的时候,发现at24c02还是高电平,就会判断是非应答了

        概念:释放总线(SDA = 1)

  • 发送数据,接收数据都用SDA。当从设备要给主设备发送数据的时候,必须要释放总线;在其他更高级的单片机(如STM32),这里的处理还有些不一样
  • 为什么SDA = 1就释放总线,因为51单片机把引脚拉高之后,从设备还可以把引脚拉低,但是主设备把引脚拉低了,从设备就无法再次拉高。

 

at24c02高层时序

写操作

891c85633d2c4137a947a0f741a9d629.png

start >> 从设备地址 >> 存储地址 >> 数据 >> stop

c368b40ba70f485a9d8f1f5cd4476a7e.png

  1. 从器件的地址是由自身决定的,不同的从器件的地址定义方式不一样,要具体看数据手册
  2. 同一个I2C网络中只有一个主设备,但是从设备可以有多个,这些从设备的地址不能相同(硬件设计师必须保证)

 4926640fa40b48acb46da718b1ecacc7.pngef2cb341988f499f890f292f3cafcac1.png

  • 高4位1010固定,由电路图可知A2 A1 A0接VCC了,均为1
  • 最低位:1是读操作,0是写操作
void AT24C02_write(unsigned char addr,unsigned char dat)
{
	I2C_start();
	I2C_sendbyte(0xae,1);
	I2C_sendbyte(addr,1);
	I2C_sendbyte(dat,0);
	I2C_stop();
}

读操作

立即地址读

cefaf29a6f8d4f36a5f5a2139f518973.png

选择性读

614507d796b540219a121afafe475b12.png

连续读

4e9ce11f8dd9449b90391fb679fec685.png

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值