C51 - IIC读写EEPROM

EEPROM读写

  • 1> 实验目的
    • 1.1> 硬件模型
  • 2> IIC协议
    • 2.1> 写1个字节
    • 2.2> 读1个字节
    • 2.3> 信号分析
      • 2.3.1> 起停信号
      • 2.3.2> 主机写:数据信号
      • 2.3.3> 主机读:数据信号
      • 2.3.4> 应答信号
  • 3> EEPROM-AT24C02
    • 3.1> 硬件原理图
    • 3.2> 引脚功能定义
    • 3.3> 存储器结构24C02
  • 4> AT24C02时序参数
    • 4.1> 400KHz时序参数
    • 4.2> 1000KHz时序参数
  • 5> 程序编写
    • 5.1> 实现功能
    • 5.2> 编程思路
    • 5.3> I2C代码实现
    • 5.4> EEPROM 读写程序
  • 6> 实验波形分析


1> 实验目的

实现51单片机对EEPROM - AT24C02,1字节的读写操作;
通过串口打印到串口终端;

1.1> 硬件模型

C51 - IIC读写EEPROM_第1张图片
IIC总线(Inter-Integrated Circuit)

传输方式:串行;
传输方向:半双工;
同步方式:同步;

速度:
标准模式:100Kbit/s;
快速模式:400Kbit/s;
高速模式:3.4Mbit/s;


2> IIC协议


2.1> 写1个字节

示意图:
C51 - IIC读写EEPROM_第2张图片

波形图:
C51 - IIC读写EEPROM_第3张图片


2.2> 读1个字节

C51 - IIC读写EEPROM_第4张图片

注意:读写控制为,写为“0”,读为1;


2.3> 信号分析

2.3.1> 起停信号

C51 - IIC读写EEPROM_第5张图片

起始信号:SCL高电平期间,SDA产生下降沿,表示开始传输数据;

停止信号:SCL高电平期间,SDA产生上升沿,表示结束传输数据;


2.3.2> 主机写:数据信号

主机写:
C51 - IIC读写EEPROM_第6张图片

【主】机,在SCL每个脉冲低电平期间,向SDA写数据;
在SCL每个脉冲周期的高电平期间,SDA数据保持;
在SCL每个脉冲周期的高电平期间, 【从】机,采样SDA的数据;

从高位到低位传输数据;


2.3.3> 主机读:数据信号

C51 - IIC读写EEPROM_第7张图片

【从】机,在SCL每个脉冲低电平期间,向SDA写数据;
在 SCL每个脉冲周期的高电平期间,SDA数据保持;
在SCL每个脉冲周期的高电平期间,【从】机,采样SDA的数据;

注意:从机写时,主机必须先把SDA置1,释放总线;

从高位到低位传输数据;


2.3.4> 应答信号

C51 - IIC读写EEPROM_第8张图片

主机:SCL高电平期间,向SDA写0应答,写1非应答;
从机:SCL高电平期间,向SDA写0应答,写1非应答;


3> EEPROM-AT24C02

3.1> 硬件原理图

C51 - IIC读写EEPROM_第9张图片


3.2> 引脚功能定义

C51 - IIC读写EEPROM_第10张图片

内部框图:
C51 - IIC读写EEPROM_第11张图片

芯片地址:

C51 - IIC读写EEPROM_第12张图片

高4位固定位“1010”,
A2~A0由外部电路配置,拉高为1,拉低为0;
一个器件时通常都拉低,所以为【1010 000X】;

C51 - IIC读写EEPROM_第13张图片


3.3> 存储器结构24C02

C51 - IIC读写EEPROM_第14张图片

C51 - IIC读写EEPROM_第15张图片

8Byte X 32 X 8bit = 2048bit;
每个字节的地址为 0x00~0xFF;

可以把EEPROM,形象的看为本本;
C51 - IIC读写EEPROM_第16张图片


4> AT24C02时序参数


4.1> 400KHz时序参数

C51 - IIC读写EEPROM_第17张图片

C51 - IIC读写EEPROM_第18张图片

f = 400 000Hz;
T = 1/f = 1/400 000 = 0.0 000 025s
一个周期算下2.5us



4.2> 1000KHz时序参数

C51 - IIC读写EEPROM_第19张图片


C51 - IIC读写EEPROM_第20张图片

写周期最大为5ms


C51 - IIC读写EEPROM_第21张图片



5> 程序编写


5.1> 实现功能

实现对AT24C02,1字节的读写操作模块;
通过串口打印到串口终端;


5.2> 编程思路

参考其他人代码,总结;

C51 - IIC读写EEPROM_第22张图片

1》 实现,启动,停止,读写数据,应答,单个操作代码,然后拼装整个时序;
2》 IIC时序时一层代码,对AT24C02的读写是上一层;


5.3> I2C代码实现

void I2C_Start(void)
{
	I2C_SCL = 0;	// 避免在读的第2阶段产生停止信号;
	I2C_SDA = 1;

	/* I2C bus idle state */
	I2C_SCL = 1;
	Delay_5us();

	/* start */
	I2C_SDA = 0;
	Delay_5us();		
}

void I2C_Stop(void)
{
	I2C_SCL = 0;
	I2C_SDA = 0;
	Delay_5us();

	I2C_SCL = 1;
	Delay_5us();

	I2C_SDA = 1;
	Delay_5us();		
}


void I2C_WriteByte(uchar8_t dat)
{
	uchar8_t i = 0;
	
	for (i = 0; i < 8; i++) {
		I2C_SCL = 0;
		I2C_SDA = dat >> 7;	// MSB -> LSB
		dat = dat << 1;
		Delay_5us();

		I2C_SCL = 1;
		Delay_5us();	
	}		
}


uchar8_t I2C_ReadByte(void)
{
	uchar8_t i = 0;
	uchar8_t dat = 0;

	I2C_SCL = 0;
	I2C_SDA = 1;	

	for (i = 0; i < 8; i++) {
		I2C_SCL = 0;		
		Delay_5us();

		dat <<= 1;			
		dat |= I2C_SDA;
		Delay_5us();

		I2C_SCL = 1;	
		Delay_5us();
	}

	return dat;			
}



uchar8_t I2C_Master_WaitAck(void)
{
	uchar8_t cnt = 0;

 	I2C_SCL = 0;
	I2C_SDA = 1;		// Master release SDA;			
	Delay_5us();

	I2C_SCL = 1;	
			
	while (I2C_SDA) {
		cnt++;

		if ( cnt>200)	 {
			return 1;
		}
	}

	Delay_5us();

 	return 0;
}


void I2C_Master_Ack(void)
{
 	I2C_SCL = 0;
	I2C_SDA = 0;		
	Delay_5us();

	I2C_SCL = 1;
	Delay_5us();
}


void I2C_Master_NAck(void)
{
 	I2C_SCL = 0;
	I2C_SDA = 1;		
	Delay_5us();

	I2C_SCL = 1;
	Delay_5us();
}




5.4> EEPROM 读写程序

void EEPROM_WriteByte(uchar8_t addr,uchar8_t dat)
{
	I2C_Start();
	I2C_WriteByte(0xa0);	// Slave address + write cmd;
	I2C_Master_WaitAck();

	
	I2C_WriteByte(addr);	// Memory address;
	I2C_Master_WaitAck();


	I2C_WriteByte(dat);	// Write data;
	I2C_Master_NAck();
	
	I2C_Stop();
}


uchar8_t EEPROM_ReadByte(uchar8_t addr)
{
	uchar8_t val;

	/* part 1 */
	I2C_Start();
	I2C_WriteByte(0xa0);	// Slave address + write cmd;
	I2C_Master_WaitAck();


	I2C_WriteByte(addr);	// Memory address;
	I2C_Master_WaitAck();

	/* part 2 */
	I2C_Start();
	I2C_WriteByte(0xa1);	// Slave address + Read cmd; 
	I2C_Master_WaitAck();

	val = I2C_ReadByte();	// Read data;
	I2C_Stop();

	return val;	
}


6> 实验波形分析

C51 - IIC读写EEPROM_第23张图片

示波器波形,保存到U盘,在PC中用WFMReader.exe, 分析;

你可能感兴趣的:(单片机-C51,51单片机)