51单片机IIC时序详细分析并驱动EEPROM存储方案应用------day9

本文详细介绍了51单片机使用IIC总线驱动EEPROM进行数据存储的方法,包括不同类型的存储器件特性、IIC总线的优势、硬件原理、起始和停止信号的生成,以及写入和读取数据的流程。同时,提供了具体的函数实现示例,如写入和读取EEPROM数据的函数。

51单片机IIC驱动EEPROM存储方案应用------day9
1.常见存储器件: 铁电, E2PROM, FLASH。
共同特点: 掉电后数据不丢失
各自特点:
铁电: 理论上可以无限次擦写, 操作简单, 但是容量小。
E2PROM: 理论上擦写次数在30W到100W的不等,操作简单, 容量中等。 应用: 考勤机。
FLASH: 理论上擦写次数在10W到100W不等, 容量很大, 但操作较复杂, 若要改变一个字节就要改变整个扇区。 STC单片机的EEPROM是由FLASH模拟的。
2.IIC总线
I2C总线最主要的优点是其简单性和有效性。 由于接口直接在组件之上, 因此I2C总线占用的空间非常小, 减少了电路板的空间和芯片管脚的数量, 降低了互联成本。 I2C总线的另一个优点是, 它支持多主机, 其中任何能够进行发送和接收的设备都可以成为主机。 一个主控能够控制信号的传输和时钟频率。当然, 在任何时间点上只能有一个主机。
2、 I2C总线是由数据线SDA和时钟SCL构成的串行总线, 可发送和接收数据。 各种I2C均并联在这条总线上, 但就像电话机一样只有拨通各自的号码才能工作, 所以每个电路和模块都有唯一的地址。
3.硬件原理图:
在这里插入图片描述
WP为高电平时只能读不能写,防止误写。
WR为低电平时可读可写。
4.I2C的起始和停止
起始信号:SCL线为高电平期间, SDA线由高电平向低电平的变化表示起始信号;
停止条件:SCL线为高电平期间, SDA线由低电平向高电平的变化表示终止信号。
SCL是主裁判, SDA是副裁判。
在这里插入图片描述

//SCL为高电平时SDA由高电平变为低电平表示IIC开始信号
void I2C_Start_Fun(void)
{
   
   
	I2C_SDA_DA = 1;    //SDA置高
	Delay_I2C();      // 延时子程序
	I2C_SCL_CK = 1;		//SCL置高
	Delay_I2C();  // 延时子程序
	I2C_SDA_DA = 0;	  //SDA置低
	Delay_I2C();  // 延时子程序
	I2C_SCL_CK = 0;	
}
//SCL为高电平期间SDA由低电平变为高电平为停止信号
void I2C_Stop_Fu(void)
{
   
   
	I2C_SCL_CK = 0;
    Delay_I2C();
	I2C_SDA_DA = 0;
	Delay_I2C();
	I2C_SCL_CK = 1;
	Delay_I2C();
	I2C_SDA_DA = 1;
	Delay_I2C();
}

IIC数据传输:
SCL为高电平期间, 数据线上的数据必须保持稳定, 只有SCL信号为低电平期间SDA状态才允许变化
在这里插入图片描述
I2C与UART不同的地方首先在于先传高位, 后传送低位。 UART先传低位后传高位
UART发送时序如下图:低位在前
在这里插入图片描述
I2C先传高位后传低位时序如下图所示:
在这里插入图片描述
主机写数据时, 每发送一个字节, 接收机需要回复一个应答位“0”, 通过应答位来判断从机是否接收成功
主机读数据时, 接收一个字节结束后, 主机也需要发送一应答位“0”, 但是当接收最后一个字节结束后, 则需发送一个非应答位(应答位取反)“1”, 发完了1后, 再发一个停止信号, 最终结束通信。

写数据流程:
首先I2C起始信号, 然后发送首字节, 即器件( EEPROM)地址。并且在读写方向位上选择“ 写操作” 方向。 (0xa0) <哪一个芯片>
第二个字节, 发送数据的存储地址, 就是要读取的数据所存
储在EEPROM中的位置。 <存在芯片的哪个位置>
第三个字节, 发送要存储的数据第一个字节, 第二个字
节……
在写数据的过程中, 都要等待EEPROM返回一个“ 应答位” 。
EEPROM的地址根据电路的A2A1A0决定,接地为0.高电平为1
最后一位R/W为读写位,读为1,写为0
故:写地址为0xa0 1010 0000
读地址为0xa1 1010 0001
在这里插入图片描述
在这里插入图片描述

/*****************************************************************************
** 函数名称:write_eeprom
** 功能描述:读取EEPROM数据函数(可多片共存)
** 输    入:E2中目的地址addr
** 输    出:读取的数据
******************************************************************************/
void write_eeprom(uchar addr, uchar databyte)
{
   
   
	I2C_Start_Fun();
	I2C_Write_Data(0xa0);		//<哪一个芯片>
	I2C_Write_Data(addr);		//	<存在芯片的哪个位置>
	I2C_Write_Data(databyte);
	I2C_Stop_Fu();				//停止位

}
/*****************************************************************************
** 函数名称:I2C_Write_Data
** 功能描述:向I2C总线发送一个字节数据,并检测应答
** 输    入:待发送字节byte
** 输    出:无
** 全局变量:无
** 调用模块:Delay_I2C()
** 可移植性:直接移植
******************************************************************************/
void I2C_Write_Data(uchar Byte)
{
   
   
	uchar mask;
	uchar i;
	uchar j;

	mask = 0x80;
	for(i = 0; i < 8; i++)      //发送8位数据
	{
   
   
		I2C_SCL_CK = 0;     	//SCL为低电平时才允许SDA数据变化
		Delay_I2C();			//延时,保证时序稳定
		if((mask & Byte) == 0)	//1000 0000 &Byte 设Byte=95H 1000 0000& 1001 0101   如果最高位为0则SDA发送0 如果最高位为1则发送SDA为高
		{
   
   
			I2C_SDA_DA = 0;
		}
		else
		{
   
   
			I2C_SDA_DA = 1;
		}
		mask >>= 1;  //0x40   0100 0000&1001 0101
		Delay_I2C();
		I2C_SCL_CK = 1;  //拉高保持数据
		Delay_I2C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工程师之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值